题目描述
集合有一个重要的特性:互异性,即集合中任意两个元素都是不同的,互异性使得集合中的元素没有重复。给你 n 个包含重复数字的无序正整数序列,建立一个有序链表,链表中的结点按照数值非降序排列且不包含重复元素,输出该有序链表。
输入
输入包含多组测试数据,对于每组测试数据:
输入的第一行为一个正整数 n(1 ≤ n ≤ 100),
第二行为 n 个正整数 b1,b2,...,bn(0 ≤ bi ≤ 2^30)。
输出
对于每组测试数据,按照非降序输出链表的节点值。
样例
输入:
1
2
2
1 1
6
6 3 5 2 2 3
输出:2
1
2 3 5 6
#include<iostream>
#include<stdio.h>
using namespace std;
struct Node {
int x;
Node* next;
};
Node* creat(Node* head, int n);
void sort(Node* head);
void print(Node* head);
int main()
{
int n;
while (cin>>n)//输入多组数据
{
Node* head = new Node;
head->x = n;
head->next = NULL;
head = creat(head, n);
sort(head);
sort(head);
print(head);
}
return 0;
}
Node* creat(Node* head, int n)
{
int i, m;
Node* p = new Node;
p = head;
for (i = 0; i < n; i++)
{
cin >> m;
Node* q = new Node;
q->x = m;
q->next = NULL;
p->next = q;
p = p->next;
}
return head;
}
void sort(Node* head)
{
int i,j,m;
Node *temp1=new Node;
temp1 = head;
Node* p = new Node;
p = head;
Node* q = new Node;
q = head;
for (i = 0; i < head->x-1; i++)
{
temp1 = temp1->next;
p = temp1;
q = temp1;
for (j = i + 1; j < head->x; j++)
{
if (p->x == q->next->x) {
Node* m = new Node;
m = q->next;
q->next= m->next;
head->x--;
delete m;
continue;
}
q = q->next;
if (p->x > q->x) {
m = p->x;
p->x = q->x;
q ->x= m;
}
}
}
}
void print(Node* head)
{
int i;
Node* p = head;
for (i = 1; i <head->x; i++)
{
p = p->next;
cout << p->x << " ";
}
p=p->next;
cout <<p->x<< endl;
}