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

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

Time Limit: 1000 ms Memory 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值