数据结构习题——3顺序表的删除

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
2 4 5 6 12 13

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值