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

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

2018-03-18 16:32 393 查看
书上的例题


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



Hint


Source

不得使用数组!

#include <stdio.H>

#include<string.h>

#include <stdlib.h>

struct node

{

    int data;

    struct node *next;

};

struct node *creat (int n)

{

    struct node *head, *p;

    int i;

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

    head->next=NULL;

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

    {

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

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

        p -> next = head->next;

        head ->next = p ;

    }

    return head;

};

int del(struct node *head, int n)

{

    struct node *p, *q, *t;

    p = head->next;

    while (p->next!=NULL)

    {

        q=p;

        t = q -> next;

        while (t -> next != NULL)

        {

            if (t -> data== p ->data)

            {

                q -> next = t -> next;

                free(t);

                t = q -> next;

                n--;

            }

            else

            {

                q = t;

                t = t -> next;

            }

        }

        if (t -> next== NULL)

        {

            if (t ->data == p ->data)

            {

                q -> next = NULL;

                free(t);

                n--;

            }

        }

        p = p ->next;

    }

    return n;

}

void show(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()

{

    int n , m;

    struct node *head;

    scanf("%d" , &n);

    head = creat(n);

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

    show(head);

    m = del(head , n);

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

    show(head);

    return 0;

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