time_limit |
3000MS |
memory_limit |
10000KB |
description |
已知A,B和C爲三個非遞減有序的線性表,現要求對A表作如下操作:刪去那些既在B表中出現又在C表中出現的元素。試對順序表編寫實現上述操作的算法。 |
input |
第一行輸入3個正整數m,n,p(m,n,p<=100),用空格分開,分別表示三個線性表中的元素個數,其後3行依次輸入A,B,C表中的元素。 |
output |
輸出實現上述操作後的A表。 |
sample_input |
8 5 6 1 2 3 4 5 6 6 7 2 3 5 9 12 |
sample_output |
1 3 4 6 6 7 |
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
#define Init_Size 1000
#define Add_Size 100
typedef struct SeqList{
ElemType *elem;
int length;
int Size;
}SeqList,*PSeqList;
void Init_Seq(const PSeqList plist,int n)
{
int i;
plist->elem=(ElemType *)malloc(Init_Size*sizeof(ElemType)); //如果初始數據個數超過1000未處理,懶
plist->Size=Init_Size;
plist->length=n;
for(i=0;i<n;i++){
scanf("%d",&plist->elem[i]);
}
}
void Insert_Seq(const PSeqList plist,int n,ElemType x)//插入元素於角標n
{
int p;
ElemType *newbase;
if(n<0||n>plist->length){
printf("插入位置錯誤!\n");
}
if(plist->length+1>plist->Size){
newbase=(ElemType *)realloc(plist->elem,sizeof(ElemType)*(plist->Size+Add_Size));
plist->Size+=Add_Size;
plist->elem=newbase;
}
for(p=plist->length-1;p>=n;p--){
plist->elem[p+1]=plist->elem[p];
}
plist->elem[n]=x;
plist->length++;
}
void delete_Seq(const PSeqList plist,int n)//刪除角標爲n的元素
{
if(n<0||n>plist->length)printf("刪除位置錯誤!\n");
int p;
for(p=plist->length-1;n<p;n++){
plist->elem[n]=plist->elem[n+1];
}
plist->length--;
}
int location_Seq(const PSeqList plist,ElemType x)//找到元素x的角標
{
int i;
for(i=0;i<plist->length;i++)
if(x==plist->elem[i])return i;
return -1;
}
ElemType get_Seq(const PSeqList plist,int n)//找到角標爲n的元素
{
if(n<0||n>plist->length){
printf("角標位置錯誤\n");
return -1;
}
ElemType x=plist->elem[n];
return x;
}
void show_Seq(const PSeqList plist)
{
int i=0;
while(i<plist->length){
if(0!=i)printf(" ");
printf("%d",plist->elem[i]);
i++;
}
printf("\n");
}
int main()
{
PSeqList la,lb,lc;
int a,b,c,k,i,m;
ElemType x;
scanf("%d%d%d",&a,&b,&c);
la=(SeqList *)malloc(sizeof(SeqList));
lb=(SeqList *)malloc(sizeof(SeqList));
lc=(SeqList *)malloc(sizeof(SeqList));
Init_Seq(la,a);
Init_Seq(lb,b);
Init_Seq(lc,c);
//下面爲b和c的合取:
m=lb->length;
for(i=0;i<m;){
x=get_Seq(lb,i);
k=location_Seq(lc,x);
if(-1==k){
delete_Seq(lb,i);m--;
}
else
i++;
}
//下面爲a和b的差集:
for(i=0,m=la->length;i<m;){
x=get_Seq(la,i);
k=location_Seq(lb,x);
if(-1!=k){
delete_Seq(la,i);m--;
}
else
i++;
}
show_Seq(la);
//printf("Hello world!\n");
return 0;
}