现在的位置: 首页 > 综合 > 正文

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

2013年10月05日 ⁄ 综合 ⁄ 共 1070字 ⁄ 字号 评论关闭

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

      

/*
 *   这个程序实现两个非递减顺序的链表的合并,
 *   并且合并得到的链表元素的成员变量的值也是非递减顺序。
 */
#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元素的值
*/

 

抱歉!评论已关闭.