下面实现的是升序链表
有序链表的插入就是找到第一个大于或小于的数
主体代码还是比较简单的
主要注意边界问题,例如插入或删除的元素是头元素,要考虑到各种特殊情况
写指针必须理清逻辑,谨慎操作

/**
* @Author: lyle
* @Date: 2021-11-24T20:56:24+08:00
* @Last modified time: 2021-11-25T00:31:56+08:00
*/
#include <bits/stdc++.h>

using namespace std;
struct Node {int data; Node *next;};
struct List {Node *head; int len;};
void addNode(List &fr, int dt) { //升序链表插入节点
Node *pNewNode = new Node; //新建待插入节点
pNewNode->data = dt; pNewNode->next = NULL; //新节点初始化
fr.len++; //链表长度+1
if (fr.head == NULL) { //特判链表为空时
fr.head = pNewNode;
fr.len = 1;
return;
}
Node *pCurNode = fr.head;
if (pCurNode->data > dt) { //特判该元素应该插在链表头部
pNewNode->next = pCurNode;
fr.head = pNewNode;
return;
}
while (pCurNode->next != NULL and pCurNode->next->data < dt) pCurNode = pCurNode->next; //遍历链表,寻找第一个大于dt的元素
pNewNode->next = pCurNode->next; //找到插入位置后插入新节点
pCurNode->next = pNewNode;
}
void output(List& fr) {
if (!fr.len) {cout << "当前链表为空" << endl; return;}
cout << "链表长度:" << fr.len << " 当前链表:";
Node *pCurNode = fr.head;
while (pCurNode != NULL) { //遍历链表输出每个元素
cout << pCurNode->data;
if (pCurNode->next) cout << "->";
pCurNode = pCurNode->next;
}
puts("\n======================================================");
}
void deleteNode(List &fr, int dt) { //删除值为dt的节点
Node *pCurNode = fr.head, *preNode = NULL;
fr.len--;
if (pCurNode->data == dt) { //特判要删除的点是链表元素时
fr.head = pCurNode->next; //将链表元素设为第二个元素
delete pCurNode;
return;
}
while (pCurNode != NULL and pCurNode->data != dt) { //遍历链表寻找该元素
preNode = pCurNode;
pCurNode = pCurNode->next;
}
if (pCurNode == NULL) {cout << "未找到该节点,"; return;}
cout << "删除节点成功,";
preNode->next = pCurNode->next; //将删除元素两头的元素连接起来
delete pCurNode;
}
void deleteList(List &fr) {
puts("清空链表成功");
Node *pCurNode = fr.head, *q = NULL;
while (pCurNode->next != NULL) { //通过q元素挨个节点删除
q = pCurNode->next;
delete pCurNode;
pCurNode = q;
}
delete(pCurNode); //删除最后一个节点
fr.head = NULL; fr.len = 0; //必须重新初始化链表
}

int main(int argc, char const *argv[]) {
List list; list.head = NULL; list.len = 0; //新建链表的初始化
cout << "请构建初始链表,输入元素个数:"; int n, x; cin >> n;
while (n--) cin >> x, addNode(list, x);
cout << "初始链表:"; output(list);
while (1) {
int c, flag = 0;
cout << "选择你的操作:1.添加节点 | 2.删除指定节点 | 3.输出链表元素 | 4.删除链表所有元素 | 5.退出\n";
cin >> c;
switch (c) {
case 1: cin >> c; addNode(list, c); cout << "添加节点成功,"; output(list); break;
case 2: cin >> c; deleteNode(list, c); output(list); break;
case 3: output(list); break;
case 4: deleteList(list); break;
case 5: flag = 1; break;
default: break;
}
if (flag) break;
}
}