【问题描述】已知A,B和C为三个非递减有序的线性表,现要求对A表做如下操作:删去那些既在B表中出现又在C表中
出现的元素.试对顺序表编写实现上述操作的算法(注意题中并没有特别指明同一表中的元素值各不相同). 注意此
题用顺序表编写程序.
【输入形式】第一行为A表,第二行为B表,第三行为C表,分别以-1结束
【输出形式】删除后的A表
【样例输入】1 3 5 5 7 -1
2 4 5 6 8 -1
5 6 7 9 -1
【样例输出】1 3 7
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define listsize 100 typedef int elemtype; typedef struct { elemtype *elem; int length; int size; }sqlist; void Initlist(sqlist &l) { l.elem=(elemtype *)malloc(listsize*sizeof(elemtype)); if(!l.elem) exit(-1); l.length=0; l.size=listsize; } void creatlist(sqlist &l) { int i=0,m; while(1) { scanf("%d",&m); if(m<0) break; l.elem[i]=m; i++; } l.length=i; } void show(sqlist l) { int i; for(i=0;i<l.length;i++) printf("%d ",l.elem[i]); printf("\n"); } void deletelist(sqlist &l,elemtype e) { int i; elemtype *p,*q; for(i=0;i<l.length;i++) { //查找 if(l.elem[i]==e) { p=&(l.elem[i]); //找到节点的位置 q q=l.elem+l.length-1; //移动->线性表的删除 for(++p;p<=q;p++) *(p-1)=*p; //长度减一 l.length--; i--; } } } void searchlist(sqlist &la,sqlist lb,sqlist lc) { int i,j; for(i=0;i<lb.length;i++) { for(j=0;j<lc.length;j++) { //查找 if(lb.elem[i]==lc.elem[j]) //在la中删除la、lb中公有的值 deletelist(la,lb.elem[i]); } } } int main() { sqlist A,B,C; Initlist(A); Initlist(B); Initlist(C); creatlist(A); creatlist(B); creatlist(C); searchlist(A,B,C); show(A); return 0; }