《数据结构与算法A》实验1:按数据元素升序建立单链表
描述
对输入的正整数序列建立有序单链表。在建立单链表的过程中,链表中的数据元素按升序排列。当输入的数据元素在单链表中> 已经存在时,不进行插入操作。
请使用面向对象形式定义结点类和链表类,参考代码如下。
class Node
{
int data;
Node* next;
...
friend class LinkList; //声明友元类,以便在LinkList类中可以访问Node类的私有成员。
};
class LinkList
{
Node* head;
int size;
public:
....
};
输入
每行一个正整数,当输入-1时结束。
输出
将建立好的升序单链表所有元素按从小到大的顺序依次输出。
样例输入
100
50
200
150
75
10
300
200
100
400
-1
样例输出
10
50
75
100
150
200
300
400
样例代码
#include<iostream>
using namespace std;
//创建节点类
class Node
{
int data;
Node* next;
//结点初始化
Node(int num = 0)
{
next = NULL;
data = num;
}
//将LinkList声明为Node的友元类
friend class LinkList;
};
//链表类
class LinkList
{
Node *head;
int size;
public:
LinkList();
~LinkList();
void insert(int);
void show();
};
//初始化链表
LinkList::LinkList()
{
//初始化头结点
head = new Node();
//初始化链表大小
size = 0;
}
//销毁链表
LinkList::~LinkList()
{
//释放头结点
delete head;
head = NULL;
size = 0;
}
//插入头结点
void LinkList::insert(int number)
{
Node *q, *p, *s;
s = new Node(number);
q=head,p=head->next;
//查找要插入的位置
for(;p;q = p,p = p->next)
{
//如果相同的就不用插入了
if(p->data == number) break;
//如果有比要插入数据大的,就插入
if(p->data > number)
{
s->next = p;
q->next = s;
break;
}
}
//当数据最大或者链表里没数据时,接在最后
if(p == NULL)
{
q->next=s;
}
size++;
}
//链表的遍历
void LinkList::show()
{
Node *p = head->next;
while(p)
{
cout << p->data << endl;
p = p->next;
}
}
int main()
{
int number;
//创建链表
LinkList link;
//循环输入数据
while(cin >> number)
{
//当为-1时停止
if(number == -1) break;
//不然就插入数据
else link.insert(number);
}
//展示链表
link.show();
}