题目描述
有两个链表a和b,从a、b中删除它两重复的元素(只要重复就删除),并对删除后的a链表进行升序排序,b链表进行降序排序。a 的长度为m,b 的长度为n
输入
输入a,b的长度m,n
a、b链表
输出
处理后的a、b链表
样例输入
9
6
1 2 3 4 5 6 7 8 6
5 6 7 10 0 5
样例输出
1 2 3 4 8
10 0
分析:
此题考察了多方面知识。排序,删除。
一开始为能对题意理解全面,导致出错。(只要重复就删除)这句话表明了,在 一个链表中也要使相同元素只剩一个。
#include"stdio.h"
#include"string.h"
typedef struct a{
int data;
struct a *next;
}*LinkList,Node;
//创建一个包含头结点的链表
void CreatListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
scanf("%d",&(p->data));
r->next=p;
r=p;
}
r->next=NULL;
}
//排序, 升序排序
void LinkSortA(LinkList *L,int m)
{
LinkList head,end;
LinkList pre,T;
head=(*L)->next;
end=head->next;
pre=*L;
while(m--)
{
head=(*L)->next;
end=head->next;
pre=*L;
while(end!=NULL)
{
if(head->data>end->data)
{
head->next=end->next;
end->next=head;
pre->next=end;
T=head;
head=end;
end=T;
}
pre=head;
end=end->next;
head=head->next;
}
}
}
//降序排序
void LinkSortB(LinkList *L,int m)
{
LinkList head,end;
LinkList pre,T;
head=(*L)->next;
end=head->next;
pre=*L;
while(m--)
{
head=(*L)->next;
end=head->next;
pre=*L;
while(end!=NULL)
{
if(head->data<end->data)
{
head->next=end->next;
end->next=head;
pre->next=end;
T=head;
head=end;
end=T;
}
pre=head;
end=end->next;
head=head->next;
}
}
}
void DeleteAandB(LinkList *A,LinkList *B)
{
LinkList startA,preA;
LinkList startB,preB;
int mark;
startA=(*A)->next;
startB=(*B)->next;
preA=(*A);
while(startA!=NULL)
{
startB=(*B)->next;
preB=(*B);
mark=0;
while(startB!=NULL)
{
if(startA->data==startB->data)
{
preB->next=startB->next;
startB=startB->next;
mark=1;
continue;
}
preB=startB;
startB=startB->next;
}
if(mark==1)
{
preA->next=startA->next;
startA=startA->next;
continue;
}
preA=startA;
startA=startA->next;
}
}
void PUSH(LinkList T)
{
T=T->next;
while(T!=NULL)
{
printf("%d ",T->data);
T=T->next;
}
printf("\n");
}
void Delete(LinkList *L)
{
LinkList T,pre;
pre=(*L)->next;
T=pre->next;
while(T!=NULL)
{
if(pre->data==T->data)
{
pre->next=T->next;
T=T->next;
continue;
}
pre=T;
T=T->next;
}
}
int main()
{ LinkList A,B;
int m,n;
while(~scanf("%d",&m))
{
scanf("%d",&n);
CreatListTail(&A,m);
CreatListTail(&B,n);
LinkSortA(&A,m);
Delete(&A);
Delete(&B);
LinkSortB(&B,n);
DeleteAandB(&A,&B);
PUSH(A);
PUSH(B);
}
}