Description |
根据输入建立单链表,并删除表中的重复出现元素,使得表中的元素各不相同。 说明: 输入的第一行为结点数,第二行为各结点的值 输出为(按输入顺序)各不相同元素值。 |
Sample Input |
6 22 32 22 30 30 21 |
Sample Output |
22 32 30 21 |
Hint |
输出有换行符。 |
#include <iostream>
#include <stdio.h>
#define Max_size 1005
using namespace std;
int v[Max_size];
typedef struct Lnode
{ // 定义存储结构
int data, length;
Lnode *next;
} Lnode, *Linklist;
void creatlist_r(Linklist &L, int len)
{ // 尾插
L = new Lnode;
L->next = NULL;
Lnode *q = new Lnode;
q = L;
for (int i = 0; i < len; i++)
{ // 每次向后链
Lnode *p = new Lnode;
cin >> p->data;
q->next = p;
p->next = NULL;
q = p;
}
L->length = len;
}
void listdelete(Linklist &L)
{
Lnode *p = new Lnode;
p = L;
int j = 0, cnt;
while (p->next)
{
cnt = 0;//指针后移是否中断
//因为删除操作相当于后移
v[j] = p->next->data;//辅助数组记录指针所指的值
for (int i = 0; i < j; i++)
{//只需要比较j前面的元素与他是否相同
if (v[j] == v[i])
{
cnt = 1;
Lnode *q = new Lnode;
q = p->next;
p->next = q->next;
delete q;
L->length--;
}
}
if (cnt == 0)
p = p->next;
++j;
}
}
void Print(Linklist L)
{ // 输出链表
Lnode *p = new Lnode;
p = L->next;
int m = 0;
while (p)
{
cout << p->data;
if (m != L->length - 1)
cout << " ";
m++;
p = p->next;
}
cout << "\n";
}
int main()
{
Linklist L;
int n;
cin >> n;
creatlist_r(L, n);
listdelete(L);
Print(L);
return 0;
}