请指点一下关于链表和指针的问题
最近在学链表和指针,还做了学生证管理程序,就是用的链表和指针。其中有很多不理解的,希望可以知道原因。。。one *addrecord(one *p) /* 输入一组记录,添加到链表中 *p是一开始定义的一个空指针 */
{
one head, *q; /*head是一个one结构体,one结构体最后是一个*next指针,*q是这个自定义函数声明的一个指针*/
head.next = p; /*p移动到head这个one结构体的最后那个*next指针的位置*/
p = &head; /*将head的地址赋给指针*p 为什么,为什么p先要指向head那个结构体的末尾的那个指针,/*之后又要指向head的地址?为什么要这样做,这样做的意义在于?我试着把这一句和上面一句改了一下直接写p=&head或者*p=head都是可以编译可以构建但是运行就报错,这又是为啥?*/
while (p->next!=NULL) /* 将当前指针移动到链表尾端 */
p = p->next; /*这一句似乎又产生了一个one结构体,因为p指针在链表尾端又向后移动了一个next指针*/
while(1) {
char text[80];
q = (one *)malloc(sizeof(one)); /*请求分配一个one结构体的内存*/
if (q==NULL)
return head.next; /*分配不了就回头指针(是head这个one结构体的最后那个next指针。。。为什么是返回这里?刚才不是把head的地址赋值给p了吗,为什么不返回head而是返回head.next?*/
q->next = NULL;
printf("\n\n输入姓名 学号 班级 (用空格分隔): ");
gets(text); /* 读取一行文本 */
if (text[0]=='\0') break; /* 空行为结束标志 */
sscanf(text, "%s%s%s", q->name,q->no,q->classes); /* 分解名称和电话号码 */
p->next = q; /* 在链表尾端添加结点 */
p = q; /* 更新当前指针 这是请求成功之后的操作,大概能懂,不直接写p是因为当初用q才能请求分配内存。。。应该是这样*/
}
return head.next; /*分配不了就回头指针(是head这个one结构体的最后那个next指针。。。*/
}
void display (one *p) /* 显示所有记录信息 */
{
printf("\n姓名\t\t学号\t\t班级\n");
for (; p!=NULL; p=p->next)
printf("%-10s\t%-10s\t%-10s\n", p->name, p->no,p->classes);
printf("\n");
}
这个比上一个好懂多了,不为空指针就显示。。。而且也不需要在加一个one结构体head,为什么呢,我是说为什么刚才链表添加数据需要加一个head结构体呢。。。
啥都不会好苦恼啊。。。。。。