两个有序链表归并的程序出了问题,麻烦懂得人帮忙看看好么?谢谢!
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上面操作的话会很麻烦)
以上是关于两个有序链表归并的程序出了问题,麻烦懂得人帮忙看看好么?谢谢!的主要内容,如果未能解决你的问题,请参考以下文章