C语言如何组合如下几个文件?linklist.h,linklist.c,linlistMain.c,为啥程序老报错?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何组合如下几个文件?linklist.h,linklist.c,linlistMain.c,为啥程序老报错?相关的知识,希望对你有一定的参考价值。
我有三个文件linklist.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#define SUCCESS 0
#define FAIL 1
#include <stdio.h>
#include <malloc.h>
//函数原型
typedef struct node
int elem;
struct node * p;
node,*linklist;
//链表初始化
int initialize(linklist *l)
*l = (linklist)malloc(sizeof(node));
(*l)->p =NULL;
return 0;
//头插法建立单链表
void createFromHead(linklist l);
//尾插法建立单链表
void createFromEnd(linklist l);
#endif;
第二个文件实现linklist.c,主要实现createfromhead,代码如下
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include "linkedlist.h"
#endif;
void createFromHead(linklist l)
node *s;
char c;
int flag=1;
while (flag)
c=getchar();
if ('$'!=c)
s =(node*)malloc(sizeof(node));
s->elem=c;
s->p = l->p;
l->p = s;
else
flag = 0;
第三个文件,main函数入口,linklistMain.c
#include "linkedlist.h"
linklist callInit();
int main()
linklist linkedlist =0;
linkedlist = callInit();
if (linkedlist)
printf("initialize the linklist done");
return SUCCESS;
else
printf("initialize the linklist terminate");
return FAIL;
createFromHead(linkedlist);
return 0;
linklist callInit()
linklist l=0;
initialize(&l);
return l;
为什么总报错,按照这样的资源组合方式不行吗? 请高手们指点
d:\ccppworkspace\linklist\linkedlist.c(5) : error C2146: syntax error : missing ')' before identifier 'l'
d:\ccppworkspace\linklist\linkedlist.c(5) : error C2061: syntax error : identifier 'l'
d:\ccppworkspace\linklist\linkedlist.c(5) : error C2059: syntax error : ';'
d:\ccppworkspace\linklist\linkedlist.c(5) : error C2059: syntax error : ')'
d:\ccppworkspace\linklist\linkedlist.c(6) : error C2449: found '' at file scope (missing function header?)
d:\ccppworkspace\linklist\linkedlist.c(22) : error C2059: syntax error : ''
linkedlist.h内容应该为如下表述
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#define SUCCESS 0 //宏定义
#define FAIL 1 //宏定义
#include <stdio.h>
#include <malloc.h>
//数据结构定义
typedef struct node
int elem;
struct node * p;
node,*linklist;
//头插法建立单链表函数原型
void createFromHead(linklist l);
//尾插法建立单链表函数原型
void createFromEnd(linklist l);
#endif //注意预处理语句不能使用分号结束
linkedlist.c提供具体的函数实现,这里又涉及到#ifndef XXX_H #define XXX_H #endif预处理语句的功能,这部分语句起到哨兵监察的作用,防止头文件被重复包含造成数据结构和函数定义重复,翻译成自然语言就是如果没有定义XXX_H,就定义XXX_H这个符号。如果你已经include了XXX_H,则编译器会发现XXX_H这个符号已经被定义了,所以#ifndef XXX_H和成对的#endif之间的语句就不会再被处理了。你的链表实现文件中只引用了一个linkedlist.h所以上述警戒预处理指令没有必要存在,实现文件如下
#include "linkedlist.h"
//链表初始化
int initialize(linklist *l)
*l = (linklist)malloc(sizeof(node));
(*l)->p =NULL;
return 0;
void createFromHead(linklist l)
node *s;
char c;
int flag=1;
while (flag)
c=getchar();
if ('$'!=c)
s =(node*)malloc(sizeof(node));
s->elem=c;
s->p = l->p;
l->p = s;
else
flag = 0;
// createFromEnd这个函数将来实现也要放在这个.c文件中
你的main函数不用修改
在linux环境下编译程序时使用gcc -Wall -o testlinkedlist linkedlist.c linkedlistMain.c
生成的可执行程序名字叫testlinkedlist 参考技术A linklist.h
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#define SUCCESS 0
#define FAIL 1
//函数原型
typedef struct node
int elem;
struct node * p;
node,*linklist;
int initialize(linklist *l);
linklist callInit();
//头插法建立单链表
void createFromHead(linklist l);
//尾插法建立单链表
void createFromEnd(linklist l);
#endif;
linklist.c
//#include <stdio.h>
#include <malloc.h>
#include "linklist.h"
linklist l=0; //定义为全局变量
int initialize(linklist *l)
*l = (linklist)malloc(sizeof(node));
(*l)->p =NULL;
return 0;
void createFromHead(linklist l)
node *s;
char c;
int flag=1;
while (flag)
c=getchar();
if ('$'!=c)
s =(node*)malloc(sizeof(node));
s->elem=c;
s->p = l->p;
l->p = s;
else
flag = 0;
linklist callInit()
initialize(&l);
return l;
main函数入口,linklistMain.c
#include "linkedlist.h"//如果报错multy defined 就去掉这行
#include <stdio.h>
int main()
linklist linkedlist =0;
linkedlist = callInit();
if (linkedlist)
printf("initialize the linklist done");
return SUCCESS;
else
printf("initialize the linklist terminate");
return FAIL;
createFromHead(linkedlist);
return 0;
参考技术B linklist.c中
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include "linkedlist.h"
#endif;
四行改为
#include "linkedlist.h"
以上是关于C语言如何组合如下几个文件?linklist.h,linklist.c,linlistMain.c,为啥程序老报错?的主要内容,如果未能解决你的问题,请参考以下文章