两个有序链表归并的程序出了问题,麻烦懂得人帮忙看看好么?谢谢!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个有序链表归并的程序出了问题,麻烦懂得人帮忙看看好么?谢谢!相关的知识,希望对你有一定的参考价值。

两个有序链表归并的程序出了问题,调试时找到的程序运行不下去的点,但是完全看不出究竟那句话错在了什么地方。运行不下去的地方时:Status MergeList_L(LinkList *La,LinkList *Lb,LinkList *Lc)函数中的第四行pa=La->next;
下面是具体程序,虽然比较长,但大家可以只看MergeList_L函数和主函数。拜托了!
#include<stdio.h>
#define ElemType int
#define Status int
#define ERROR -1
#define OK 1;
#define OVERFLOW -2

typedef struct SingleLinkList

ElemType data;
struct SingleLinkList *next;
LinkList;

Status CreateList_L(LinkList *L,int n)

int i=0;
LinkList *pnew;
L=(LinkList*)malloc(sizeof(LinkList));
L->next=NULL; //建表头
while(i<n)

pnew=(LinkList*)malloc(sizeof(LinkList)); //建立新节点
if(!pnew) return OVERFLOW;
scanf("%d",&(pnew->data));
pnew->next=L->next;
L->next=pnew;
i++;

return OK;


//La,Lb是从小到大的有序链表,将其归并成有序链表Lc,允许有相同的值在Lc内
Status MergeList_L(LinkList *La,LinkList *Lb,LinkList *Lc)

LinkList *pc=NULL,*pa=NULL,*pb=NULL;
pc=La;
Lc=pc; //Lc与La复用一个头结点
pa=La->next; //pa此时指向La的第一个元素
pb=Lb->next;
while(pa && pb)

if((pa->data)<=(pb->data))

pc->next=pa;
pc=pa;
pa=pa->next;

else

pc->next=pb;
pc=pb;
pb=pb->next;


printf("2\n");
pc->next=pa?pa:pb;
return OK;


int main(void)

LinkList *La=NULL,*Lb=NULL,*Lc=NULL,*pc=NULL;
ElemType e;
CreateList_L(La,3); //创建长度为三的链表La
CreateList_L(Lb,3); //创建长度为三的链表Lb
MergeList_L(La,Lb,Lc); //归并链表La,Lb。Lc为归并结果
pc=Lc->next;
while(pc)

printf("%d ",(pc->data));
pc=pc->next;

return 0;

仔细一看,问题还真不少

#define ElemType int
#define Status int

这都谁教你的?
应该是:
typedef int ElemType;
typedef int Status;

按你的意思是:将两个升序链表合并,比如输入1 3 5和2 4 6,结果为1 2 3 4 5 6
但我就不明白你为什么采用头插法建立链表
头插法的特点是:将新增结点插入第一个结点之前,也就是说你输入1 3 5链表的输出为5 3 1
所以这里应该用尾插法建表,即将新增结点插入最后一个结点之后

程序清单:(我采用的是函数返回值来传递动态内存)

#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct node

ElemType data;
struct node *next;
LinkNode, *LinkList;//定义结构体类型以及结构体指针

//创建链表
LinkList CreatList(int n)//尾插法

int count = 0;
LinkList L = NULL;
LinkList S = NULL;
LinkList pnew = NULL;

L = (LinkList) malloc (sizeof(LinkNode));
if (NULL == L)

printf("申请内存失败!\n");
exit(0);


L->next = NULL;

S = L;

while (count < n)

pnew = (LinkList) malloc (sizeof(LinkNode));
if (NULL == pnew)

printf("申请内存失败!\n");
exit(0);

scanf("%d", &(pnew->data));

S->next = pnew;
S = pnew;

count++;


pnew->next = NULL;

return(L);


//链表和并
void MergeList(LinkList L1, LinkList L2)

LinkList p = NULL;
LinkList p1 = NULL;
LinkList p2 = NULL;
LinkList tmp = NULL;

p = L1;
p1 = L1->next;
p2 = L2->next;

while ((NULL != p1) && (NULL != p2))

if (p1->data < p2->data)

p = p1;
p1 = p1->next;

else

tmp = p2->next;
p2->next = p1;
p->next = p2;
p = p2;
p2 = tmp;



p->next = p1 ? p1 : p2;

free(L2);

L2 = NULL;


//链表输出
void OutputList(LinkList L)

LinkList p = L->next;

while (NULL != p)

printf("%5d", p->data);
p = p->next;

printf("\n");


//释放链表所有节点
void DestroyList(LinkList L)

LinkList tmp = NULL;

while (NULL != L)

tmp = L;
L = L->next;
free(tmp);



void main(void)

LinkList La = NULL;
LinkList Lb = NULL;

printf("请输入第一条链:\n");
La = CreatList(3);

printf("请输入第二条链:\n");
Lb = CreatList(3);

printf("\n\n\n第一条链:\n");
OutputList(La);

printf("第二条链:\n");
OutputList(Lb);

MergeList(La, Lb);

printf("合并后:\n");
OutputList(La);

DestroyList(La);//销毁La

La = NULL;
参考技术A danzi

合并两个有序链表

1. 本人做法,采用了取巧的方法,利用了java的comparartor与自带的sort函数,先拆链表再构建链表,java还是好用啊

技术图片

 

 

2. 递归做法 学!

技术图片技术图片

 

 

3. 迭代法(归并排序中的merge过程,逐个比较)这里最好创建一个新的链表,如果在原有的链表(l1或者l2上面操作的话会很麻烦)

技术图片

 

以上是关于两个有序链表归并的程序出了问题,麻烦懂得人帮忙看看好么?谢谢!的主要内容,如果未能解决你的问题,请参考以下文章

刷题10:归并两个有序的链表

java 两个有序链表的归并

单片机是ATmega48的,写了个24C02的程序,但是程序一直没能进去,麻烦大侠们帮忙看看哪里出了问题。

链表:合并两个有序的链表

力扣21.合并两个有序链表

合并两个有序链表【递归、迭代】