已知A,B和C为三个非递减有序的线性表,现要求对A表作如下操作:删去那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操作的算法。 |
第一行输入3个正整数m,n,p(m,n,p<=100),用空格分开,分别表示三个线性表中的元素个数,其后3行依次输入A,B,C表中的元素。 |
输出实现上述操作后的A表。 |
8 5 6 1 2 3 4 5 6 6 7 2 3 5 9 12 |
1 3 4 6 6 7 |
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node
{
datatype data;
struct node *next;
}listnode;
typedef listnode *linklist;
linklist creatlist(int a[],int n)//创建单链表
{
int i;
linklist head=(linklist)malloc(sizeof(listnode));
linklist p,q;
q=head;
for(i=0;i<n;i++)
{
p=(linklist)malloc(sizeof(listnode));
p->data=a[i];
q->next=p;
q=p;
}
q->next=NULL;
return head;
}
linklist jiao(linklist head1, linklist head2)
{
linklist head=(linklist)malloc(sizeof(listnode));
linklist tail=head;
tail->next = NULL;
linklist s,p1=head1->next, p2 = head2->next;
while (p1)
{
while (p2)
{
if (p2->data == p1->data)
{
s = (linklist)malloc(sizeof(listnode));
s->data= p1->data;
s->next = NULL;
tail->next = s;
tail = s;
break;
}
p2 = p2->next;
}
p1 = p1->next;
p2 = head2->next;
}
return head;
}
linklist cha(linklist head1, linklist head2)
{
linklist head = (linklist)malloc(sizeof(listnode));
head->next = NULL;
linklist tail = head;
linklist LinkJiaoji = jiao(head1, head2);
linklist s, p1 = head1->next, p3 = LinkJiaoji->next;
while (p1)
{
while (p3)
{
if (p1->data == p3->data)
break;
p3 = p3->next;
}
if (!p3)
{
s = (linklist)malloc(sizeof(listnode));
s->data= p1->data;
s->next = tail->next;
tail->next = s;
tail = s;
}
p3 = LinkJiaoji->next;
p1 = p1->next;
}
return head;
}
void printlist(linklist head)//输出单链表
{
linklist p;
for(p=head->next;p;p=p->next)
printf("%d ",p->data);
}
int main()
{
int n,m,u,i;
int a[100],b[100],c[100];
scanf("%d %d %d",&n,&m,&u);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
scanf("%d",&b[i]);
for(i=0;i<u;i++)
scanf("%d",&c[i]);
linklist la=creatlist(a,n);
linklist lb=creatlist(b,m);
linklist lc=creatlist(c,u);
linklist ld=jiao(lb,lc);
linklist le=cha(la,ld);
printlist(le);
return 0;
}