顺序表应用1:多余元素删除之移位算法

Time Limit: 1000 ms Memory Limit: 650 KiB

Problem De ion
一个长度不超过10000数据的顺序表,可能存在着一些值相同的“多余”数据元素(类型为整型),编写一个程序将“多余”的数据元素从顺序表中删除,使该表由一个“非纯表”(值相同的元素在表中可能有多个)变成一个“纯表”(值相同的元素在表中只保留第一个)。
要求:
1、必须先定义线性表的结构与操作函数,在主函数中借助该定义与操作函数调用实现问题功能;
2、本题的目标是熟悉顺序表的移位算法,因此题目必须要用元素的移位实现删除;
Input

第一行输入整数n,代表下面有n行输入;
之后输入n行,每行先输入整数m,之后输入m个数据,代表对应顺序表的每个元素。
Output
输出有n行,为每个顺序表删除多余元素后的结果
Sample Input
4
5 6 9 6 8 9
3 5 5 5
5 9 8 7 6 5
10 1 2 3 4 5 5 4 2 1 3
Sample Output
6 9 8
5
9 8 7 6 5
1 2 3 4 5

#include<stdio.h>
#include<stdlib.h>

typedef struct
{
    int *elem;
    int length;
    int listsize;
}Sqlist;

void InitList(Sqlist *L,int n)
{
    int i;
    L->elem=(int *)malloc(n*sizeof(int));
    if(!L->elem) exit(0);
    L->length=0;
    for(i=0;i<n;i++)
    {
        scanf(\"%d\",&L->elem[i]);
        L->length++;
    }
    L->listsize=n;
}

void Del(Sqlist *L)
{
    int i,j,k;
    for(i=0;i<L->length;i++)
    {
        for(j=i+1;j<L->length;j++)				//遍历第i个元素后面的元素
        {
            if(L->elem[i]==L->elem[j])			//如果第j个元素与其相同
            {
                for(k=j;k<L->length;k++)			
                {
                    L->elem[k]=L->elem[k+1];		//就把j那个元素后面的所有元素前移一位将其覆盖(删除)
                }
                L->length--;						//每覆盖(删除)一个元素,长度减一
                j--;								
                //因为第j个元素被原来的j+1元素覆盖,
                //所以现在的第j个元素是原来的第j+1的
                //元素,要重新检查;如果没有这句代
               //码,下次的for循环就是从j+1开始的,
               //就漏掉了一个元素

            }

        }
    }
}

int  main()
{

    Sqlist *L;
    L=(Sqlist *)malloc(sizeof(Sqlist));
    L->elem=NULL;
    int i;
    int t,n;
    scanf(\"%d\",&t);
    while(t--)
    {
        scanf(\"%d\",&n);
        InitList(L,n);
        Del(L);
        for(i=0;i<L->length;i++)
        {
            if(i==L->length-1)
                printf(\"%d\\n\",L->elem[i]);
            else
                printf(\"%d \",L->elem[i]);
        }
    }

}

代码都是比较基础的,重点就在于“移位”或者说是“删除”的算法,在那里,我都打上了注释,也是为了自己以后能看懂吧,哈哈哈

收藏 打印