链表(软工)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
有两个链表a和b,从a、b中删除它两重复的元素(只要重复就删除),并对删除后的a链表进行升序排序,b链表进行降序排序。a 的长度为m,b 的长度为n
输入
输入a,b的长度m,n
a、b链表
输出
处理后的a、b链表
样例输入 Copy
9
6
1 2 3 4 5 6 7 8 6
5 6 7 10 0 5
样例输出 Copy
1 2 3 4 8
10 0
提示
本题是多组输入。
#include<stdio.h>
#include<stdlib.h>
struct stu
{
int n;
int m;
struct stu *next;
};
struct stu *creat(int n)
{
int i;
struct stu *head,*p,*q;
head=p=q=(struct stu*)malloc(sizeof(struct stu));
for(i=0;i<n;i++)
{
p=(struct stu *)malloc(sizeof(struct stu));
scanf("%d",&p->n);
p->m=0;
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
//建立链表
struct stu *sort(struct stu *head)
{
struct stu *p,*q;
int k;
q=head->next;
while(q!=NULL)
{
p=q->next;
while(p!=NULL)
{
if(q->n>p->n)
{
k=q->n;
q->n=p->n;
p->n=k;
}
p=p->next;
}
q=q->next;
}
return head;
}
//升序排序
struct stu *sort2(struct stu *head)
{
struct stu *p,*q;
int k;
q=head->next;
while(q!=NULL)
{
p=q->next;
while(p!=NULL)
{
if(q->n<p->n)
{
k=q->n;
q->n=p->n;
p->n=k;
}
p=p->next;
}
q=q->next;
}
return head;
}
//降序排序
struct stu *del(struct stu *head)
{
struct stu *p,*q;
p=head->next;
q=head;
while(p!=NULL)
{
if(p->m==1)
{
q->next=p->next;
free(p);
p=q;
}
q=p;
p=p->next;
}
return head;
}
//删除函数
int main()
{
int n,m;
int i,j,k,f;
struct stu *p,*q,*h1,*h2,*ans,*bns;
while(~scanf("%d%d",&n,&m))
{
h1=creat(n);
h2=creat(m);
p=h1->next;
while(p!=NULL)
{
ans=h2->next;
f=0;
while(ans!=NULL)
{
if(ans->n==p->n)
{
ans->m=1;
f=1;
}
ans=ans->next;
}
if(f==1)
{
bns=h1->next;
while(bns!=NULL)
{
if(bns->n==p->n)
{
bns->m=1;
}
bns=bns->next;
}
}
p=p->next;
}
//标记哪些节点要删除
h1=del(h1);
h2=del(h2);
h1=sort(h1);
h2=sort2(h2);
p=h1->next;
q=h2->next;
while(p!=NULL)
{
printf("%d ",p->n);
p=p->next;
}
printf("\n");
while(q!=NULL)
{
printf("%d ",q->n);
q=q->next;
}
printf("\n");
}
return 0;
}