请问链表加入一个节点,为什么第一种方式没有成功,第一种方式要怎么修改才行?第二种方式可以
#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;
}
第一种方式中最后一句改为:
obj->next=p;
根据你的代码可以看出,是要在单链表的尾部加入节点。
//第一种方式
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;// 一般不这样做 创建节点的时候就会进行初始化操作 更安全一些
}
如果有对链表操作的更多指导,可以联系我哦