C语言链表尾插法建立,非常需要大家帮忙?
我在做一个非常令人纠结的事,便是用C语言的数据结构。。。下面的一个尾插法,由于还是一个小白,正在努力学习,于是自己写的代码运行出现了问题,我非常想知道为什么是这样的原因。...
我在做一个非常令人纠结的事,便是用C语言的数据结构。。。下面的一个尾插法,由于还是一个小白,正在努力学习,于是自己写的代码运行出现了问题,我非常想知道为什么是这样的原因。我已经想了一个上午都没看出来。下面是代码,感谢大家的帮忙协助,万分万分感谢!!请见下面代码图片
展开
1个回答
展开全部
你的代码看着不太习惯……而且……按说应该自己报错才对……
先说我觉得的核心:
addnode函数里,你while循环终止时,t是指向Null的,然后t直接就被指向了一个新开的空间,和你前面的链表完全没有联系……
改进:
1,加的时候应该判断一下,因为你建立头指针的时候,如果还没有元素,这个add的位置就应该是l->Next=(lnode *)malloc(sizeof(lnode)),如果已经有元素,那么需要找到末尾的那个元素(也就是t->Next==Null),然后是t->Next=(lnode *)malloc(sizeof(lnode))
也就是按你目前改的话,addnode中需要:
void addnode(linklist *l, int x){
if((*l)->count==0)
{
(*l)->next=(lnode *)malloc(sizeof(lnode));
(*l)->next->NULL;
(*l)->data=x;
(*l)->count++;
return;
}
lnode *t=l->next;
while(t->next!=NULL) t=t->next;
t->next=(lnode*)malloc(sizeof(lnode));//一定先开启空间,有了下一个节点的地址,再指过去,不能t已经到空了,让t=,那是直接把t挪走,而不是让链表连接起来了
t->next->next=NULL;
t->next->data=x;
(*l)->count++;
return;
}
其实更建议定义一个新的函数叫创建节点,应该能让程序更清晰
lnode* createNode(int data)
{
lnode* node=(lnode*)malloc(sizeof(lnode));
node->data=data;
node->next=NULL;
return node;
}
这样的话,你的添加节点应该能更好理解,代码我不写了,逻辑为:
添加节点(链表l,数值x){
如果头指针下没有元素
{头指针下的元素指向一个新创建的元素(*l)->next=createNode(x);
头指针元素计数加1;
返回
}
声明新的节点指针t;
如果t不是最后一个元素(这里务必注意:条件应是t->next==NULL,而不是t==NULL),让t指向其下一个节点并循环;
t的下一个节点指向一个新创建的指针(t->next=createNode(x);
l的计数加一;
}
PS:
linklist在声明的时候已经定义成了headnode的指针,为什么在初始化时候要(*l)=...呢?
l=(linklist *)malloc(sizeof(headnode))应该就好了吧,目的是开一个空间,并让l指过去
先说我觉得的核心:
addnode函数里,你while循环终止时,t是指向Null的,然后t直接就被指向了一个新开的空间,和你前面的链表完全没有联系……
改进:
1,加的时候应该判断一下,因为你建立头指针的时候,如果还没有元素,这个add的位置就应该是l->Next=(lnode *)malloc(sizeof(lnode)),如果已经有元素,那么需要找到末尾的那个元素(也就是t->Next==Null),然后是t->Next=(lnode *)malloc(sizeof(lnode))
也就是按你目前改的话,addnode中需要:
void addnode(linklist *l, int x){
if((*l)->count==0)
{
(*l)->next=(lnode *)malloc(sizeof(lnode));
(*l)->next->NULL;
(*l)->data=x;
(*l)->count++;
return;
}
lnode *t=l->next;
while(t->next!=NULL) t=t->next;
t->next=(lnode*)malloc(sizeof(lnode));//一定先开启空间,有了下一个节点的地址,再指过去,不能t已经到空了,让t=,那是直接把t挪走,而不是让链表连接起来了
t->next->next=NULL;
t->next->data=x;
(*l)->count++;
return;
}
其实更建议定义一个新的函数叫创建节点,应该能让程序更清晰
lnode* createNode(int data)
{
lnode* node=(lnode*)malloc(sizeof(lnode));
node->data=data;
node->next=NULL;
return node;
}
这样的话,你的添加节点应该能更好理解,代码我不写了,逻辑为:
添加节点(链表l,数值x){
如果头指针下没有元素
{头指针下的元素指向一个新创建的元素(*l)->next=createNode(x);
头指针元素计数加1;
返回
}
声明新的节点指针t;
如果t不是最后一个元素(这里务必注意:条件应是t->next==NULL,而不是t==NULL),让t指向其下一个节点并循环;
t的下一个节点指向一个新创建的指针(t->next=createNode(x);
l的计数加一;
}
PS:
linklist在声明的时候已经定义成了headnode的指针,为什么在初始化时候要(*l)=...呢?
l=(linklist *)malloc(sizeof(headnode))应该就好了吧,目的是开一个空间,并让l指过去
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询