题目:设单链表以非递减有序列,设计算法实现在单链表中删除值相同的多余结点
C++是实现如下:
#include <iostream>
using namespace std;
struct Node
{
int data;
Node *next;
};
class LinkList
{
public:
LinkList();//初始化空链表
LinkList(int b[], int n);//初始化单链表
void Order(int a[], int n);//对输入的序列排序
void Check();//查找相同元素并从删除多余元素
void PrintList();//输出单链表元素
private:
Node *first;
int trash[10];//储存被删除的元素
static int t;//记录删除元素数个数
};
LinkList::LinkList()
{
first = new Node;
first->next = NULL;
}
LinkList::LinkList(int b[], int n)
{
Order(b,10);//对得到的序列进行排序
Node *s,*r;
first = new Node; r = first;
for (int i = 0; i < n; i++)
{
s = new Node; s->data = b[i];
r->next = s; r = s;
}
r->next = NULL;
}
void LinkList::Check()
{
t = 0;//删除元素个数为t+1
Node *p, *q;
p = first;
if (first->next == NULL)
cout << "该链表空链表!";
else
{
while (p->next !=NULL)//比较终止条件
{
if (p->data == p->next->data)//判断相邻结点的数据域的值是否相等
{
q = p->next;
p->next = q->next;//q作为中间指针,用来删除对应的结点,删除时删除值相同的两个结点中后一个结点
trash[t++] = p->data;//储存删除的元素
delete q;
}
else p = p->next;//p指针所指结点与后一结点值不相同时p指针后移
}
}
}
void LinkList::PrintList()
{
Node *r;
r = first->next;
while (r != NULL)
{
cout << r->data<<'\t';
r = r->next;
}
cout << endl;
}
void LinkList::Order(int a[], int n)//对输入的数据排序,冒泡排序
{
int i, temp, work;
for (int pass = 1; pass < n; pass++)
{
work = 1;
for (i = 0; i < n - pass; i++)
if (a[i] >= a[i + 1])//升序排序
{
temp = a[i];
a[i] = a[i + 1];
a[i + 1] = temp;
work = 0;
}
if (work)break;
}
}
int main()
{
int a[10];
cout << "请输入:"<<endl;
for (int i = 0; i < 10; i++)
cin >> a[i];
LinkList L(a, 10);
cout << endl << "删除前:";
L.PrintList();
L.Check();
cout << endl << "删除后:";
L.PrintList();
return 0;
}