zoukankan      html  css  js  c++  java
  • 顺序表应用1:多余元素删除之移位算法

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

    Time Limit: 1000MS Memory Limit: 650KB

    Problem Description

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

    Input

     第一行输入整数n,代表下面有n行输入;
    之后输入n行,每行先输入整数m,之后输入m个数据,代表对应顺序表的每个元素。

    Output

     输出有n行,为每个顺序表删除多余元素后的结果

    Example 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

    Example Output

    6 9 8
    5
    9 8 7 6 5
    1 2 3 4 5

    #include<iostream>
    #include <stdlib.h>
    using namespace std;
    #define list_size 10000
    #define listincreament 10000
    typedef int element;
    typedef int Status;
    typedef struct
    {
        element *elem;
        int listsize;
        int length;
    } Sqlist;
    Status initializer_list(Sqlist &L) //初始化
    {
        L.elem = new int[list_size];
        if(!L.elem) return -1;
        L.length=0;
        L.listsize = list_size;
        return 0;
    }
    Status creatnewlist(Sqlist &L,int n) //创建顺序表
    {
        int i;
        L.elem = new int[list_size];
        if(!L.elem) return -1;
        else
        {
            for(i=0;i<n;i++)
            {
                cin>>L.elem[i];
                L.length++;
            }
        }
        return 0;
    }
    /*Status Delete(Sqlist &L,int i) //删除循序表中第i个元素;
    {
        if(i<1 &&i>L.length+1)
        {
            return -1;
        }
        else
        {
            for(int j=i;j<L.length;j++)
            {
                L.elem[j] = L.elem[j+1];
            }
            L.length--;
            return 0;
        }
    }
    */
    Status Remove(Sqlist &L)
    {
        int i;
    int *p=L.elem,*q=L.elem + L.length;
        for(;p<q;p++)
        {
            for(int *t=p+1;t<q;t++)
            {
                if(*p==*t)
                {
                   for(int *k=t;k<q-1;k++)
      {
      *k=*(k+1);
      }
      L.length--;//删除重复元素,顺序表长度-1;
      q--;
      t--;//重复元素被覆盖,退一个,指向覆盖重复元素的新元素
                }


            }
        }




        return 0;
    }
    void display(Sqlist &L) //输出顺序表中的所有元素
    {

        int i;
        for(i=0;i<L.length-1;i++)
        {
            cout<<L.elem[i]<<" ";
        }
        cout<<L.elem[i]<<endl;
    }
    int main()
    {
        Sqlist L;
        int n,m,i,T;
        cin>>n;
        while(n--)
        {
            cin>>m;
            initializer_list(L);
            creatnewlist(L,m);
            Remove(L);
            display(L);
        }
        return 0;
    }

  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/6444619.html
Copyright © 2011-2022 走看看