1、任务描述: 编写函数,实现输入一组元素,建立一个带头结点的单链表;对该链表进行非递减排序;实现在非递减有序链表中删除值为x的结点;
2、亮点:
①输入利用cin的返回值来判断(想要结束的时候输入ctrl+Z)
while(cin>>num)
②每个函数在执行前都会判断链表是否为空,增强了实用性
3、运行情况:
4、源代码:
#include <iostream>
#define LinkedListType int
using namespace std;
class LinkedList {
class LinkNode {
public:
LinkedListType date;
LinkNode* next;
};
public:
LinkNode* head = NULL;
bool IsEmpty() {
if (NULL == head)
return true;
return false;
}
void CreatList() {
head = new LinkNode;
head->date = INT_MAX;
head->next = NULL;
int num;
cout << "请输入数据: ";
while (cin >> num) {
LinkNode* tmp = head->next;
head->next = new LinkNode;
head->next->next = tmp;
head->next->date = num;
cout << "请继续输入数据: ";
}
cout << "创建成功!" << endl;
cout << "创建后的结果是:";
Display();
}
void Display() {
if (IsEmpty())
return;
LinkNode* p = head->next;
while (NULL != p) {
cout << p->date << " ";
p = p->next;
}
cout << endl;
}
void InsertSort() {
if (IsEmpty())
return;
LinkNode* start = head;
while (NULL != start->next) {
LinkNode* minNode = head , *pre = start;
for (LinkNode* p = start->next , *q = start; NULL != p; q = p ,p = p->next) {
if (p->date < minNode->date) {
pre = q;
minNode = p;
}
}
pre->next = minNode->next;
LinkNode* tmp = start->next;
start->next = minNode;
minNode->next = tmp;
start = minNode;
}
cout << "排序后的结果是:";
Display();
}
//可以删除所有值为e的结点
void DeleteNode(LinkedListType e) {
if (IsEmpty()) {
cout << "链表为空,无法删除!" << endl;
return;
}
LinkNode* p = head->next , *pre = head;
bool flag = true , isDelete = false;
while (NULL != p) {
if (p->date == e) {
LinkNode* q = p->next;
pre->next = q;
delete p;
p = q;
isDelete = true;
if (flag) {
cout <<"元素"<<e<< "删除成功!" << endl;
flag = false;
}
}
else {
pre = p;
p = p->next;
}
}
if (!isDelete)
cout << "元素" << e << "不存在" << endl;
}
~LinkedList() {
LinkNode* p = head;
if (NULL == p)
return;
LinkNode* q = p->next;
while (NULL != q) {
delete p;
p = q;
q = q->next;
}
delete p;
}
};
int main() {
LinkedList* l = new LinkedList;
l->CreatList();
l->InsertSort();
l->DeleteNode(5);
l->DeleteNode(-1);
cout << "删除后的结果是:";
l->Display();
}