1. 程式人生 > >順序表之移位刪除

順序表之移位刪除

順序表應用1:多餘元素刪除之移位演算法

Time Limit: 1000 ms Memory Limit: 650 KiB

Submit Statistic

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<bits/stdc++.h>
#define max 10001
using namespace std;
typedef int element;

typedef struct
{
    element *elem;
    int length;
    int listsize;
} sq;
void  initlist (sq &L )
{
    L.elem=(element*)malloc(max *sizeof(element));//申請max大小的空間
    L.length=0;
    L.listsize=max;
}
void cr(sq &L,int n)
{
    int i;
    for(i=0; i<n; i++)
    {
        scanf("%d",&L.elem[i]);
    }
    L.length=n;
}
void  del(sq &L)
{
    int *p =L.elem,*q=L.elem+L.length;      //p指向首地址(第一個元素的地址),q指向最後一個元素的地址。
    for(; p<q; p++)
    {
        for(int *t=p+1; t<q; t++)
        {
            if(*p==*t)
            {
                for(int *k=t; k<q; k++)
                    *k=*(k+1);                 //t後面的元素都王前移一位,例如l.elem[L.length-1]=L.elem[L.lenght];把後一個元素的值賦給前一個元素。
                     L.length--;                       //總個數減一。
                     q--;                                //q指向原來倒數第二個元素的地址。
                     t--;                                 //
            }
        }
    }
}



void pr(sq &L)
{
    int i;
    for(i=0; i<L.length-1; i++)
        printf("%d ",L.elem[i]);
    printf("%d\n",L.elem[L.length-1]);
}
int main()
{
    int n,m;
    sq L;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        initlist(L);
        cr(L,m);
        del(L);
        pr(L);
    }
    return 0;
}




刪除部分也可用以下陣列實現

void del(sq &L)
{
int i=0;

while(i<L.length)
{
    for(int j=i+1;j<=L.length;j++)
    {
        if(L.elem[j]==L.elem[i])
        {
            for(int k=j;k<L.length;k++)
                L.elem[k]=L.elem[k+1];             
                 L.length--;                       
        }
    }

    i++;
}

}


![在這裡插入圖片描述](https://img-blog.csdn.net/2018092120225949?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2RvbmdqaWFuMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)