您的位置:首页 > 其它

第2章 线性表——有序链表的归并

2013-04-30 16:29 169 查看
        所有想一想就算有无奈和遗憾也会觉得幸福到爆棚的事情都无法实现,是不是这样应该感谢,从此以后,对不独立完成产生本能抵触。

      

/*
*   这个程序实现两个非递减顺序的链表的合并,
*   并且合并得到的链表元素的成员变量的值也是非递减顺序。
*/
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(inode)
typedef struct inode{ /*链表结点*/
long num;
struct inode *next;
}inode,*linklist;
linklist create(){ /*输入元素信息,构建链表*/
linklist head,p1,p2;
int n;
p1 = p2 = (linklist)malloc(LEN);
head = NULL;
n = 1;
while(n<=5){
scanf("%d",&p1->num);
if(n==1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (linklist)malloc(LEN);
n++;
}
p2->next = NULL;
return head;
}
linklist merge(linklist A,linklist B,linklist C){ /*归并单链表 A 和 B 得到单链表 C 。*/
int n;
linklist pa,pb,pc;
pa = A;
pb = B;
C = pc = A;
n = 1;
while(pa!=NULL&&pb!=NULL){
if(pa->num<=pb->num){
if(n!=1){
pc->next = pa;
pc = pa;
}
pa = pa->next;
n++;
continue;
}
if(pa->num>pb->num){
pc->next = pb;
pc = pb;
pb = pb->next;
continue;
}
}
pc->next = pa?pa:pb;
return C;
}
void print(linklist head){ /*打印链表*/
int i;
linklist p;
p = head;
printf("\n");
for(i = 1;;i++){
if(p==NULL)
break;
printf("%-3ld",p->num);
p = p->next;
}
printf("\n");
}
int main(){
linklist A,B,C;
A = create();
B = create();
C = merge(A,B,C);
print(C);
return 0;
}
/*
*       测试案例:
*       输入:
*            1 3 5 7 9 //链表 A 元素的值
*            2 4 6 8 10 //链表 B 元素的值
*
*       输出:
*       1  2  3  4  5  6  7  8  9  10 //链表C元素的值
*/


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: