C++ 记录问答 (程序设计)链表插入与删除
admin
2024-03-21 02:58:44
0

题目

(程序设计)链表插入与删除。读入多行命令,每行只有一个命令,根据命令操作链表,输出最后的链表。
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

相关内容

热门资讯

华强科技业绩快报:2025年度... 上证报中国证券网讯(记者 骆民)华强科技披露业绩快报。公司2025年实现营业总收入6.28亿元,同比...
字节跳动60亿美元出售沐瞳科技... Habby用户总消费突破20亿美元 根据Appmagic的估算,Habby的用户总消费已经突破20...
公司互动丨这些公司披露在电子、... 来源:第一财经 2月25日,多家上市公司通过互动平台、披露投资者关系活动记录表等渠道披露公司在电子、...
国际机构上调金价预期 摩根大通... 据路透社等外媒报道,近日多家国际大型机构发布最新研究报告,上调黄金价格预期。摩根大通于周三更新贵金属...
三只羊否认借壳美股上市,国内业... 2月26日,疯狂小杨哥所属MCN三只羊网络在其官网微博发布声明,回应了近日的“三只羊借壳上市”传闻。...
“离大谱!”广东中山,男子向银... 自己明明按时还款,征信却显示逾期;想贷款扩大生产,却被银行拒之门外;打开手机App一看,好家伙,自己...
英伟达财报“炸裂“,黄仁勋:A... 英伟达以一份打破纪录的财报,试图回击外界对AI泡沫的质疑。2月25日美股盘后,英伟达公布最新财报,营...
三只羊否认“借壳上市”,称系海... 红星资本局2月26日消息,红星资本局从三只羊集团获悉,其发布声明否认“借壳美股上市”传闻。 此前三只...
德邦股份向上交所提出终止上市申... 来源:市场投研资讯 (来源:财闻) 本次终止上市事项最终能否通过相关审批及实施尚存在不确定性,敬请广...
和讯投顾华飞凡:没有涨价潮就没... 今日涨价线几乎全天维持强势,化工、能源金属、半导体、国产算力、商业航天轮番上阵,赚钱效应显著。理解其...
受益金属概念,锂电上下游个股普... 华夏时报记者 胡雅文 北京报道 “有色金属股票和期货一直呈现出很强的联动性,春节前碳酸锂和白银的下跌...
韩国股市又暴涨,2026年涨幅... 2月26日韩国股市继续大涨。 韩国综合股价指数收涨3.67%,报6307.32点,盘中更是创下631...
四点半观市 | 机构:2026... 日韩股市2月26日收盘续创历史新高;深成指窄幅震荡微涨0.19% 算力芯片股午后爆发;中韩半导体ET...
红杉资本合伙人:软件行业具备长... 来源:智通财经网 在人工智能引发新一轮市场震荡之际,红杉资本合伙人兼联席负责人Alfred Lin表...
Shopee跨境走过第一个十年... 跨境电商的发展,从来不是一条既定路线。 不同阶段,行业面对的问题并不相同:有时是“能不能做”,有时是...
雷军马年的第一场直播定档2月2... 2月26日,@小米汽车发文: 2月27日(本周五)晚7点半,@雷军 准备了一场「关于安全」的直播,专...
马年茅台可以按农历生产日期选购... 2月26日,“小茅i茅台”发布,自2026年2月26日(丙午年正月初十)起,在i茅台APP“i购”板...
2026年港美上市政策双向优化... 2026年跨境资本市场政策环境持续优化,中国证监会境外上市备案机制不断完善,港交所与纳斯达克上市规则...
携程总裁、董事,双双辞职 2月26日,携程集团公布2025年第四季度及全年未经审计的财务业绩,同时公布一系列董事变动,范敏辞任...