1. 程式人生 > >【資料結構】順序表應用1:多餘元素刪除之移位演算法

【資料結構】順序表應用1:多餘元素刪除之移位演算法

Problem Description

一個長度不超過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>
 
typedef struct
{
    int data[10010];
}SL;            //定義順序表
 
void   creatlist(SL *l,int n)
{
    for(int i=0;i<n;i++)
    {
        scanf("%d",&l->data[i]);
    }
}               //建立順序表
int  deletelist(SL *l,int n)
{
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n;j++)  //迴圈遍歷
        {
          if(l->data[i]==l->data[j])
            {
                n--;
                for(int k=j;k<n;k++)  //將後面的移到前面
                    l->data[k]=l->data[k+1];
                j--;
            }
        }
        return n;
}         
 //刪除重複元素
void printlist(SL *l,int n)
{
    for(int i=0;i<n;i++)
        if(i==n-1)
            printf("%d\n",l->data[i]);
        else printf("%d ",l->data[i]);
}               //輸出順序表
 
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int m;
        scanf("%d",&m);
        SL l;
        creatlist(&l,m);
        m=deletelist(&l,m);
        printlist(&l,m);
    }
    return 0;
}