think: 1逆序建立链表(元素逆序输出)+链表的查询操作(重复元素查询)+链表的删除操作(重复元素删除)
sdut原题链接
数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000MS Memory Limit: 65536KB
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 不得使用数组!
以下为accepted代码
#include <stdio.h> #include <stdlib.h> struct node { int Data; struct node *next; }*head; int cnt; void Build(int n);//逆序建立链表 void Delete(struct node *h);//链表内重复元素的删除 void Pri(struct node *h);//链表内元素的输出 int main() { int n; while(scanf("%d", &n) != EOF) { cnt = 0; head = (struct node *)malloc(sizeof(struct node)); head->next = NULL; Build(n); printf("%d\n", n); Pri(head); Delete(head); printf("%d\n", n - cnt); Pri(head); } return 0; } void Build(int n)//逆序建立链表 { int i; struct node *p; for(i = 0; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%d", &p->Data); p->next = head->next; head->next = p; } } void Pri(struct node *h)//链表内元素的输出 { struct node *p; p = h->next; while(p != NULL) { printf("%d%c", p->Data, p->next == NULL? '\n': ' '); p = p->next; } } void Delete(struct node *h)//链表内重复元素的删除 { struct node *ans, *q, *p; ans = h->next; while(ans != NULL) { if(ans->next != NULL) { p = ans->next; q = ans; while(p != NULL) { if(p->Data == ans->Data)//判断是否属于重复元素 { q->next = p->next; free(p);//释放重复元素结点 cnt++; p = q->next; } else { q = p;//延链表更新 p = p->next;//延链表更新 } } } ans = ans->next;//延链表更新 } } /*************************************************** User name: Result: Accepted Take time: 0ms Take Memory: 108KB Submit time: 2017-03-09 15:31:38 ****************************************************/