//
// main.cpp
// List:
// 链表的操作:
// 1.头插入
// 2.尾插入建立链表;
// 3.遍历链表;
// 4.链表是否为空
// 5.清空链表
// 6.求链表的长度
// 7.排序
// 8.插入结点
// 9.删除结点:记得要释放删除节点的存储空间,避免内存泄漏
// 10.将链表逆置
// 11.退出
#include <iostream>
using namespace std;
struct Node { // 结点定义
int data; // 数据域
Node *next; // 指针域:指向下一个结点
};
// 头插入建立链表:引入头结点(不存放数据的结点,为了方便对链表操作)
// 注意区分头结点和首结点(链表中第一个存放有效数据的结点,即头结点指向的下一个结点)
Node *headCreate() {
int len, val; // val临时存放用户输入的结点的值
// 动态分配内存空间,
Node *head = new Node(); // 头结点
head->next = NULL;
if(head == NULL) {
cerr << "申请空间失败,程序终止!" << endl;
exit(1);
}
cout << "请输入你需要生成的链表结点的个数:";
cin >> len;
cout << "请输入各个结点的值:";
for(int i = 0; i < len; i++) {
cin >> val;
Node *newNode = new Node(); // 新结点
if(newNode == NULL) {
cerr << "申请空间失败,程序终止!" << endl;
exit(1);
}
newNode->data = val;
// 因为head是头结点(指向首结点),所以新结点应该挂入到原头结点指向
// 的下一个有效结点(即首结点)前面,成为新的首结点
newNode->next = head->next; // 先保存原首结点
// 头结点往前移,永远都是头结点
// 注意,因为头结点是不存放数据的,所以是head->next 指向新结点
head->next = newNode; // 挂入到头结点的下一个结点,成为新的首结点
}
return head; // 把头结点返回
}
// 尾插入建立链表
Node *tailCreate() {
int len, val; // val临时存放用户输入的结点的值
// 动态分配内存空间,引入头结点(不存放数据的结点,为了方便对链表操作)
Node *head = new Node();
Node *tail = head; // 尾结点,跟着链表走
t