C语言编写插入节点的函数(悬赏100分)

来源:百度知道 编辑:UC知道 时间:2024/07/02 16:29:43
我需要编写一段程序要求合并2个循环链表.现在主体没有问题,就是当2个链表的第一个数据一样时,合成后的链表就会删除第一个数据.感觉问题出在了插入结点那里,指针有问题,自己检出不出来,麻烦达人看下.非常感谢!!!
#include<stdio.h> //预编译命令
struct list//定义结构体
{
int num;
list*next;
};
list*head,*end; //定义全局变量

list*creat()//创建链表的函数
{
list*p=NULL;
list*q=NULL;
head=NULL;
int num;
scanf("%d",&num);
while(num!=0)
{
p=new list; //开辟空间
p->num=num;
if(head==NULL)
head=p;
else
q->next=p;
q=p;
scanf("%d",&num);
}
end=q; //将链表的结尾最后一个结点赋给end
end->next=head; //让最后一个结点的的下个结点的地址不为空而指向头指针
return(head);
}

void insert(list*pHead,list*pNode) //插入接点的函数
{
list*q,*r;
//第一种情况,链表为空
if(pHead==NULL)
{
pHead=pNode; //链表头指向pNode
return; //完成插入操作,返回
}

//第二种情况,pNode结点num的值小于dengyu链表头结点num的值
//则将pNode的值插到链表

我晕。。。。,貌似就算两个链表的第一个数不相等,你也会少了第一个节点。god
你的最后打印语句跳过了第一个节点。。。,你怎么不用你合并链表的写法呢?让q=r,然后用do{}while()打印吧
补充:
void main() //主函数
{
list*list1,*list2,*r,*q;
list1=creat(); //调用创建链表的函数

list2=creat(); //调用创建链表的函数
r=together(list1,list2); //调用合并两个链表的函数
q=r;
do
{
printf("%d ",q->num);
q=q->next;
}while(q!=r) ;

}
另外其他人说的你的insert会造成循环链不再循环是有道理的,你的第二种情况,没有把新的head和旧的tail连起来,return前加个tail->next=head吧

if(pNode->num<=pHead->num)
{
pNode->next=pHead;
pHead=pNode;
return;
}
这里有问题,需要把尾节点指向pNode,所以要先找到尾节点
if(pNode->num<=pHead->num)
{
list *tail=pHead;
while(tail->next != pHead) tail = tail->next;
pNode->next=pHead;
pHead=pNode;
tail->next = pHead;
return;
}

这个程序有两个主要问题
1. void insert(list*pHead,list*pNode)因为是按值传递的 pHead值,所以不能改变pHead的值,改为按地址传递,list** pHead