标题:请教合并问题...
只看楼主
haroldi
Rank: 1
等 级:新手上路
帖 子:158
专家分:0
注 册:2006-7-22
 问题点数:0 回复次数:15 
请教合并问题...
请教各位:这个合并怎么错了啊?
LinkList Merge(LinkList La,LinkList Lb)
{
LinkList p,q,s=La;
s->data = La->data + Lb->data;
p = La->next; q = Lb->next;
while(p && q)
{
if(p->data <= q->data)
{
s->next = p;
s = p;
p = p->next;
}
else
{
s->next = q;
s = q;
q = q->next;
}
}
s->next = p?p:q;
// Free(Lb); //这句加上就死循环,,,不知什么原因??(Free函数正常)
return La;
}
搜索更多相关主题的帖子: next data LinkList 
2006-09-05 09:37
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 


前面的没看
但至少有一点,Free()函数的用法错了.
Free()是用来释放指针或者单个结点的,你让它释放一整个链表,当然会出问题拉

我的征途是星辰大海
2006-09-05 10:01
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 

稍微看了下问题还真多

我的征途是星辰大海
2006-09-05 10:02
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
得分:0 
以下是引用haroldi在2006-9-5 9:37:51的发言:
请教各位:这个合并怎么错了啊?
LinkList Merge(LinkList La,LinkList Lb)
{
LinkList p,q,s=La;
// s不是新链表,它指向的是La,对他的任何操作都会改变La,实际上不要s 也行
s->data = La->data + Lb->data;
//这个等式不正确, 位置也不对,这句应该在循环中,而且这句与后面的语句有矛盾,到底是将一个链表插入另一个链表,还是将相同位置的值相加成为另一个链表,题目的要求是什么,希望楼主说清楚些
p = La->next; q = Lb->next;
while(p && q)
{
if(p->data <= q->data)
{
s->next = p;
s = p;
p = p->next;
}
else
{
s->next = q;
s = q;
q = q->next;
}
}
s->next = p?p:q;
// Free(Lb);
return La;
}

[此贴子已经被作者于2006-9-5 10:27:47编辑过]


我的征途是星辰大海
2006-09-05 10:09
haroldi
Rank: 1
等 级:新手上路
帖 子:158
专家分:0
注 册:2006-7-22
得分:0 

我是学习单链表操作,,,在合并上总出错,原理看了好多次,也查看了一些网上的解答,
可一做就出问题.请问应该怎样编写好.(是不是C的基础差啊)
......
#define SIZE sizeof(LinkList)
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkList;

.......

int main(void)
{
LinkList *sa,*sb;
sa = Creat_L(sa);
sb = Creat_L(sb);
printf("合并:\n");
sa = Merge(sa,sb);
Disp(sa);
Free(sa);
return 0;
}

LinkList *Creat_L(LinkList *L)
{
int ip = 0; //统计结点数量;
LinkList *p,*s;
if(!(L = (LinkList *)malloc(SIZE))) {printf("\n\tOut of Memory!\n"); return 0;}
L->next = NULL;
p = L;
printf("输入:");
if(!(s = (LinkList *)malloc(SIZE))) {printf("\n\tOut of Memory!\n"); return 0;}
while(scanf("%d",&s->data)==1)
{
++ ip;
s->next = NULL;
p->next = s;
p = s;
if(!(s = (LinkList *)malloc(SIZE))) {printf("\n\tOut of Memory!\n"); return 0;}
}
L->data = ip; //结点数量放入头结点;
while(getchar()!='\n') continue;
printf("\t创建完成。\n");
return L;
}

LinkList *Merge(LinkList *La,LinkList *Lb)
{
LinkList *p,*q,*s=La;
s->data = La->data + Lb->data; //将结点和放回La头结点;
p = La->next; q = Lb->next;
while(p && q)
{
if(p->data <= q->data)
{
s->next = p;
s = p;
if(p->data == q->data) q = q->next;
p = p->next;
}
else
{
s->next = q;
s = q;
q = q->next;
}
s->next = NULL;
}
s->next = p?p:q;
Free(Lb); //这个出错,不知什么问题,好象函数调用有问题?屏蔽就能通过.
return La;
}

int Disp(LinkList *L)
{
LinkList *p;
if(L->data == 0) {printf("\n这个是空链表。\n");return 0;}
else printf("有 %2d 个结点。",L->data);
p = L->next;
while(p->next)
{
printf("%3d ->",p->data);
p = p->next;
}
printf("%3d 。\n",p->data);
printf("\t显示完成。\n");
return 0;
}

void Free(LinkList *L)
{
int f = 0;
LinkList *p;
p = L;
while(p)
{
L = L->next;
free(p);
p = L;
++ f;
}
if(f) printf("\t删除完成。(含表头)共删除 %d 个。\n",f);
}


Do people want thick road ...
2006-09-05 10:55
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 

/*合并有序链表,参考一下*/
#include<stdio.h>
#define NULL 0
typedef int datatype;
typedef struct hlink{
datatype info;
struct hlink *next;
}node;
typedef node* nodelink;

nodelink tbuildhlink() /*带头节点的尾插法*/
{

datatype x;
node *head,*s;
node *p2;
head=(node *)malloc(sizeof(node));
p2=head;
printf("please input the datas:");
scanf("%d",&x);
while(x!=0)
{s=(node *)malloc(sizeof(node));
s->info=x;
p2->next=s;
p2=s;
scanf("%d",&x);
}
if(p2) p2->next=NULL;
return(head);
}

/*输出带头节点的单链表的值*/
void printtlink(nodelink head)
{ node *p;
p=head->next;
if(!p) printf("\nthe hlink is empty!");
else
{ printf("\nthe value of the hlink is:\n");
while(p)
{ printf("%5d--->",p->info);
p=p->next;
}
}
printf("\n");
}

nodelink link_head12(nodelink head1,nodelink head2)/*让head1和head2的数排序*/
{ nodelink q,head3,s,p;
head3=(nodelink)malloc(sizeof(node));/*建head3表*/
head3->next=NULL;
q=NULL;
s=head1->next;
p=head2->next;
while(p&&s) /*排序*/
{ if(s->info<p->info)
{ q=s->next;
s->next=head3->next;
head3->next=s;
s=q;
}
else
{ q=p->next;
p->next=head3->next;
head3->next=p;
p=q;
}
}
if(s)
{
while(s->next!=NULL)
{ q=s;
s->next=head3->next;
head3->next=s;
s=q->next;
}
s->next=head3->next;
head3->next=s;
}
else
{ while(p->next!=NULL)
{ q=p;
p->next=head3->next;
head3->next=p;
p=q->next;
}
p->next=head3->next;
head3->next=p;
}
return head3;
}

main()
{ nodelink head1,head2,head3;
head1=tbuildhlink();
head2=tbuildhlink();
printtlink(head1);
printf("\n");
printtlink(head2);
printf("\n");
head3=link_head12(head1,head2);/*让head1和head2的数排序*/
printtlink(head3);
printf("\n");
getch();
}


倚天照海花无数,流水高山心自知。
2006-09-05 12:47
haroldi
Rank: 1
等 级:新手上路
帖 子:158
专家分:0
注 册:2006-7-22
得分:0 
多谢两位!!

Free()出错是怎么回事呢?

Do people want thick road ...
2006-09-05 13:39
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 

因为你释放了头结点,导致其后的结点找不到.


倚天照海花无数,流水高山心自知。
2006-09-06 16:48
haroldi
Rank: 1
等 级:新手上路
帖 子:158
专家分:0
注 册:2006-7-22
得分:0 
还是不太明白,我调用的是Free()子程序,不是free()啊,
是不是哪儿有冲突呢?

我看了以前的帖子说:释放应该在打印里释放.
[URL=http://www.bc-cn.net/bbs/dispbbs.asp?BoardID=179&ID=72911&star=100][/URL]

那我就在程序结束前释放好了...

Do people want thick road ...
2006-09-06 20:51
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
Free()都把整个链表释放掉了,你后面的操作怎么成立?

倚天照海花无数,流水高山心自知。
2006-09-06 23:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-88124-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.665273 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved