请教链表加入 节点为什么没成功 20C

请问链表加入一个节点,为什么第一种方式没有成功,第一种方式要怎么修改才行?第二种方式可以
#include
#include
#include
struct Student
{
int id;
char name[20];
Student *next;
};
Student m_head={0} ;

//第一种方式
void add(Student *obj)
{
Student *p=m_head.next;
while(p)
{
p=p->next;
}
p=obj;
obj->next=NULL;
}

//第二种方式
//void add(Student *obj)
//{
// Student *p=&m_head;
// while(p->next)
// {
// p=p->next;
// }
// p->next=obj;
// obj->next=NULL;
//}
int main()
{
Student *obj=(Student *)malloc(sizeof(Student));
obj->id=1;
strcpy(obj->name,"yang");
add(obj);
return 0;
}

5个回答

第一种方式中最后一句改为:
obj->next=p;

SeaTalks
SeaTalks 看见楼下的分析了,正如他说的,我就不写了
大约 2 年之前 回复
SeaTalks
SeaTalks 回复doubleyangjie: sorry, 看错了。你想要添加的是obj是吧,那应该这么写:
大约 2 年之前 回复
doubleyangjie
doubleyangjie 不行的哈,这样修改也没能添加成功哈
大约 2 年之前 回复

根据你的代码可以看出,是要在单链表的尾部加入节点。
//第一种方式
void add(Student *obj)
{
Student *p=m_head.next;//获取链表头指向的下一个节点,此时为NULL
// p为NULL 直接跳出循环
while(p)
{
p=p->next;
}
// p为NULL
p=obj;//p又指向插入的节点obj
obj->next=NULL;//设置插入节点的下一个节点为空 obj.next = NULL
}

你这个方式是错误的,一般链表的操作不是这样的。你可以参考我的博文:
快慢指针在链表中应用:http://blog.csdn.net/liebert/article/details/76691397

第二种方式
void add(Student *obj)
{
Student *p=&m_head;//获取链表头指针

 // 循环查找单链表最后一个节点
 while(p->next)
 {
    p=p->next;
 }
 // 循环结束后 p指向单链表最后一个节点
 p->next=obj;// 让p(单链表最后一个节点)的下一个节点指向obj
 //obj->next=NULL;// 一般不这样做 创建节点的时候就会进行初始化操作 更安全一些

}

如果有对链表操作的更多指导,可以联系我哦

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!