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的头指针
}