//两个有序链表的合并
#include<stdio.h>
#include<stdlib.h>
#define ERROR -1
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}LNode,*LinkList;
LinkList Createlist(int length){
LinkList L=(LinkList)malloc(sizeof(LNode));//头节点
if(L==NULL){
perror("this is Error!");
}
L->next=NULL;
LNode* p=L;
for(int i=0;i<length;i++){
LinkList t=(LinkList)malloc(sizeof(LNode));
t->next=NULL;
scanf("%d",&t->data);
p->next=t;
p=t; //尾插法
}
return L; //返回头节点
}
void print(LinkList L){
//头节点里是没有数据,所以打印的时候要越过头节点
LinkList p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
} //这个是有重复数据
//没有重复的数据
//int n=L->next->data;
//LNode* p=L->next->next
//printf("%d ",n);
//while(p){
// if(p->data!=n){
// printf("%d ",p->data);
// n=p->data;
// }
// p=p->next;
//}
//printf("\n");
}
int MergeList(LinkList &L1,LinkList L2){
LinkList pa=L1->next; //pa指向L1的首元结点
LinkList pb=L2->next; //pb指向L2的首元结点
LinkList q=L1; //q指向L1的头结点,他就是头指针
//下面的这个循环比较难理解
while(pa!=NULL&&pb!=NULL){
if(pa->data>pb->data){
LinkList t=pb;
pb=pb->next;
t->next=pa;
q->next=t; //头插
q=t; //q现在指向L1的头节点
}
else{
q=q->next; pa=pa->next;
}
}
if(pb) q->next=pb; //把没比较完的连接过来
return 0;
}
int main(){
int m,n;
scanf("%d",&m);
LinkList L1=Createlist(m); //传过来的是头节点就要用头指针来接收
scanf("%d",&n);
LinkList L2=Createlist(n);
if(MergeList(L1,L2)==0){
printf("合并成功了!");
printf("\n");
}
print(L1);
return 0;
}
有序链表的合并
最新推荐文章于 2024-10-08 14:26:15 发布