已知A,B,C为三个元素值递增有序的线性表,要求对表A如下运算:删去那些既在表B中出现又在表C......

这个是顺序表的,单链表我也有写,在另一个文章
不善于解释,代码在下面,function函数是主要实现的函数,时间复杂度为O(n),希望能帮到你

#include<malloc.h>
#include<assert.h>
#include<stdio.h>
#define SUCCESS 1
#define FAIL 0
#define Elemtype int
#define SIZE 10
#define EXTERN 1
#define Status int
typedef struct SeqList
{
    Elemtype *base;
    int capacity;
    int size;
}List;

Status extern_(List *list);
void initial(List *list);
void push_back(List *list,Elemtype x);
void show(List *list);
void function(List *la,List *lb,List *lc);

int main()
{
    List la,lb,lc;
    initial(&la);
    initial(&lb);
    initial(&lc);

    printf("构造顺序表a(要显示的链表)(-1 end)\n");
    int x;
    while(1)
    {
        scanf("%d",&x);
        if(x==-1)
            break;
        push_back(&la,x);
    }
    printf("这是顺序表a>>>");
    show(&la);

    printf("构造顺序表b(要显示的链表)(-1 end)\n");
    while(1)
    {
        scanf("%d",&x);
        if(x==-1)
            break;
        push_back(&lb,x);
    }
    printf("这是顺序表b>>>");
    show(&lb);

    printf("构造顺序表c(要显示的链表)(-1 end)\n");
    while(1)
    {
        scanf("%d",&x);
        if(x==-1)
            break;
        push_back(&lc,x);
    }
    printf("这是顺序表c>>>");
    show(&lc);

    function(&la,&lb,&lc);
    printf("function后的顺序表a>>>");
    show(&la);

    return(1);
}

void initial(List *list)
{//本算法的功能是初始化顺序表list
    //为顺序表初始化大小为十个空间的内存
    list->base=(Elemtype*)malloc(SIZE*sizeof(Elemtype));
    assert(list->base!=NULL);

    list->size=0;
    list->capacity=SIZE;
}

void push_back(List *list ,Elemtype x)
{//本算法的前提是顺序表已经初始化并且内存空间未满
    //本算法的功能是在顺序表的尾部插入数据元素x
    if(list->size==list->capacity&&!extern_(list))
        return;//空间已满

    list->base[list->size]=x;
    list->size++;//表长加一
}

void show(List *list)
{//本算法的前提是顺序表已经初始化并且顺序表至少有一个元素
    //本算法的功能是依次显示顺序表中的元素
    int i;
    if(list->size==0)
        return;//表长合法性判断

    for(i=0;i<list->size;++i)
        printf("%d ",list->base[i]);
    printf("\n");
}

Status extern_(List *list)
{//本算法的前提是顺序表已经初始化
    //本算法的功能是增加顺序表的长度,一次增大的长度为EXTERN
    Elemtype *newbase;
    newbase=(Elemtype*)realloc(list->base,(list->capacity+EXTERN)*sizeof(Elemtype));
    assert(newbase!=NULL);

    if(newbase!=NULL)//分配成功
    {
        list->base=newbase;
        list->capacity+=EXTERN;
        return(SUCCESS);
    }
    else
    {
        return(FAIL);
    }
}

void function(List *la,List *lb,List *lc)
{//本算法的前提是la,lb,lc中都至少有一个元素
    //本算法的功能是去掉la中在lb和lc同时出现的元素
    if(la->size==0 || lb->size==0 || lc->size==0)
        return;//表长合法性判断

    int pa,pb,pc,i;
    pa=0;
    pb=0;
    pc=0;//三个指针分别指向顺序表的第一个元素

    while(pa<la->size && pb<lb->size && pc<lc->size)//三个指针都没有越界
    {
        while(pb<lb->size && pc<lc->size && lb->base[pb]!=lc->base[pc])//指针指向的值小的往前移,直到相等
        {
            if(lb->base[pb]<lc->base[pc])
                pb++;
            else
                pc++;
        }
        if(pb<lb->size && pc<lc->size)//pb和pc指向表中值相同的元素
        {
            while(pb!=lb->size-1&&lb->base[pb]==lb->base[pb+1] || lc!=lc->size-1&&lc->base[pc]==lc->base[pc+1])//让pb和pc中分别指向重复出现的元素中的最后一个
            {
                if(lb->base[pb]==lb->base[pb+1]) //如果这个元素直接后继相同,就指向这个直接后继
                    pb++;
                if(lc->base[pc]==lc->base[pc+1])
                    pc++;
            }
            while(pa<la->size && la->base[pa]<lb->base[pb]) 
                pa++;
            if(pa<la->size && la->base[pa]==lb->base[pb])//如果在A中找到这个在B和C中重复出现的元素
            {
                for(i=pa;i<la->size-1;++i)
                    la->base[i]=la->base[i+1];//给予删除
                la->size--;//表长减一
            }
            else//如果A中不存在这个元素
            {
                pb++;
                pc++;
            }//pb和pc都同时后移
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41133154/article/details/78815917