题目描述
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
输入
第一行输入元素个数n;
第二行输入n个整数。
第二行输入n个整数。
输出
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
示例输入
10 21 30 14 55 32 63 11 30 55 30
示例输出
10 30 55 30 11 63 32 55 14 30 21 7 30 55 11 63 32 14 21
#include <stdio.h> #include <string.h> #include <stdlib.h> struct shulie { int shu; struct shulie *sh; }; int main() { struct shulie *head = NULL; struct shulie *bl = NULL; struct shulie *tmp = NULL; struct shulie *p = NULL; int n,i,m; scanf("%d",&m); for(i = 0; i<m; i++) { scanf("%d",&n); bl = (struct shulie *)malloc(sizeof(struct shulie)); bl ->sh = head; bl ->shu = n; head = bl; } printf("%d\n",m); bl = head; i = 0; while(bl != NULL) { if(i == 0) printf("%d",bl ->shu); else printf(" %d",bl ->shu); bl = bl ->sh; i++; } bl = head; while(bl != NULL) { p = bl; tmp = p ->sh; while(tmp != NULL) { if(bl ->shu == tmp ->shu) { p ->sh = tmp ->sh; m--; free(tmp); tmp = p->sh; } else { p = tmp; tmp = tmp ->sh; } } bl = bl ->sh; } printf("\n%d\n",m); bl = head; i = 0; while(bl != NULL) { if(i == 0) printf("%d",bl ->shu); else printf(" %d",bl ->shu); bl = bl ->sh; i++; } return 0; }