顺序表应用2:多余元素删除之建表算法

来源:互联网 发布:网络英语外教一对一 编辑:程序博客网 时间:2024/06/06 15:00

这道题的主要思想是在已经建好的表的基础上,利用旧表申请的空间,删除冗余元素。

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define LISTSIZE 10000
typedef struct{
    int *elem;
    int length;
    int listsize;
}Sqlist;
int Initialist(Sqlist *L){/*顺序表的初始化*/
    L->elem=(int *)malloc(LISTSIZE*sizeof(Sqlist));
    if (!L->elem) exit(-1);/*存储分配失败*/
    L->length=0;
    L->listsize=LISTSIZE;
    return 1;
}
int Insertlist(Sqlist *L,int i,int e){
    if (i<1||i>L->length+1) printf("ERROR");
    int *q=&(L->elem[i-1]);
    int *p;
    for (p=&(L->elem[L->length-1]);p>=q;--p)
        *(p+1)=*p;
    *q=e;
    L->length++;
    return 1;
}
void Purge(Sqlist *L){/*在原来表的基础上建立一个新表;*/
    int k,i,j,m;
    k=-1;//k指向新表的表尾;
    m=L->length;//m表示旧表的长度;
    for (i=0;i<m;i++){/*将旧表中的元素依次与新表中的元素比较;*/
        j=0;
        while (j<=k&&L->elem[j]!=L->elem[i])//让新表中的元素依次与旧表中的元素比较;
        {
            ++j;
        }
        if (k==-1||j>k)
            L->elem[++k]=L->elem[i];
        L->length=k+1;//改变表长;
    }
}
int main(){
    int m;
    scanf("%d",&m);
    while (m){
        Sqlist L;
        int n,d,i;
        scanf("%d",&n);
        Initialist(&L);
        for (i=1;i<=n;i++){
            scanf("%d",&d);
            Insertlist(&L,i,d);
        }
        Purge(&L);
        for (i=1;i<=L.length;i++)
            printf("%d ",L.elem[i-1]);
        printf("\n");
        m--;
    }
    return 0;


}

0 0
原创粉丝点击