C++中单链表操作的示例代码

 更新时间:2022年10月26日 11:37:22   作者:我不是秃头sheep  
这篇文章主要为大家详细介绍了C++中单链表操作的示例代码,主要包括单链表的创建、元素的插入和删除等。文中的代码简洁易懂,需要的可以参考一下

任务要求

实现单链表的下列功能:

1、 从键盘输入一组数据,创建单链表;

2、 输出单链表;

3、 插入元素,给出插入成功或失败的信息;

4、 头插,给出插入成功或失败的信息;

5、 尾插,给出插入成功或失败的信息;

6、 删除元素,给出插入成功或失败的信息;

7、 头删,给出插入成功或失败的信息;

8、 尾删,给出插入成功或失败的信息;

9、 打印链表长度。

代码

#include <iostream>
#include <string> 
using namespace std;

// 定义结构体
typedef struct Node {
	int data;		// 数据域
	Node* next;		// 指针域
}Node, *LinkList; 


// 打印菜单
void printMenu() {
	string temp(10, '-');
	cout << temp + temp + temp << endl;
	cout << "\t单链表操作界面\n";
	cout << "\t 1.创建单链表\n";
	cout << "\t 2.打印单链表\n";
	cout << "\t 3.插入结点(指定位置)\n";
	cout << "\t 4.插入结点(头插)\n";
	cout << "\t 5.插入结点(尾插)\n";
	cout << "\t 6.删除结点(指定位置)\n";
	cout << "\t 7.删除结点(头删)\n";
	cout << "\t 8.删除结点(尾删)\n";
	cout << "\t 9.统计链表长度\n";
	cout << temp + temp + temp << endl;
}

// 初始化链表
bool initLinkList(LinkList& L) {
	// 获取要初始化的长度
	cout << "你要初始化的单链表长度:";
	int count;
	cin >> count;

	// 初始化头结点 头结点的数据域存放数据个数
	L = new Node;
	L->next = NULL;
	L->data = count;

	// 根据count 插入数据(尾插法)
	Node* p = L;
	Node* temp;
	for (int i = 0; i < count; i++) {
		temp = new Node;
		cout << "请输入第" + to_string(i+1) + "个数据:";
		cin >> temp->data;
		temp->next = NULL;
		p->next = temp;
		p = p->next;
	}
	return true;
}

// 打印链表
bool printLinkList(LinkList& L) {
	// 判断是否初始化
	if (L == NULL) {
		cout << "未初始化单链表"<<endl ;
		return  false;
	}
	
	// 从首元结点往下一一打印数据
	Node* temp = L->next;
	while (temp != NULL) {
		cout << to_string(temp->data) + " -> ";
		temp = temp->next;
	}

	// 补一个NULL
	cout << "NULL" << endl;
	return true;
}

// 指定位置插入(index范围 1 - n)
bool locationInsert(LinkList& L) {
	// 判断是否初始化
	if (L == NULL) {
		cout << "未初始化单链表" << endl;
		return  false;
	}

	// 获取要插入的位置 范围判断->输入到对为止
	int index;
	while (true) {
		cout << "输入要插入的位置(1~n):";
		cin >> index;
		if (index <= L->data + 1 && index >= 1)break;
		cout << "输入的位置有误" <<endl;
	};

	// 新建节点 获取数据存放到数据域
	Node* temp = new Node;
	cout << "输入要插入的数据:";
	cin >> temp->data;
	
	// p指针向后移动 移动到要插入位置的前一个节点
	Node* p = L;
	for (int i = 1; i < index; i++) {
		p = p->next;
	}

	// 插入操作
	temp->next = p->next;
	p->next = temp;

	// 数据个数+1
	L->data += 1;
	return true;
}

// 头插
bool headInsert(LinkList& L) {
	// 判断是否初始化
	if (L == NULL) {
		cout << "未初始化单链表" << endl;
		return  false;
	}

	// 新建节点 获取数据存放到数据域
	Node* temp = new Node;
	cout << "输入要插入的数据:";
	cin >> temp->data;
	
	// 头插操作
	temp->next = L->next;
	L->next = temp;

	// 数据个数+1
	L->data += 1;
	return true;
}



// 尾插
bool tailInsert(LinkList& L) {
	// 判断是否初始化
	if (L == NULL) {
		cout << "未初始化单链表" << endl;
		return  false;
	}
	// 新建节点 获取数据存放到数据域
	Node* temp = new Node;
	cout << "输入要插入的数据:";
	cin >> temp->data;

	// p指针移动到最后一个节点
	Node* p = L->next;
	while (p->next != NULL){
		p = p->next;
	}

	// 尾插操作
	p->next = temp;
	temp->next = NULL;

	// 数据个数+1
	L->data += 1;
	return true;
}


// 头删
bool headDelete(LinkList& L) {
	// 判断是否有元素
	if (L->data < 1) {
		cout << "单链表没有元素" << endl;
		return  false;
	}

	// 头删操作
	if (L->data > 1) {	// 有多个数据节点
		Node* temp = L->next;
		L->next = L->next->next;
		delete temp;
	}else {				// 只有一个首元结点
		delete L->next;
		L->next = NULL;
	}

	// 数据个数-1
	L->data -= 1;
	return true;
}

// 尾删
bool tailDelete(LinkList& L) {
	// 判断是否有元素
	if (L->data < 1) {
		cout << "单链表没有元素" << endl;
		return  false;
	}
	
	// 尾删操作
	if (L->data > 1) {	// 有多个数据节点
		// 移动p指针到尾结点的前一个节点
		Node* p = L;
		for (int i = 0; i < L->data-1 ; i++) {
			p = p->next;
		}
		// 删除操作
		delete p->next;
		p->next = NULL;
	}else {				// 只有一个首元结点
		delete L->next;
		L->next = NULL;
	}

	// 数据个数-1
	L->data -= 1;
	return true;
}

// 指定位置删除(index范围 1 - n)
bool locationDelete(LinkList& L) {
	// 判断是否有元素
	if (L->data < 1) {
		cout << "单链表没有元素" << endl;
		return  false;
	}
	// 获取要删除的位置 范围判断->输入到对为止
	int index;
	while (true) {
		cout << "输入要删除的位置(1~n):";
		cin >> index;
		if (index <= L->data && index >= 1)break;
		cout << "输入的位置有误" << endl;
	};
	
	if (index == 1) {				// 头删
		headDelete(L);
	}else if (index == L->data) {	// 尾删
		tailDelete(L);
	}else {							// 中间删
		// 将p指针移动到要删除节点的前一个节点
		Node* p = L;
		for (int i = 1; i < index; i++) {
			p = p->next;
		}
		// 删除操作
		Node* temp = p->next;
		p->next = p->next->next;
		delete temp;
		// 数据个数-1
		L->data -= 1;
	}
	return true;
}

// 打印链表长度
bool printLength(LinkList& L) {
	// 判断是否有元素
	if (L == NULL) {
		cout << "未初始化单链表" << endl;
		return  false;
	}
	// 打印头结点的数据
	cout << "链表长度为[" + to_string(L->data) + "]" << endl;
	return true;
}

// 程序主入口
int main() {
	bool flag = true;	// 标记
	int option;			// 操作选项 [0 - 9]
	LinkList L = NULL;	// 初始化链表指针为NULL
	printMenu();		// 打印菜单
	while (flag) {
		cout << "请操作:";
		cin >> option;
		switch (option) {
			case 1: // 初始化
				initLinkList(L);
				printLinkList(L);
				break;
			case 2: // 打印菜单
				printLinkList(L);
				break;
			case 3:	// 指定位置插入
				locationInsert(L);
				printLinkList(L);
				break;
			case 4:	// 头插
				headInsert(L);
				printLinkList(L);
				break;
			case 5:	// 尾插
				tailInsert(L);
				printLinkList(L);
				break;
			case 6:	// 指定位置删除
				locationDelete(L);
				printLinkList(L);
				break;
			case 7:	// 头删
				headDelete(L);
				printLinkList(L);
				break;
			case 8:	// 尾删
				tailDelete(L);
				printLinkList(L);
				break;
			case 9:	// 打印链表长度
				printLength(L); 
				printLinkList(L);
				break;
			case 0:	// 退出
				cout << "成功退出程序!" << endl;
				flag = false;
				break;
			default:// 其他情况
				cout << "操作有误,重新输入!" << endl;
		}
	}
	return 0;
}

运行结果

到此这篇关于C++中单链表操作的示例代码的文章就介绍到这了,更多相关C++单链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言的各类变量和零值的比较详解

    C语言的各类变量和零值的比较详解

    这篇文章主要为大家介绍了C语言的各类变量和零值的比较,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 浅谈C++虚重载操作符 virtual operator= 的使用方法

    浅谈C++虚重载操作符 virtual operator= 的使用方法

    下面小编就为大家带来一篇浅谈C++虚重载操作符 virtual operator= 的使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C语言编写学生成绩管理系统

    C语言编写学生成绩管理系统

    这篇文章主要为大家详细介绍了C语言编写学生成绩管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++学习小结之数据类型及转换方式

    C++学习小结之数据类型及转换方式

    本文给大家分享的是本人在学习C++过程中的一个小心得,关于数据类型和转换方式的,这里记录下来,推荐给菜鸟们,高手大神请直接飘过。
    2015-07-07
  • C++类型转换和IO流操作处理教程

    C++类型转换和IO流操作处理教程

    这篇文章主要给大家介绍了关于C++类型转换和IO流操作处理的相关资料,标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-08-08
  • C语言学生成绩管理系统设计

    C语言学生成绩管理系统设计

    这篇文章主要为大家详细介绍了C语言学生成绩管理系统设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 在clion上配置libtorch开发环境的图文详解

    在clion上配置libtorch开发环境的图文详解

    这篇文章主要介绍了在clion上配置libtorch开发环境的图文详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • C++11中的原子量和内存序详解

    C++11中的原子量和内存序详解

    这篇文章主要给大家介绍了关于C++11中原子量和内存序的相关资料,文中通过示例代码介绍地方非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • 使用C++一步步实现俄罗斯方块

    使用C++一步步实现俄罗斯方块

    本文给大家分享的是作者在使用C++制作俄罗斯方块的时候的思路分析以及开发准备和实验原理,都是些基础的知识储备,希望大家能够喜欢,具体的代码我们下一节再分享给大家
    2017-12-12
  • Linux下Select多路复用实现简易聊天室示例

    Linux下Select多路复用实现简易聊天室示例

    大家好,本篇文章主要讲的是Linux下Select多路复用实现简易聊天室示例,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论