数据结构实验之链表七:单链表中重复元素的删除
Problem Description
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。
Input
第一行输入元素个数 n (1 <= n <= 15);
第二行输入 n 个整数,保证在 int 范围内。
Output
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
Sample Input
10 21 30 14 55 32 63 11 30 55 30
Sample 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;
}*head;
struct node *creat(int n)
{
int i;
struct node *p;
head = (struct node *)malloc(sizeof(struct node));
head-> next = NULL;
for(i = 1; i <= n; i++)
{
p = (struct node *)malloc(sizeof(struct node));
scanf("%d", &p-> data);
p-> next = head-> next;
head-> next = p;
}
return head;
}
int deli(struct node *head, int n)
{
struct node *z, *q, *x;
int m;
m = n;
q = head-> next;
while(q != NULL)
{
x = q-> next;
z = q;
while(x != NULL)
{
if(q-> data == x-> data)
{
z-> next = x-> next;
//若这里加上z = x-> next;则会出现runtime error
//不需要加这句话,因为z的作用就是在x之前即可
x = z-> next;
m--;
}
else
{
z = z-> next;
x = x-> next; //这里要保证z总是要在x之前,作为一个追随指针
}
}
q = q-> next;
}
return m;
}
void print(struct node *head)
{
struct node *p;
p = head-> next;
while(p != NULL)
{
if(p-> next != NULL)
{
printf("%d ", p-> data);
}
else
{
printf("%d\n", p-> data);
}
p = p-> next;
}
}
int main(void)
{
int n;
int m;
struct node *h;
scanf("%d", &n);
h = creat(n);
printf("%d\n", n);
print(h);
m = deli(h, n);
printf("%d\n", m);
print(h);
return 0;
}