一个挺长的关于链表的C语言程序。好回答还加分!

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define N 10
typedef struct node
{char name[20];
struct node *link;
}stud;
stud * create(int n)
{
stud *p,*h,*s;
int i;
if((h=(stud *)malloc(sizeof(stud)))==NULL)
{printf("分配内存空间失败!");
exit(0);
}
h->name[0]='';
h->link=NULL;
p=h;
for(i=0;i<n;i++)
{if((s=(stud *)malloc(sizeof(stud)))==NULL)
{printf("分配空间失败!");
exit(0);
}
p->link=s;
printf("请输入第%d个人的名字",i+1);
scanf("%s",s->name);
s->link=NULL;
p=s;
}
return(h);
}
stud * search(stud *h,char *x)
{stud *p;
char *y;
p=h->link;
while(p!=NULL)
{y=p->name;
if(strcmp(y,x)==0)
return(p);
else p=p->link;
}
if(p==NULL)
printf("未能找到该数据!");
}
void main()
{int number;
char fullname[20];
stud *head,*searchpoint;
number=N;
head=create(number);
printf("请输入要查找的人的姓名:");
scanf("%s",fullname);
searchpoint=search(head,fullname);
}
1.我不明白这个程序为什么使用那么多的*p,*h,*s 指来指去的;
2.stu * create()这里为什么* 不是和create连在一起的?
3.typedef struct node里面怎么又有一个struct node *link?
4.调试结果是exit(0)错误:error C2065: 'exit' : undeclared identifier。为什么这样?我是从书上COPY的。

我的指针学的还可以,但是就是看不懂为什么动态链表会是这样写,谁能帮我理解这个程序的至少可以再加30分,谢谢!

2  stu * create()  creat e是带回一个指针的函数,该指针指向STU数据  

   stu (* create)() creat e是指向函数的指针,该函数返回一个STU值

   判断是返回是什么型的值就看return后面跟了什么型的变量,才决定函数的类型。

3    一个节点包括数据域和指针域 ,链表的数据结构,必须利用指针变量才能实现。只要

保证降下一个节点的地址放到前一个节点的成员link中即可。从这也可以看出链表与数组存取数据

的不同。这里是很灵活的,指针要在实际的数据结构中才能真正的体现出强大,这也是C语言的精华所在,难学的地方。

4   这个可能是编译器的问题 ,不是有错。像在TC中编译只发现#include<malloc.h>错误,并没有你说的错误,删掉就正确,可能是TC不支持这个库函数。我查了下书,ANSI标准建议在"stdlib.h"头文件中包含有关信息,但许多C编译要求用"malloc.h"而不是"stdlib.h"。这个要多上机去调试。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-12
1:h是用来指示链表头,最后返回的也是这个表头,p、s这两个指针用的是有点繁琐,其实稍加改动用一个指针就可以了,它的意思其实很明显,就是p指向最后创建的结点,s指向新结点,新结点创建完了,使p->link = s,这样s就被加入了链表,完了p = s 就是更新一下设置新结点为最后创建的结点。
2:create函数返回的是一个stu *类型的指针,假设create函数返回的是int型,那么写为int create,也不是写为intcreate,函数头的习惯写法就是要求返回类型和函数名之间有空格,写成stu *create也是可以的
3:这个怎么说呢,就是个蛋生鸡和鸡生蛋的问题,不好解释,c语言里就是这样用的,这样说吧,c语言编译时,
typedef struct node
{char name[20];
struct node *link;
}stud;
在读到stud;这行之前,并不能将struct node理解为一个新类型stud,所以只能用struct node来指示该结构
4:加上头文件声明#include <stdlib.h>
最后不要尽信书,尽信书不如无书
第2个回答  2011-06-12
首先讲链表的使用
程序中用的到了三个指针,作用分别是这样的,一个始终指向头结点,一个始终指向尾节点,还一个是活动结点,用来向链表中添加数据
结点就是像结构体一样的,里面由多个数据组成

2.stu * create()这里为什么* 不是和create连在一起的?
这个连在一起和不在一起都一样
主要作用是函数返回的是指针

3.typedef struct node里面怎么又有一个struct node *link?
为什么里面还有指针,因为这是链表的使用规则,这个没什么道理的,就像是游戏规则
你把教材关于结点的介绍看看就懂了

4.调试结果是exit(0)错误:error C2065: 'exit' : undeclared identifier。
这个问题是缺少头文件#include<process.h>本回答被提问者采纳
第3个回答  2011-06-13
第一。。有那么多指针指来指去并不是无效的,每个指针都保存的是链表操作的几个关键位置。以免出现一次操作完成以后有野指针或者没有指针指向的野地址。
第二。。可以写在一起也可以不写在一起,没有什么关系。。不过最好在一段程序里面统一写法。
第三。。链表的基本就是一个data域一个指针域。指针域就是本链表节点类型的指针。这个是规则。正因为这个*link的指针域才使这个数据结构实现的。就像你放风筝一样,除了风筝还需要一根线一样。
第四。。头文件。#include <stdlib.h>;
第4个回答  2011-06-12
1,2,3回答省略...第四个问题的解决方法是:在头文件里面加一个#include <stdlib.h>;
相似回答