(程序设计)链表插入与删除。读入多行命令,每行只有一个命令,根据命令操作链表,输出最后的链表。
append,100 表示在链表的最后增加一个数据为100的节点
insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
end 表示命令输入结束
输入例子:
append,100
append,101
append,102
append,103
insert,2,1000
delete,1,1000
insert,2,1001
append,1002
end
输出结果:
100 1000 1001 102 103 1002
#include
#include
using namespace std;
//定义单链表节点
using LNode = struct LNode
{
int data;
LNode* next;
};
using ElemType = int;
using LinkList = LNode*;
//初始化单链表
//带头结点的单链表
bool InitListHead(LinkList& L)
{
L = new LNode;
if (L == nullptr)
{
return false;
}
L->next = nullptr;
return true;
}
//按位序插入 在表L中的第i几个位置插入指定元素e
bool ListInsert(LinkList& L, int i, ElemType e)
{
if (i < 1)
{
return false;
}
LNode* p = L;
int j = 0;
while (p != nullptr && j < i - 1) //循环找到i-1节点
{
p = p->next;
j++;
}
if (p == nullptr)
{
return false;
}
LNode* s = new LNode;
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
//删除(带头结点)
bool ListDelete(LinkList& L, int i, ElemType& e)
{
if (i < 1)
{
return false;
}
LNode* p = L;
int j = 0;
while (p != nullptr && j < i - 1)
{
p = p->next;
j++;
}
if (p == nullptr || p->next == nullptr)
{
return false;
}
LNode* q = p->next;
p->next = q->next;
e = q->data;
delete q;
return true;
}
//尾插法
LinkList List_TailInert(LinkList& L, int e)
{
if (L == nullptr)
{
L = new LNode; //建立头结点
L->next = nullptr;
L->data = e;
}
else
{
LNode* r = L; //r为表尾指针
while (r->next != nullptr)
r = r->next;
LNode* s = new LNode; // 插入节点
if (s == nullptr)
{
return s;
}
s->data = e;
s->next = r->next;
r->next = s;
}
return L;
}
/**
* @brief 打印
*/
void print_list(LinkList& L)
{
LinkList temp = L;
while (temp != nullptr)
{
std::cout << temp->data << " ";
temp = temp->next;
}
std::cout << std::endl;
}
//清空链表
void clearList(LinkList& L)
{
LinkList p = L;
while (L)
{
L = L->next;//先移动L
delete p;//再释放p
p = L;//再移动p
}
cout << "链表清空完毕!\n";
}
int main()
{
std::string ch; // 输入命令
int y = 0; // 输入结束符
LinkList L = nullptr; // 链表
do
{
std::cout << "************************************" << std::endl;
std::cout << "\n\t 输入指令 ";
std::cout << "\n 1. append,100 表示在链表的最后增加一个数据为100的节点";
std::cout << "\n 2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点";
std::cout << "\n 3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据";
std::cout << "\n 4. end 表示命令输入结束 \n";
std::cout << "************************************" << std::endl;
std::cout << "\n输入您的选择: ";
std::getline(std::cin, ch);
int nRet = -1;
nRet = ch.find("append");
if (nRet != -1)
{
std::string temp = ch.substr(nRet + 7, ch.size() - 1);
int nData = std::atoi(temp.c_str()); // 截取插入数据
L = List_TailInert(L, nData);
continue;
}
nRet = ch.find("insert");
if (nRet != -1)
{
// insert,10,1234
int nSerach = ch.find(",", nRet); // 确定第1个 "," 位置
int nSerach001 = ch.find(",", nSerach + 1); // 确定第2个 "," 位置
std::string temp = ch.substr(nSerach + 1, nSerach001 - nSerach - 1); // 位置
std::string temp1 = ch.substr(nSerach001 + 1, ch.size() - 1); // 截取插入数据
int nNum = std::atoi(temp.c_str()); // 截取插入数据
int nData = std::atoi(temp1.c_str()); // 位置
bool isInsertFlag = ListInsert(L, nNum, nData);
if (!isInsertFlag)
{
std::cout << "insert error" << std::endl;
}
else
{
std::cout << "insert success! ch =[" << ch << "]" << std::endl;
}
continue;
}
nRet = ch.find("delete");
if (nRet != -1)
{
// delete,5,1000
int nSerach = ch.find(",", nRet); // 确定第1个 "," 位置
int nSerach001 = ch.find(",", nSerach + 1); // 确定第2个 "," 位置
std::string temp = ch.substr(nSerach + 1, nSerach001 - nSerach - 1); // 位置
std::string temp1 = ch.substr(nSerach001 + 1, ch.size() - 1); // 截取插入数据
int nNum = std::atoi(temp.c_str()); // 截取插入数据
int nData = std::atoi(temp1.c_str()); // 位置
bool isInsertFlag = ListDelete(L, nNum, nData);
if (!isInsertFlag)
{
std::cout << "delete error" << std::endl;
}
else
{
std::cout << "delete success! ch =[" << ch << "]" << std::endl;
}
continue;
}
nRet = ch.find("end");
if (nRet != -1)
{
print_list(L);
clearList(L);
y = 0;
break;
}
std::cout << "\n输入有效选项.\n";
} while (y != 1);
return 0;
}
打印输出
************************************
输入指令
1. append,100 表示在链表的最后增加一个数据为100的节点
2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
4. end 表示命令输入结束
************************************
输入您的选择: append,100
************************************
输入指令
1. append,100 表示在链表的最后增加一个数据为100的节点
2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
4. end 表示命令输入结束
************************************
输入您的选择: append,200
************************************
输入指令
1. append,100 表示在链表的最后增加一个数据为100的节点
2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
4. end 表示命令输入结束
************************************
输入您的选择: append,300
************************************
输入指令
1. append,100 表示在链表的最后增加一个数据为100的节点
2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
4. end 表示命令输入结束
************************************
输入您的选择: insert,1,400
insert success! ch =[insert,1,400]
************************************
输入指令
1. append,100 表示在链表的最后增加一个数据为100的节点
2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
4. end 表示命令输入结束
************************************
输入您的选择: delete,1,400
delete success! ch =[delete,1,400]
************************************
输入指令
1. append,100 表示在链表的最后增加一个数据为100的节点
2. insert,10,1234 表示在链表的第10个位置(最前面的位置为0)插入数据为1234的节点
3. delete,5,1000 表示删除第5个节点,后面可能还有一个多余的数据,程序要跳过此数据
4. end 表示命令输入结束
************************************
输入您的选择: end
100 200 300