您的位置:首页 > 理论基础 > 数据结构算法

数据结构实验之链表七:单链表中重复元素的删除

2018-03-25 15:14 267 查看


数据结构实验之链表七:单链表中重复元素的删除

Time Limit: 1000 msMemory Limit: 65536 KiB


Problem Description

按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。


Input

第一行输入元素个数 n (1 <= n <= 15);

第二行输入 n 个整数,保证在 int 范围内。


Output

第一行输出初始链表元素个数;

第二行输出按照逆位序所建立的初始链表;

第三行输出删除重复元素后的单链表元素个数;

第四行输出删除重复元素后的单链表。


Sample Input

10
21 30 14 55 32 63 11 30 55 30



Sample Output

10
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21


#include<stdio.h>

#include<stdlib.h>

struct node

{

    int data;

    struct node *next;

}*head;

struct node *creat(int n)

{

  int i;

  struct node *p;

  head = (struct node *)malloc(sizeof(struct node));

  head-> next = NULL;

  for(i = 1; i <= n; i++)

  {

      p = (struct node *)malloc(sizeof(struct node));

      scanf("%d", &p-> data);

      p-> next = head-> next;

      head-> next = p;

  }

  return head;

}

int deli(struct node *head, int n)

{

    struct node *z, *q, *x;

    int m;

    m = n;

    q = head-> next;

    while(q != NULL)

    {

        x = q-> next;

        z = q;

        while(x != NULL)

        {

            if(q-> data == x-> data)

          {

            z-> next = x-> next;

                                     //若这里加上z = x-> next;则会出现runtime error

                                     //不需要加这句话,因为z的作用就是在x之前即可

            x = z-> next;

            m--;

          }

            else

            {

                z = z-> next;

                x = x-> next;  //这里要保证z总是要在x之前,作为一个追随指针

            }

       }

       q = q-> next;

    }

    return m;

}

void print(struct node *head)

{

    struct node *p;

    p = head-> next;

    while(p != NULL)

    {

        if(p-> next != NULL)

        {

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

        }

        else

        {

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

        }

        p = p-> next;

    }

}

int main(void)

{

    int n;

    int m;

    struct node *h;

    scanf("%d", &n);

    h = creat(n);

    printf("%d\n", n);

    print(h);

    m = deli(h, n);

    printf("%d\n", m);

    print(h);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: