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

来源:互联网 发布:英雄联盟官方代练 知乎 编辑:程序博客网 时间:2024/06/06 15: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>typedef struct node{    int data;    struct node *next;}ST;int j = 0, o = 0;ST *creat(int n){    ST *tail, *p, *head;    head = (ST *)malloc(sizeof(ST));    head->next = NULL;    tail = head;    while(n--)    {        p = (ST *)malloc(sizeof(ST));        scanf("%d", &p->data);        p->next = tail->next;        tail->next = p;    }    return head;}int Delete(ST *head, int n){   ST *tail, *p, *q;   for(tail = head->next; tail; tail = tail->next)   {       for(p = tail, q = tail->next; q;)       {           if(q->data == tail->data) {                p->next = q->next;                free(q);                q = p->next;                n--;           }           else p = q, q = q->next;       }   }   return n;}void input(ST *head){    ST *tail;    for(tail = head->next; tail != NULL; tail = tail->next)    {        printf("%d", tail->data);        if(tail->next != NULL) printf(" ");        else printf("\n");    }}int main(){    ST *head;    int n;    scanf("%d", &n);    head = creat(n);    printf("%d\n", n);    input(head);    n = Delete(head, n);    printf("%d\n", n);    input(head);    return 0;}
阅读全文
0 0