C++ 记录问答 (程序设计)链表插入与删除

题目

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

你可能感兴趣的:(杂项,c++,算法,数据结构)