完整代码如下:
/*
* @author wanglj
* @date 2020.7.26
*/
#include<iostream>
typedef struct LinkNode {
int data;
LinkNode* next;
}Node;
Node* CreatList(Node* Head) {
Head->next = NULL;
Head->data = -1;
return Head;
}
//前插法
void AddNodefront(Node* Head, int data) {
//为新节点分配内存
Node* Temp = new Node;
Temp->data = data;
Temp->next = Head->next;
Head->next = Temp;
}
//后插法
void AddNodeLast(Node* Head, int data) {
Node* P = Head;
Node* Temp = new Node;
Temp->data = data;
while (P) {
//到最后一个,添加
if (!P->next) {
P->next = Temp;
Temp->next = NULL;
}
//否则,下一个
P = P->next;
}
}
//获取链表长度
int GetLength(Node *Head) {
Node* P = Head->next;
int length = 0;
while (P) {
length++;
P = P->next;
}
return length;
}
//打印链表信息
void show(Node* Head) {
Node* P = Head->next;
std::cout << "链表为:";
while (P) {
if (P->next) {
std::cout << P->data << "->";
}
else {
std::cout << P->data;
}
P = P->next;
}
std::cout << std:: endl;
std::cout << "链表长度为" << GetLength(Head) << std::endl;
}
//查找节点,如果存在多个,返回最小的index
int SearchNode(Node* Head, int target) {
Node* P = Head->next;
int index = 1;
while (P) {
if (P->data != target && P->next) {
index++;
P = P->next;
}
//查找到最后一个没查到
else if (!P->next && P->data != target) {
return -1;
}
else {
return index;
}
}
}
//指定节点之后插入新节点
void AddNode(Node* Head, int data,int insertValue) {
if (SearchNode(Head, data) == -1) {
std::cout << "插入失败,不存在该节点" << std::endl;
}
else {
Node* P = Head;
int index = SearchNode(Head, data);
while (index--) {
P = P->next;
}
//创建新节点
Node* s = new Node;
s->data = insertValue;
s->next = P->next;
P->next = s;
std::cout << "添加成功" << std::endl;
}
}
//删除节点
void DeleteNode(Node* Head,int data) {
if (Head->next == NULL) {
std::cout << "删除失败,链表为空" << std::endl;
}
if (SearchNode(Head, data) == -1) {
std::cout << "删除失败,节点不存在" << std::endl;
}
if (!Head->next) {
return;
}
Node* P = Head;
Node* Q = Head;
//找到对应的节点
while (P->data != data && P->next) {
Q = P;
P = P->next;
}
if (P->data == data) {
Q->next = P->next;
delete P;
std::cout << "删除成功" << std::endl;
}
}
//修改节点值
void ChangeValue(Node* Head,int data,int newData) {
Node* P = Head->next;
if (SearchNode(Head, data) == -1) {
std::cout << "修改失败,节点不存在" << std::endl;
}
else {
while (P) {
if (P->data == data) {
P->data = newData;
}
P = P->next;
}
std::cout << "修改成功!" << std::endl;
}
}
//销毁链表
void DestroyList(Node* Head) {
Node* pListNodeTmp = nullptr;
if ((Head) == nullptr)
{
return;
}
// 循环释放链表中的结点所占内存,清空结束后
while ((Head)->next != nullptr)
{
pListNodeTmp = Head->next;
delete Head;
(Head) = pListNodeTmp;
}
// 清除最后一个结点
if (Head != nullptr)
{
delete Head;
Head = nullptr;
}
}
void DisplayOpt() {
std::cout <<"--------------------------------------------------------"<< std::endl;
std::cout << "请输入对应操作的序号:"<<std::endl;
std::cout << "0:前插法添加节点" << std::endl;
std::cout << "1:后插法添加节点" << std::endl;
std::cout << "2:指定位置添加节点" << std::endl;
std::cout << "3:查找节点,查找失败返回-1,成功返回所在链表位置(1-N)" << std::endl;
std::cout << "4:删除节点" << std::endl;
std::cout << "5:打印链表信息" << std::endl;
std::cout << "6:销毁链表" << std::endl;
std::cout << "7:修改节点值" << std::endl;
std::cout << "8:打印操作提示信息" << std::endl;
std::cout << "9:退出" << std::endl;
std::cout << "--------------------------------------------------------" << std::endl;
}
void Solution() {
int opt = -1;//选择
DisplayOpt();
//创建链表,带头结点
Node* Head = new Node;
Head = CreatList(Head);
while (true) {
std::cout << "请输入您想要的操作:" << std::endl;
std::cin >> opt;
if (opt == 0) {
int n = 0;
std::cout << "请输入添加节点数" << std::endl;
std::cin >> n;
int temp;
std::cout << "请输入节点值,空格隔开" << std::endl;
for (int i = 0; i < n; i++) {
std::cin >> temp;
AddNodefront(Head, temp);
}
}
else if (opt == 1) {
int n = 0;
std::cout << "请输入添加节点数" << std::endl;
std::cin >> n;
int temp;
std::cout << "请输入节点值,空格隔开" << std::endl;
for (int i = 0; i < n; i++) {
std::cin >> temp;
AddNodeLast(Head, temp);
}
}
else if (opt == 2) {
int value;
int newValue;
std::cout << "请输入你想在那个数之后添加新节点:" << std::endl;
std::cin >> value;
std::cout << "请输入你想添加新节点的值:" << std::endl;
std::cin >> newValue;
AddNode(Head, value, newValue);
}
else if (opt == 3) {
std::cout << "请输入要查找的节点值:" << std::endl;
int target;
std::cin >> target;
if (SearchNode(Head, target) != -1) {
std::cout << "该数字在链表的index为:" << SearchNode(Head, target) << std::endl;
}
else {
std::cout << "查找失败" << std::endl;
}
}
else if (opt == 4) {
std::cout << "请输入你想删除的节点:" << std::endl;
int target;
std::cin >> target;
DeleteNode(Head, target);
}
else if (opt == 5) {
show(Head);
}
else if (opt == 6) {
DestroyList(Head);
break;
}
else if (opt == 7) {
int data;
int newData;
std::cout << "输入你想修改的节点值:" << std::endl;
std::cin >> data;
std::cout << "输入你想修改为什么值:" << std::endl;
std::cin >> newData;
ChangeValue(Head, data, newData);
}
else if (opt == 8) {
DisplayOpt();
}
else if (opt == 9) {
break;
}
else {
std::cout << "输入有错误,请重新输入:" << std::endl;
}
}
}
int main() {
Solution();
return 0;
}