创建链表的问题,(红字部分为不清楚的)请指导
#define NULL 0
#define TYPE struct stu
#define LEN sizeof (struct stu)
struct stu
{
int num;
int age;
struct stu *next;
};
TYPE *creat(int n)
{
struct stu *head,*pf,*pb;
int i;
for(i=0;i<n;i++)
{
pb=(TYPE*) malloc(LEN);
printf("input Number and Age\n");
scanf("%d%d",&pb->num,&pb->age);
if(i==0)
pf=head=pb;
else pf->next=pb;
pb->next=NULL;
pf=pb;
}
return(head);
}
书上的程序如以上,我的疑问点有如下:
一:当n=1(一个结点),i=0时,系统先分配一个stu结构长度的空间,并输入num,age值,并将pf,head,pb等指针变量全部指向同一个stu,即一个结点。
二:当n=2(两个结点),循环i=0时同(一),当i=1时,系统又分配了一个stu结构长度的空间,并输入num,age值(那么这不是覆盖了第一次i=0时的输入数据么?),同时,pf->next指向pb,pb->next指向空值,但最后一句pf=pb不是又使两个指针变量等同了么?pf->next与pf所对应的地址完全都一样了啊?,而且最后一个return(head)是什么意思呢?返回什么呢?
刚学到这里,有很多不明白,恳请指导!
[解决办法]
首先你的else我觉得应该是这样的
else{
pf->next = pb;
pb->next = NULL;
pf = pb;
}
我来分析一下,i = 0时,开辟第一个新节点,pf,head,pb都指向这个新节点,注意head之后一直没变,所以后来return的时候把这个位置返回了,也就是头指针
i=1的时候,又开一个节点,这时候pf成为了这个新节点的前一个节点也就是这样
pf---->pb---->null
之后pf又指向了pb,这是在更新pf的值,为下一个循环准备,至此结果是
pf---->
------>新节点---->NULL
pb---->
所以在i=2执行之后应该是这样的
pf--->
head---->节点1--->节点2--->节点3--->NULL
pb--->