链表的使用(迭代更新版本)

这篇博客详细介绍了单链表的使用,包括链表的定义、初始化、前插法和尾插法插入元素、按值查找、删除指定位置元素以及遍历链表的操作。提供了完整的C++代码实现,并通过示例进行验证,展示了如何在单链表中插入、查找、删除和打印元素。
摘要由CSDN通过智能技术生成

单链表的使用一应俱全

(欢迎提出问题,意见)

1.链表的定义:

typedef struct _LinkNode{
	int data;					//结点的数据域
	struct _LinkNode *next;		//链表结点,链表
}LinkNode ,LinkList;			//链表结点,链表

2.链表的初始化

bool InitList(LinkList* &L){	//构造一个空的单链表L
	L=new LinkNode;	//生成新的结点作为头结点,用头指针L指向头结点
	if(!L)return false;	//生成结点失败
	L->next=NULL;		//头结点的指针域置空
	L->data=-1;
	return true;
}

3.链表的前插法(两种版本):
1

//前插法
bool ListInsert_font(LinkList*& L, int e) {
	LinkNode* s;
	if (!L) return false;
	s = new LinkNode;
	s->data = e;
	s->next = L->next;
	L->next = s;
	return true;
}

2是插入一个结点

//前插法
bool ListInsert_font(LinkList* &L,LinkNode * node){
	if(!L||!node)return false;
	node->next=L->next;
	L->next=node;
	return true;
}

4.尾插法:(两种版本)
1.

//尾插法
bool ListInsert_back(LinkList*& L, int e) {
	LinkNode* last = NULL;
	LinkNode* s;
	if (!L) return false;
	last = L;
	while (last->next) last = last->next;
	s = new LinkNode;
	s->data = e;
	s->next = NULL;
	last->next = s;
	return true;
}

2:是插入一个结点

//尾插发
bool ListInsert_back(LinkList *&L,LinkNode *node){
	LinkNode* last = NULL;
	if(!L||!node)return false;
	//找到最后一个节点
	last = L;
	while(last->next) last=last->next;

	//新的结点链接到尾部
	node->next=NULL;
	last->next=node;
	return true;
}

5.指定位置的插入

//指定位置的插入
bool LinkInsert(LinkList*& L, int i, int& e) {  
	if (!L)return false;
	int j=0;
	LinkList* p, * s;
	p = L;

	while (p && j < i - 1) //查找第 i-1 个结点,p 指向该结点
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1) {//i>n+1 或者 i<1
		return false;
	}
	s = new LinkNode; //生成新结点 
	s->data=e; //将新结点的数据域置为 e
	s->next = p->next; //将新结点的指针域指向结点 ai 
	p->next=s; //将结点 p 的指针域指向结点 s 
	return true;
}

6.单链表的取值

bool Link_GetElem(LinkList*& L, int i, int& e)//单链表的取值
{
	int j;
	LinkList* p;
	if (!L || !L->next) return false;

	p = L->next;//p 指向第一个结点, 
	j=1; //j 为计数器
	while (j < i && p) {
		p = p->next;
		j++;
	}
	if (!p || j > i) {
		return false;
	}
	e = p->data;
	return true;
}

7.按值查找

bool Link_FindElem(LinkList* L, int e,int &index) //按值查找    index为位置
{
	LinkList* p;
	p = L->next;
	index = 1;
	while (p && p->data != e) {
		p = p->next;
		index++;
	}
	if (!p) {
		index = 0;
		return false;
	}
	return true;
}

8.单链表的删除

bool LinkDelete(LinkList*& L, int i) //单链表的删除
{
	//在带头结点的单链表 L 中,删除第 i 个位置 
	LinkList *p, *q;
	int j; 
	p = L; 
	j = 0;

	if (!L || !L->next) {   //合法性检查
		return false;
	}

	while ((p->next) && (j < i - 1)) //查找第 i-1 个结点,p 指向该结点
	{
		p = p->next; 
		j++;
	}
	if (!(p->next) || (j > i - 1))//当 i>n 或 i<1 时,删除位置不合理
		return false;
	q = p->next;                //临时保存被删结点的地址以备释放空间
	p->next = q->next;          //改变删除结点前驱结点的指针域
	delete q;     //释放被删除结点的空间 
	return true;
}

9.单链表的销毁

void LinkDestroy(LinkList*& L) //单链表的销毁; 
{
	LinkList* p = L;
	cout << "销毁链表!" << endl;

	while (p) {
		L = L->next; //L 指向下一个节点
		cout << "删除元素: " << p->data << endl;
		delete p; //删除当前节点 
		p=L; //p 移向下一个节点
	}
}

10.单链表的遍历

void LinkPrint(LinkList*& L) {
	LinkNode* p = NULL;

	if (!L) {
		cout << "链表为空" << endl;
		return;
	}
	p = L->next;
	while (p){
		cout << p->data << "\t";
		p = p->next;
	}
	cout << endl;
}

用下面代码可以进行验证

#include <iostream>

using namespace std;


int main(void) {
	LinkList* L = NULL;
	LinkList* s = NULL;
	//1.初始化一个空的链表
	InitList(L);

	//2.使用前插法插入数据
	int n;
	int e=0;
	cout << "前插法创建单链表" << endl;
	cout << "请输入元素的个数n" << endl;
	cin >> n;
	cout << "请依次输入n个元素的个数: "<< endl;
	for (int i = 0; i < n; i++) {
		cin >> e;
		ListInsert_font(L, e);
	}
	LinkPrint(L);

	//3.使用尾插法插入数据
	//int n;
	cout << "尾插法创建单链表" << endl;
	cout << "请输入元素的个数n" << endl;
	cin >> n;
	cout << "请依次输入n个元素的个数: " << endl;
	for(int i=0;i<n;i++){
		cin >> e;
		ListInsert_back(L, e);
	}

	//4.单链表的输出
	LinkPrint(L);

	//5.任意位置插入元素
	for (int j = 0; j < 3; j++) {
	int i, x;
	cout << "请输入插入的位置和元素:";
	cin >> i >> x;

	if (LinkInsert(L, i, x)) {
		cout << "插入成功" << endl;
	}else {
		cout << "插入失败" << endl;
	}
	LinkPrint(L);
	}

	//6.根据位置获取元素
	int element = 0;
	if (Link_GetElem(L, 2, element)) {
		cout << "获取第二个元素成功,值: " << element << endl;
	}
	else {
		cout << "获取第二个元素失败" << endl;
	}

	//7.单链表根据值查询所在的位置
	int index = 0;
	if (Link_FindElem(L, 10, index)) {
		cout << "查找元素10存在,所在位置: " << index << endl;
	}
	else {
		cout << "不存在元素  10" << endl; 
	}

	//8.删除元素
	if (LinkDelete(L, 2)) {
		cout << "删除第二个元素" << endl;
		LinkPrint(L);
	}
	else {
		cout << "删除第二个元素失败" << endl;
	}

	//9.单链表销毁
	LinkDestroy(L);

	system("pause");
	return 0;
}

在任意位置进行插入
在这里插入图片描述
前插法
在这里插入图片描述
尾插发
在这里插入图片描述

#include <iostream>

using namespace std;


//单链表的初始化
typedef struct _LinkNode {
	int data;//结点的数据域
	struct _LinkNode* next;//结点的指针域
}LinkNode,LinkList;//链表节点、链表

bool InitList(LinkList*& L) {
	L = new LinkNode;
	if (!L)return false;//生成结点失败

	L->next = NULL;
	L->data = -1;
	return true;
}

//前插法
bool ListInsert_font(LinkList*& L, LinkNode* node) {
	if (!L || !node) return false;
	node->next = L->next;
	L->next = node;
	return true;
}

//后插法
bool ListInsert_back(LinkList*& L, LinkNode* node) {
	LinkNode* last = NULL;

	if (!L || !node) return false;

	last = L;
	while (last->next) last = last->next;

	node->next = NULL;
	last->next = node;
	return true;
}

//指定位置的插入
bool LinkInsert(LinkList*& L, int i, int& e) {  
	if (!L)return false;
	int j=0;
	LinkList* p, * s;
	p = L;

	while (p && j < i - 1) //查找第 i-1 个结点,p 指向该结点
	{
		p = p->next;
		j++;
	}
	if (!p || j > i - 1) {//i>n+1 或者 i<1
		return false;
	}
	s = new LinkNode; //生成新结点 
	s->data=e; //将新结点的数据域置为 e
	s->next = p->next; //将新结点的指针域指向结点 ai 
	p->next=s; //将结点 p 的指针域指向结点 s 
	return true;
}

bool Link_GetElem(LinkList*& L, int i, int& e)//单链表的取值
{
	int j;
	LinkList* p;
	if (!L || !L->next) return false;

	p = L->next;//p 指向第一个结点, 
	j=1; //j 为计数器
	while (j < i && p) {
		p = p->next;
		j++;
	}
	if (!p || j > i) {
		return false;
	}
	e = p->data;
	return true;
}

bool Link_FindElem(LinkList* L, int e,int &index) //按值查找    index为位置
{
	LinkList* p;
	p = L->next;
	index = 1;
	while (p && p->data != e) {
		p = p->next;
		index++;
	}
	if (!p) {
		index = 0;
		return false;
	}
	return true;
}

bool LinkDelete(LinkList*& L, int i) //单链表的删除
{
	//在带头结点的单链表 L 中,删除第 i 个位置 
	LinkList *p, *q;
	int j; 
	p = L; 
	j = 0;

	if (!L || !L->next) {   //合法性检查
		return false;
	}

	while ((p->next) && (j < i - 1)) //查找第 i-1 个结点,p 指向该结点
	{
		p = p->next; 
		j++;
	}
	if (!(p->next) || (j > i - 1))//当 i>n 或 i<1 时,删除位置不合理
		return false;
	q = p->next;                //临时保存被删结点的地址以备释放空间
	p->next = q->next;          //改变删除结点前驱结点的指针域
	delete q;     //释放被删除结点的空间 
	return true;
}

void LinkDestroy(LinkList*& L) //单链表的销毁; 
{
	LinkList* p = L;
	cout << "销毁链表!" << endl;

	while (p) {
		L = L->next; //L 指向下一个节点
		cout << "删除元素: " << p->data << endl;
		delete p; //删除当前节点 
		p=L; //p 移向下一个节点
	}
}

void LinkPrint(LinkList*& L) {
	LinkNode* p = NULL;

	if (!L) {
		cout << "链表为空" << endl;
		return;
	}
	p = L->next;
	while (p){
		cout << p->data << "\t";
		p = p->next;
	}
	cout << endl;
}

int main(void) {
	LinkList* L = NULL;
	LinkList* s = NULL;
	//1.初始化一个空的链表
	InitList(L);

	//2.使用前插法插入数据
	int n;
	cout << "前插法创建单链表" << endl;
	cout << "请输入元素的个数n" << endl;
	cin >> n;
	cout << "请依次输入n个元素的个数: "<< endl;
	while (n > 0) {
		s = new LinkNode;//生成新结点s
		cin >> s->data;
		ListInsert_font(L, s);
		n--;
	}

	//3.使用尾插法插入数据
	//int n;
	cout << "尾插法创建单链表" << endl;
	cout << "请输入元素的个数n" << endl;
	cin >> n;
	cout << "请依次输入n个元素的个数: " << endl;
	while (n > 0) {
		s = new LinkNode;//生成新结点s
		cin >> s->data;
		ListInsert_back(L, s);
		n--;
	}

	//4.单链表的输出
	LinkPrint(L);

	//5.任意位置插入元素
	for (int j = 0; j < 3; j++) {

	int i, x;

	cout << "请输入插入的位置和元素:";
	cin >> i >> x;

	if (LinkInsert(L, i, x)) {
		cout << "插入成功" << endl;
	}else {
		cout << "插入失败" << endl;
	}
	LinkPrint(L);
	}

	//6.根据位置获取元素
	int element = 0;
	if (Link_GetElem(L, 2, element)) {
		cout << "获取第二个元素成功,值: " << element << endl;
	}
	else {
		cout << "获取第二个元素失败" << endl;
	}

	//7.单链表根据值查询所在的位置
	int index = 0;
	if (Link_FindElem(L, 10, index)) {
		cout << "查找元素10存在,所在位置: " << index << endl;
	}
	else {
		cout << "不存在元素  10" << endl; 
	}

	//8.删除元素
	if (LinkDelete(L, 2)) {
		cout << "删除第二个元素" << endl;
		LinkPrint(L);
	}
	else {
		cout << "删除第二个元素失败" << endl;
	}

	//9.单链表销毁
	LinkDestroy(L);

	system("pause");
	return 0;
}


链表的初始化,链表的尾插发,链表的首插法,请输入链表要输入的位置和元素.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Respect@

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

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

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

打赏作者

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

抵扣说明:

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

余额充值