C语言实现的合并两个单链表的程序,高手帮忙看下错在哪儿了呢?

设X={x1,x2,...,xn}和Y={y1,y2,...ym}为两个单链表,试写出将X和Y归并为一个单链表的算法,使得:Z={x1,y1,x2,y2,...,xn,y... 设X={x1,x2,...,xn}和Y={y1,y2,...ym}为两个单链表,试写出将X和Y归并为一个单链表的算法,使得:
Z={x1,y1,x2,y2,...,xn,yn,xm+1,...xn} (m<n)

#include<stdio.h>
typedef struct node
{char x;struct node* next;}s;
s* s_create(s* h)
{
s *p,*head;char ch;
head=(s*)malloc(sizeof(s));
head->next=NULL;
scanf("%c",&ch);
while(ch!='\0') {p=(s*)malloc(sizeof(s));
p->char=ch;p->next=head->next;
head->next=p;
scanf("%c",&ch);}
return head;
}

void s_union(s* head1,s* head2)
{s *p=head1->next,*q=head2->next,*r=head1;
while(p!=NULL&&q!=NULL) {r->next=p;q->next=p->next;p->next=q;r=r->next;
q=q->next;p=p->next;}
if(p!=NULL) {r->next=p;}
else {r->next=q;}

void printf_s(*head)
{s *p=head->next;
while(p) {printf("%c",p->ch;p=p->next;);}}

main()
{
s *head1,head2;
head1=s_create(head1);
head2=s_create(head2);
printf_s(head1);
printf_s(head2);
s_union(head1,head2);
printf_s(head1);
}高手帮忙看下,错在哪儿了呢?本人穷,分给少了,不好意思!
展开
 我来答
strawman_dxj
2011-09-07 · 超过45用户采纳过TA的回答
知道小有建树答主
回答量:80
采纳率:0%
帮助的人:72.5万
展开全部
/*错的地方还不少,主要有以下几点
1.使用malloc函数没有包含其头文件。
2.s_union最后缺个“}”。
3. printf_s函数里面printf("%c",p->ch;p=p->next;);应改为printf("%c",p->ch);p=p->next;
4.某些地方s对象的成员x写成了其他字符串。
以上是语法错误,还存在编译不报错的逻辑错误,如下
5.s_union合并算法错误。
6. s_create采用链表前插法,这样得到的字符序列与输入相反。
此外还有一些其他编写不太好的地方,一并修正,得到如下结果
*/
#include<stdio.h>
#include<malloc.h>

typedef struct node
{char x;node* next;}s;

s* s_create(int* length)
{
s *p,*head,*tail;
char ch;
head=tail=(s*)malloc(sizeof(s));
head->next=NULL;
scanf("%c",&ch);
(*length)++;
while(ch!='\n')
{
p=(s*)malloc(sizeof(s));
p->x=ch;
p->next=NULL;
tail=tail->next=p;
(*length)++;
scanf("%c",&ch);
}
return head;
}

void s_union(s* head1,s* head2)
{
s *p=head1->next,*q=head2->next,*temp1,*temp2;
while(q!=NULL)
{
temp1=p->next;
temp2=q->next;
p->next=q;
p=q->next=temp1;
q=temp2;
}
}

void printf_s(s* head)
{
s *p=head->next;
while(p){printf("%c",p->x);p=p->next;}
printf("\n");
}

int main()
{
s *head1,*head2;
int length1=0,length2=0;
head1=s_create(&length1);
head2=s_create(&length2);
printf_s(head1);
printf_s(head2);
if(length1>length2)s_union(head1,head2);
else s_union(head2,head1);
printf_s(head1);
return 0;
}
追问
呵呵,看看结果是什么啊?
还有,为什么判断条件不能是ch!='\0'呢,字符'\0'不就是0吗?
追答
不好意思,main函数出了点小问题,改正如下
int main()
{
s *head1,*head2;
int length1=0,length2=0;
head1=s_create(&length1);
head2=s_create(&length2);
printf_s(head1);
printf_s(head2);
if(length1>length2)
{
s_union(head1,head2);
printf_s(head1);
}
else
{
s_union(head2,head1);
printf_s(head2);
}
return 0;
}
字符'\0'不是'0',而是一个转义字符,一般用在字符串结尾标志字符串的结束,是无法从输入获得的,要以0结尾的话应该写成'0'
TableDI
2024-07-18 广告
在上海悉息信息科技有限公司,我们深知Excel在数据处理中的重要作用。在Excel中引用不同工作表(sheet)的数据是常见的操作,这有助于整合和分析跨多个工作表的信息。通过在工作表名称前加上感叹号“!”,您可以轻松地引用其他工作表中的数据... 点击进入详情页
本回答由TableDI提供
无病呻吟2010
2011-09-07 · TA获得超过963个赞
知道小有建树答主
回答量:527
采纳率:0%
帮助的人:574万
展开全部
在下面这段函数中好像根本没有用到 h这个变量啊,但从整体来看应该要用到吧,还有注意s *head1,head2;这一行的初始化问题
s* s_create(s* h)
{
s *p,*head;char ch;
head=(s*)malloc(sizeof(s));
head->next=NULL;
scanf("%c",&ch);
while(ch!='\0') {p=(s*)malloc(sizeof(s));
p->char=ch;p->next=head->next;
head->next=p;
scanf("%c",&ch);}
return head;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户26488
2011-09-09 · TA获得超过283个赞
知道答主
回答量:427
采纳率:0%
帮助的人:84.3万
展开全部
node *mergelink(node *p, node *q)
{
node *h, *r;
h = (node*) malloc (sizeof(node));
h->next = NULL;
r = h;
while (p != NULL && q != NULL)
{
if (p->data <= q->data)
{
r->next = p;
r = p;
p = p->next;
}
else
{
r->next = q;
r = q;
q = q->next;
}
}

if (p == NULL)
r->next = q;
if (q == NULL)
r->next = p;

p = h->next;
h = h->next;
free(p);
return h;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式