C++ 单链表

完整代码如下: 

/*
* @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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w͏l͏j͏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值