单链表 合并(Merge) 问题,在线中。。。

hzc543806053 2011-10-03 04:07:44
#include "stdio.h"
#include<stdlib.h>
//#include<malloc.h>

typedef struct node
{
int date ;
struct node *next ;
}Lnode;

Lnode *creater (int m) //创建链表
{
int i ;
Lnode *head , *p , *q ;

head = p =( Lnode *) malloc (sizeof (Lnode)) ;
p->next = NULL ;

for ( i=0 ; i < m ; i++ )
{
q = ( Lnode *) malloc (sizeof (Lnode)) ;
printf ("输入第 %d 个数的值: ",i+1);
scanf ( "%d", &q->date ) ;

if ( i == 0)
p = head = q ;
else
{
p->next = q ;
p = q ;
}

}
q->next = NULL ;

return head ;
}


Lnode *Merge (Lnode *La ,Lnode *Lb ) //合并两个链表
{
Lnode *Lc ,*pa ,*pb ,*pc ,*ptr ;

Lc = La ;
pc = La ;
pa = La->next ;
pb = Lb->next ;

while ( pa != NULL && pb != NULL )
{
if (pa->date < pb->date )
{
pc->next = pa ;
pc = pa ;
pa = pa->next ;
}

if (pa->date > pb->date )
{
pc->next = pb ;
pc = pb ;
pb = pb->next ;
}

if (pa->date == pb->date )
{
pc->next = pa ;
pc = pa ;
pa = pa->next ;

ptr = pb ;
pb = pb->next ;
free ( ptr );
}
}
if ( pa != NULL )
pc->next =pa ;
else
pc->next = pb ;

free ( Lb ) ;

return Lc ;
}



void print ( Lnode *head )
{
int i ;
Lnode *p ;

printf ("\n输出结果 :\n\n") ;
p = head ;
for ( i = 1 ; p != NULL ; i++ )
{
printf ("第 %d 个值 :%d \n", i , p->date ) ;
p = p->next ;
}
}


main()
{
int i, j ;
Lnode *k ,*b ,*c;

printf ("请输入: 链表1,要录入数据的个数: ") ; //创建链表
scanf ("%d",&i ) ;
k = creater ( i ) ;
print ( k );

printf ("请输入: 链表2,要录入数据的个数: ") ; //创建链表
scanf ("%d",&j ) ;
b = creater ( j ) ;
print ( b );

c = Merge ( k , b); //链表合并
printf("合并:\n");
print ( c) ;
free ( c ) ;
}



为什么运行到输出合并后的链表时,却输不出 并提示“内存出错”。
还要对程序怎样修改呢?先谢谢各位大牛!!
...全文
154 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
_了凡_ 2011-10-03
  • 打赏
  • 举报
回复
楼主你确定有仔细看4楼的程序了,在看看吧,你说的是形式不同(但效果一样),
看看creater()这个函数吧。
逻辑问题。
hzc543806053 2011-10-03
  • 打赏
  • 举报
回复
为什么这样写会出现内存错误:
if (pa->date < pb->date )
...
if(pa->date > pb->date )
...
if(pa->date == pb->date )
...



而这样就可以正常运行:
if (pa->date < pb->date )
...
else if(pa->date > pb->date )
...
else
...


这两者写出的程序看上去效果一样,但前者运行时出错,请问是啥原因???谢谢!!!
houzhenghui123 2011-10-03
  • 打赏
  • 举报
回复
帮你改了下!

#include "stdio.h"
#include<stdlib.h>
//#include<malloc.h>

typedef struct node
{
int date ;
struct node *next ;
}Lnode;

Lnode *creater (int m) //创建链表
{
int i ;
Lnode *head , *p , *q ;

head = p =( Lnode *) malloc (sizeof (Lnode)) ;
p->next = NULL ;

for ( i=0 ; i < m ; i++ )
{
q = ( Lnode *) malloc (sizeof (Lnode)) ;
printf ("输入第 %d 个数的值: ",i+1);
scanf ( "%d", &q->date ) ;

if ( i == 0)
{
head->next = q;
p = q;
}
else
{
p->next = q ;
p = q ;
}

}
p->next = NULL;

return head ;
}


Lnode *Merge (Lnode *La ,Lnode *Lb ) //合并两个链表
{
Lnode *Lc ,*pa ,*pb ,*pc ,*ptr ;

Lc = La ;
pc = La ;
pa = La->next ;
pb = Lb->next ;

while ( pa != NULL && pb != NULL )
{
if (pa->date < pb->date )
{
pc->next = pa ;
pc = pa ;
pa = pa->next ;
}

else if (pa->date > pb->date )
{
pc->next = pb ;
pc = pb ;
pb = pb->next ;
}

else if (pa->date == pb->date )
{
pc->next = pa ;
pc = pa ;
pa = pa->next ;

ptr = pb ;
pb = pb->next ;
free ( ptr );
}
}
if ( pa != NULL )
pc->next =pa ;
else
pc->next = pb ;

free ( Lb ) ;

return Lc ;
}



void print ( Lnode *head )
{
int i ;
Lnode *p ;

printf ("\n输出结果 :\n\n") ;
p = head ->next;
for ( i = 1 ; p != NULL ; i++ )
{
printf ("第 %d 个值 :%d \n", i , p->date ) ;
p = p->next ;
}
}


main()
{
int i, j ;
Lnode *k ,*b ,*c;

printf ("请输入: 链表1,要录入数据的个数: ") ; //创建链表
scanf ("%d",&i ) ;
k = creater ( i ) ;
print ( k );

printf ("请输入: 链表2,要录入数据的个数: ") ; //创建链表
scanf ("%d",&j ) ;
b = creater ( j ) ;
print ( b );

c = Merge ( k , b); //链表合并
printf("合并:\n");
print ( c) ;
free ( c ) ;
}
尘缘udbwcso 2011-10-03
  • 打赏
  • 举报
回复

//建立两个有序链表,合并此两链表成为新链表后依然有序.
#include<stdio.h>
#include<malloc.h>
typedef int ElemType;
typedef struct stu
{
ElemType data;
struct stu *next;
}NodeType, *LinkType;

/*
*功能:创建链表(带头结点,尾插法)
*返回值:链表首地址
*
*/
LinkType CreatOrderList()
{
LinkType head, p1, p2;
p1 = (LinkType)malloc(sizeof(NodeType));
head = p1;
while (p1->data != 0)//默认链表中data!=0,当data=0时链表结束
{
p2 = p1;
p1 = (LinkType)malloc(sizeof(NodeType));
scanf("%d", &p1->data);
p2->next = p1;
}
p2->next = NULL;
free(p1);
return head;
}

/*
*功能:输出链表
*参数:链表首地址
*/
void Output(LinkType head)
{
head = head->next;
while (head != NULL)
{
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}

/*
*功能:合并链表
*参数:两个链表首地址
*返回值:合并后链表的首地址
*/
LinkType Mergelink(LinkType La, LinkType Lb)
{
LinkType Lc, HeadC;
HeadC = La;
Lc = HeadC;
La = La->next;
Lb = Lb->next;
while (La && Lb)
{
if (La->data > Lb->data)//将data较小的连接到Lc
{
Lc->next = Lb;
Lb = Lb->next;
}
else
{
Lc->next = La;
La = La->next;
}
Lc = Lc->next;
}
Lc->next = La ? La : Lb;//将La 或 Lb剩下的部分连接到Lc
return HeadC;
}


int main()
{
LinkType HeadA, HeadB, HeadC;

printf("Input first link:\n");
HeadA = CreatOrderList();

printf("Input second link:\n");
HeadB = CreatOrderList();

printf("\n");

HeadC = Mergelink(HeadA,HeadB);
printf("After merger:\n");
Output(HeadC);
return 0;
}


以前写的
paolochristian 2011-10-03
  • 打赏
  • 举报
回复
if (pa->date < pb->date )
...
else if(pa->date > pb->date )
...
else if(pa->date == pb->date )
...
  • 打赏
  • 举报
回复
内存错误,是因为你没有初始化你的内存,比如malloc一个节点,最好的办法是把其内存清零

因为你没清零,所以next指向一个无效值

下面是代码不会出现内存错误,但是算法问题还是你自己解决

#include "stdio.h"
#include<stdlib.h>
#include <string.h>
//#include<malloc.h>

typedef struct node
{
int date ;
struct node *next ;
}Lnode;

Lnode *creater (int m) //创建链表
{
int i ;
Lnode *head , *p , *q ;

head = p =( Lnode *) malloc (sizeof (Lnode)) ;
memset(p, 0, sizeof(Lnode));
p->next = NULL ;

for ( i=0 ; i < m ; i++ )
{
q = ( Lnode *) malloc (sizeof (Lnode)) ;
memset(q, 0, sizeof(Lnode));
printf ("输入第 %d 个数的值: ",i+1);
scanf ( "%d", &q->date ) ;

if ( i == 0)
p = head = q ;
else
{
p->next = q ;
p = q ;
}

}
q->next = NULL ;

return head ;
}


Lnode *Merge (Lnode *La ,Lnode *Lb ) //合并两个链表
{
Lnode *Lc ,*pa ,*pb ,*pc ,*ptr ;

Lc = La ;
pc = La ;
pa = La->next ;
pb = Lb->next ;

while ( pa != NULL && pb != NULL )
{
if (pa->date < pb->date )
{
pc->next = pa ;
pc = pa ;
pa = pa->next ;
}

if (pa->date > pb->date )
{
pc->next = pb ;
pc = pb ;
pb = pb->next ;
}

if (pa->date == pb->date )
{
pc->next = pa ;
pc = pa ;
pa = pa->next ;

ptr = pb ;
pb = pb->next ;
free ( ptr );
}
}
if ( pa != NULL )
pc->next =pa ;
else
pc->next = pb ;

free ( Lb ) ;

return Lc ;
}

void print ( Lnode *head )
{
int i ;
Lnode *p ;

printf ("\n输出结果 :\n\n") ;
p = head ;
for ( i = 1 ; p != NULL ; i++ )
{
printf ("第 %d 个值 :%d \n", i , p->date ) ;
p = p->next ;
}
}

int main()
{
int i,j ;
Lnode *k ,*b ,*c;
printf ("请输入: 链表1,要录入数据的个数: ") ;//创建链表
scanf ("%d",&i ) ;
k = creater ( i ) ;
print ( k );
printf ("请输入: 链表2,要录入数据的个数: ") ; //创建链表
scanf ("%d",&j ) ;
b = creater ( j ) ;
print ( b );
c = Merge ( k , b); //链表合并
printf("合并:\n");
print ( c) ;
free ( c ) ;

return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧