将两个链表合并,并去除相同的元素,最后保持递增顺序
#include<stdio.h>#include<stdlib.h>
#define L sizeof(struct Link)
struct Link{
int num;
struct Link *next;
}; //结构体
struct Link *creat(){ //构建链表
struct Link *head,*p1,*p2;
int a;
head=p2=(struct Link *)malloc(L);
printf("请输入链表数据并以0结尾:\n");
scanf("%d",&a);
while(a!=0)
{
p1=(struct Link *)malloc(L);
p1->next=NULL;
p1->num=a;
p2->next=p1;
p2=p1;
scanf("%d",&a);
}
printf("\n");
return head;
}
void print(struct Link *p){//输出链表
printf("你的链表为:\n");
while(p->next!=NULL)
{
printf("%d ",p->next->num);
p=p->next;
}
}
void sort(struct Link *head){//排序链表
struct Link *p,*q,*r;
int temp;
for(p=head->next;p!=NULL;p=p->next){
r=p;
for(q=p->next;q!=NULL;q=q->next)
if(r->num>q->num)
r=q;
temp=p->num;
p->num=r->num;
r->num=temp;
}
}
void mix(struct Link *p,struct Link *q){//混合链表
struct Link *head1,*head2;
head1=p;
head2=q;
if(p->next=NULL){
printf("A表为空 ,合并后链表为B\n");
print(q);
}
else if(q->next=NULL){
printf("B表为空 ,合并后链表为A\n");
print(p);
}
else{
p=p->next;
q=q->next;
while(p!=NULL&&q!=NULL){
if(p->num==q->num){
p=p->next;
q=q->next;
}
else{
head2->next=p->next;
p->next=q;
q=q->next;
p=head2->next;
}
}
sort(head1);
print(head1);
}
}
void main(){
struct Link *A,*B;
printf("A链表为:\n");
A=creat();
printf("B链表为:\n");
B=creat();
mix(A,B);
}