链表D 单链表中重复元素的删除

来源:互联网 发布:java获取文件共享路径 编辑:程序博客网 时间:2024/06/05 12:38

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

#include <stdio.h>#include <stdlib.h>struct node{    int data;    struct node *next;};struct node *creat(int n)  //逆序建链表{    int i;    struct node *head, *p;    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;  //添加一个t指针是为了移动,p先不动,用后面挨个和p比较    p = head->next;    while(p!=NULL)      {        t = p;          q = t->next;        while(q!=NULL)        {            if(q->data == p->data)            {                t->next = q->next;                free(q);                q = t->next;                n--;            }            else            {                t = q;        //t作为q结点的前驱结点,而p结点先不动!                q = q->next;            }        }        p = p->next;    }    return n;}void show(struct node *head, int n){    struct node *p;    int i;    p = head->next;    printf("%d", p->data);    p = p->next;    for(i = 1; i < n; i++)    {        printf(" %d", p->data);        p = p->next;    }    printf("\n");}int main(){    struct node *head;    int n;    scanf("%d", &n);    head = creat(n);           //headprintf的位置不能交换!    printf("%d\n", n);    show(head, n);    n = del(head, n);    printf("%d\n", n);    show(head, n);    return 0;}   
原创粉丝点击