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 : ''

首先你要弄清楚头文件.h的作用,头文件是为调用者提供函数调用时使用的数据结构定义以及函数原型的,头文件中只应该有数据结构、宏定义、函数原型,不应该包括函数实现。所以initialize这个函数的实现应该放到对应的.c文件中,否则多个源文件引用这个头文件后将导致连接器进行连接时发现initialize函数定义重复。
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,为啥程序老报错?的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版)严蔚敏->单链表的定义及合并两个有序单链表

C语言版链表的实现

链表选择排序的C语言算法实现

C语言链表写法,练习链表

C语言中数据结构中的单向链表的问题;

ubuntu下如何编译C语言