【数据结构】单链表应用2

1.合并两个非递减的线性表,形成一个非递减的单链表,输出该单链表

#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
	int data;
	struct Lnode *next;
}Lnode,*LinkList;
void InsertList(LinkList &L,int n,int a[]);
void MergeList(LinkList &A,LinkList &B,LinkList &C);
int main(){
	LinkList A,B,C;
	Lnode *p;
	int a[]={6,7,9,14,37,45,65,67};//两个数组
	int b[]={3,7,11,34,45,89};
	InsertList(A,sizeof(a)/sizeof(a[0]),a);
	InsertList(B,sizeof(b)/sizeof(b[0]),b);
	int ListLengthA=sizeof(a)/sizeof(a[0]);
	int ListLengthB=sizeof(b)/sizeof(b[0]);
	
	p=A->next;
	for(int i=0;i<ListLengthA;i++){
		if(p){
			printf("%d ",p->data); 
		}
		p=p->next;
	}
	printf("\n");
	p=B->next;
	for(int i=0;i<ListLengthB;i++){
		
		if(p){
			printf("%d ",p->data); 
		}
		p=p->next;
	}
	printf("\n");
	MergeList(A,B,C);
	p=C->next;
	while(p){
		printf("%d ",p->data);
		p=p->next;
	}
}
 
void InsertList(LinkList &L,int n,int a[]){//尾插法建立单链表,将数组里数变到单链表中
	L=new Lnode; 
	L->next=NULL;
	Lnode *p;
	Lnode *r=L;
	int i;
	for(i=0;i<n;i++){
		p=new Lnode;
		p->data=a[i];
		r->next=p;
		r=p;
	}
	r->next=NULL;
}
void MergeList(LinkList &A,LinkList &B,LinkList &C){
	C=A;//c指针指向链表A头结点,此时c也是链表C的头指针
	Lnode *pa,*pb,*pc;
	pa=A->next;//pa指针指向A的首元结点
	pb=B->next;//pb指针指向B的首元结点
	pc=C;//pc指针指向链表c/A的头结点
	C->next=NULL;
	while(pa&&pb){
		if(pa->data<=pb->data){ //如果pa比pb所指数据域小,那么pa所指数据域是我们先要画箭头的
			pc->next=pa;//从pc画箭头到pa所指结点
			pc=pa;
			pa=pa->next;
		}else{
			pc->next=pb;
			pc=pb;
			pb=pb->next;
		}
	}
	//如果pa pb指针谁先指向空,则跳出上面的循环
	pc->next=pa?pa:pb;// 如果pa指针指向为空,而pb不为空,则让pc后继续画箭头连上pb所指的地址
	delete B; //释放链表B的头指针
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值