顺序表应用1:多余元素删除之移位算法(里面有一小块需要认真注意哦!!!)

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

Time Limit: 1000 ms Memory Limit: 650 KiB

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>
#include<stdlib.h>

struct node
{
    int data;
    struct node *next;

}*head;

struct node *build_list(int m)
{
    struct node *tail, *p;
    int i;

    tail = head;
    for(i = 0; i < m; i++)
    {
        p = (struct node *)malloc(sizeof(struct node));
        p-> next = NULL;
        scanf("%d", &p-> data);
        tail-> next = p;
        tail = p;
    }

    return head;
}

void delete_list(struct node *head)
{
    struct node *p, *x, *q;

    p = head-> next;
    while(p-> next != NULL)
    {
        q = p-> next;
        x = p;

        while(q != NULL)
        {
            if(q-> data == p-> data)
            {
                if(q-> next != NULL)
                {
                    x-> next = q-> next;
                    free(q);
                    q = x-> next;
                }

                else
                {
                    x-> next = NULL;
                    q = NULL;
                }

            }

            else
            {
                x = x-> next;
                q = q-> next;
            }
        }

        /* if(q-> next == NULL)
         {
             if(q-> data == p-> data)
             {
                 x-> next = NULL;
                 q = NULL;
             }
         }
         */
         if(p-> next != NULL)  //这里的if语句很重要,因为可能在上面判断的时候已经p-> next == NULL;了!!!
         {
            p = p-> next;
         }
    }
}

void print(struct node *head)
{
    struct node *p;
    p = head-> next;

    while(p-> next != NULL)
    {
        printf("%d ", p-> data);
        p = p-> next;
    }

    printf("%d\n", p-> data);
}

int main(void)
{
    int n, m;
    struct node *h;

    scanf("%d", &n);

    while(n--)
    {
        scanf("%d", &m);
        head = (struct node *)malloc(sizeof(struct node));
        head-> next = NULL;
        h = build_list(m);
        delete_list(h);
        print(head);
    }

    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/Eider1998/article/details/82453758