c程序:编写实现将两个已知的有序链表合并成一个有序链表的函数。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c程序:编写实现将两个已知的有序链表合并成一个有序链表的函数。相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include <malloc.h>
struct intnode
int num;
intnode *next;
;
intnode *createlist(int n)
intnode *p,*head=NULL;
int i;
p=(intnode *)malloc(sizeof(intnode));
scanf("%d",&p->num);
p->next=NULL;
head=p;
for (i=1;i<n;i++)
p->next=(intnode *)malloc(sizeof(intnode));
p=p->next;
scanf("%d",&p->num);
p->next=NULL;
return head;
intnode *sumlist(intnode *a,intnode *b)
intnode *pa=a,*pb=b,*p,*head;
p=(intnode *)malloc(sizeof(intnode));
if (a->num<b->num)
p=a;pa=a->next;
else
p=b;pb=b->next;
p->next=NULL;
head=p;
while(pa!=NULL&&pb!=NULL)
if (pa->num<pb->num)
p->next=pa;
p=pa;
pa=pa->next;
else
p->next=pb;
p=pb;
pb=pb->next;
if(pb=NULL)
while (pa!=NULL)
p->next=pa;pa=pa->next;
else
while (pb!=NULL)
p->next=pb;pb=pb->next;
return head;
void main()
int N1,N2;
intnode *p1,*p2,*p;
scanf("%d%d",&N1,&N2);
p1=createlist(N1);
p2=createlist(N2);
p=sumlist(p1,p2);
while (p!=NULL)
printf("%d ",p->num);
p=p->next;
printf("\n");
我觉得没有问题,可是运行结果中总是少一段!!求大神指点
!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(pb==NULL)
A与B链表合并成C链表(链表的归并)
A与B链表合并成C链表(链表的归并)
已知两个有序递增A链表和B链表(非空),将两个链表合并为C链表(同为递增有序),需要我们对链表的概念有一定掌握
对节点所需条件以及节点之间建立关系有所掌握。
这个题的重点是,并没有说明两个链表的具体长度,即两个链表可能不一样长,所以,在处理的时候需要注意,当某一个链表
操作完毕,另一个链表剩下的部分则可以直接接入C链表当中。
1 void merge(LNode *A,LNode *B,LNode *C) 2 { 3 LNode *p = A->next; //p来跟踪A的最小值节点, 4 LNode *q = B->next; //q来跟踪B的最小值节点 5 LNode *r; //定义一个指针,用作C链表的游标 6 C = A; //C指向A链表的头结点 7 C->next = NULL; //这里可以去掉,因为下面两个if必须有一个执行 8 free(B); //释放掉B头结点 9 r = C; //游标指向C头结点 10 while(p!=NULL && q!=NULL) //当两个链表其中一个没有到达最后 11 { 12 if(p->data <= q->data) 13 { 14 r->next = p; 15 p = p->next; 16 r = r->next; 17 } 18 else{ 19 r->next = q; 20 q = q->next; 21 r = r->next; 22 } 23 } 24 r->next = NULL; //C链表最后next指针指向空 25 26 if(p!=NULL){ 27 r->next = p; 28 } 29 if(q!=NULL) 30 r->next = q; 31 }
以上是关于c程序:编写实现将两个已知的有序链表合并成一个有序链表的函数。的主要内容,如果未能解决你的问题,请参考以下文章