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

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

#include
#include
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;idata); 
		}
		p=p->next;
	}
	printf("\n");
	p=B->next;
	for(int i=0;idata); 
		}
		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;idata=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的头指针
}

【数据结构】单链表应用2_第1张图片

你可能感兴趣的:(#数据结构,链表,数据结构)