2.29√ 已知ABC为三个递增有序的线性表,现要求对A表进行如下操作:删去那些即在B表中出现,又在C表中出现的元素(题中没有特别指明同一表中的元素值各不相同)

#include<stdio.h>
#include<malloc.h>
#include <stdlib.h>
#define maxsize 10

typedef int ElemType;
typedef int status;

typedef struct
{
    
    
    ElemType *data;
    int length;
}SqList;

SqList creat()
{
    
       
    SqList L;
    int len;
    
    scanf("%d", &len);
    L.data = (ElemType *)malloc(sizeof(int)*(len));
    int a;
    for (int i=0; i<len; i++)
    {
    
       
        printf("请输入第%d个元素值:", i+1);
        scanf("%d", &a);
        L.data[i] = a;
    }
    L.length = len;
    
    return L;
}

void print(SqList A)
{
    
    
    for(int i=0; i<A.length; i++)
        printf("%d\n", A.data[i]);
}


SqList delete(SqList A, SqList B, SqList C)
{
    
    //删除A表中同时在B表和C表中出现的元素,ABC均为递增有序的顺序表
    
    int i=0, j=0, k=0;      //ijk分别用于扫描表ABC;
    if(A.length>0)
    {
    
    
        while(i<A.length && j<B.length && k<C.length)
        {
    
    
            if(B.data[j] == C.data[k])
            {
    
    
                if(A.data[i] == B.data[j])
                {
    
    
                    int no = i+1;   int count = 1;
                    
                    //往前找到与下标为i的元素值不同的元素
                    while(A.data[i] == A.data[no])   
                    {
    
    
                        no ++;
                        count ++;
                    }//退出循环时no表示元素值大于A.data[i]的第一个元素下标,
                    //count表示与A[i]元素值相等的元素个数
                    
                    for (int h=no; h<A.length; h++)    //删除符合条件的元素
                        A.data[h-count] = A.data[h];

                    A.length -= count;
                    j++;
                    k++;
                }
                else if(A.data[i] < B.data[j])
                    i++;
                else
                {
    
    
                    j++;
                    k++;
                }
            }
            else if(B.data[j] < C.data[k])
                j++;
            else
                k++;
        }
    }
    
    return A;
}


int main()
{
    
    
    printf("请输入待建表A的表长:\n");
    SqList A = creat();
    printf("请输入待建表B的表长:\n");
    SqList B = creat();
    printf("请输入待建表C的表长:\n");
    SqList C = creat();
    
    A = delete(A, B, C);
    print(A);
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43661234/article/details/100855772
今日推荐