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

来源:互联网 发布:平板绘图软件 编辑:程序博客网 时间:2024/06/04 18:00

Problem Description

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

第一行输入元素个数 n (1 <= n <= 15);
第二行输入 n 个整数,保证在 int 范围内。
Output

第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
Example Input

10
21 30 14 55 32 63 11 30 55 30
Example Output

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

Author

不得使用数组!

#include<stdio.h>#include<stdlib.h>struct node{    int data;    struct node *next;};int main(){    int n, i;    struct node *p, *head, *q, *t;    head = (struct node *) malloc (sizeof(struct node));    head -> next = NULL;    scanf("%d", &n);    for(i = 0; i < n; i++)    {        p = (struct node *) malloc (sizeof(struct node));        scanf("%d", &p -> data);        p -> next = head -> next;        head -> next = p;    }    printf("%d\n", n);    p = head -> next;    while(p != NULL)    {        if(p -> next == NULL)            printf("%d\n", p -> data);        else            printf("%d ", p -> data);        p = p -> next;    }    p = head -> next;    while(p && 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;    }    printf("%d\n", n);    p = head -> next;    while(p != NULL)    {        if(p -> next == NULL)            printf("%d\n", p -> data);        else            printf("%d ", p -> data);        p = p -> next;    }    return 0;}
0 0
原创粉丝点击