(程序设计)链表插入与删除。读入多行命令,每行只有一个命令,根据命令操作链表,输出最后的链表。
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;//先移动Ldelete p;//再释放pp = 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,1234int 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,1000int 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