一篇文章,让你真正弄懂动态链表(c++版本)

本文介绍了链表这一数据结构的基本概念及其应用场景,并详细讲解了如何使用C++实现单链表,包括创建、插入、获取、删除节点及打印链表等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

链表基本概念(先弄清楚概念才能写出代码):

链表是一种常见的数据结构,我们经常会使用数组来存放数据,但使用数组时,要先指定数组的大小,如果向这个数组加入过多的元素,则会超出,导致无法保存数据;如果数据太小,又会非常浪费内存空间。

所以,我们希望有一种存储方式,其储存的元素个数是不受限定的,当进行添加元素时,存储的个数也会增加,这种储存方式就是链表。

在链表中,有一个头指针head变量,用这个指针变量保存第一个元素的地址,其中,这个元素包括两个部分:数据部分和指针部分。数据部分用来存放元素的数据,指针部分用来指向下一个元素。于是,头指针指向第一个元素,第一个元素中的指针又指向第二个元素,第二个元素中的指针又指向第三个元素,依次下去,到了最后一个元素的指针就指向Null,表示指向的地址为空。

头指针:head

头结点:在单链表的第一个结点之前附设的一个结点。他的数据域可以不存储任何信息,也可以存储如线性表的长度等类的附加信息。头结点的指针域指向首元结点。并且头结点不计入链表的长度。

首元结点:指链表中用来存储数据元素的结点中的第一个结点。

作用:允许在任意位置插入和删除结点,插入删除快速,当需要多次插入删除时。

实现动态链表

 结点声明

template<class elemtype>
struct node
{
	elemtype data;
	node<elemtype>* next;
};

 单链表类模板

​
template<class elemtype>
class linklist
{
public:
	linklist();
	void insert(int i, elemtype x);
	int length();
	void printlist();
	elemtype get(int i);
	~linklist();
private:
	node<elemtype>* head;
};

​

 各类函数实现

//创建操作
template<class elemtype>
linklist<elemtype>::linklist()
{
	head = new node<elemtype>;
	head->next = NULL;
}
//插入操做
template<class elemtype>
void linklist<elemtype>::insert(int i, elemtype x)
{
	node<elemtype>* p = head;
	int count = 0;
	while (count<i-1&&p!=NULL)
	{
		p = p->next;
		count++;
	}
	if (p != NULL)
	{
		node<elemtype>* s = new node<elemtype>;
		s->data = x;
		s->next = p->next;
		p->next = s;
	}
}
//返回长度
template<class elemtype>
int linklist<elemtype>::length()
{
	node<elemtype>* p = head->next;
	int count = 1;
	while (p->next != NULL)
	{
		p = p->next;
		count++;
	}
	return count;
}
//打印
template<class elemtype>
void linklist<elemtype>::printlist()
{
	node<elemtype>* p = head->next;
	while (p != NULL)
	{
		cout << p->data<<" ";
		p = p->next;
		
	}
}
//获取下标
template<class elemtype>
elemtype linklist<elemtype>::get(int i)
{
	node<elemtype>* p = head->next;
	int count = 1;
	while (count < i && p != NULL)
	{
		p = p->next;
		count++;
	}
	if (p != NULL)
		return p->data;
	else
		cout << "参数非法" << endl;
}
//析构函数
template<class elemtype>
linklist<elemtype>::~linklist()
{
	while (head != NULL)
	{
		node<elemtype>* p = head;
		head = head->next;
		delete p;
	}
}

单链表模板

//结点
template<class elemtype>
struct node
{
	elemtype data;
	node<elemtype>* next;
};
//类模板
template<class elemtype>
class linklist
{
public:
	linklist();
	void insert(int i, elemtype x);//第i位置插入x
	int length();//返回链表长度
	void printlist();//打印链表
	elemtype get(int i);//下标获取
	void Delete(int i);//删除第i个结点
	~linklist();
private:
	node<elemtype>* head;
};
//创建操作
template<class elemtype>
linklist<elemtype>::linklist()
{
	head = new node<elemtype>;
	head->next = NULL;
}
//插入操做
template<class elemtype>
void linklist<elemtype>::insert(int i, elemtype x)
{
	node<elemtype>* p = head;
	int count = 0;
	while (count < i - 1 && p != NULL)
	{
		p = p->next;
		count++;
	}
	if (p != NULL)
	{
		node<elemtype>* s = new node<elemtype>;
		s->data = x;
		s->next = p->next;
		p->next = s;
	}
}
//返回长度
template<class elemtype>
int linklist<elemtype>::length()
{
	node<elemtype>* p = head->next;
	int count = 1;
	while (p->next != NULL)
	{
		p = p->next;
		count++;
	}
	return count;
}
//打印
template<class elemtype>
void linklist<elemtype>::printlist()
{
	node<elemtype>* p = head->next;
	while (p != NULL)
	{
		cout << p->data << " ";
		p = p->next;

	}
}
//获取下标
template<class elemtype>
elemtype linklist<elemtype>::get(int i)
{
	node<elemtype>* p = head->next;
	int count = 1;
	while (count < i && p != NULL)
	{
		p = p->next;
		count++;
	}
	if (p != NULL)
		return p->data;
	else
		cout << "参数非法" << endl;
}
template<class elemtype>
void linklist<elemtype>::Delete(int i)
{
	node<elemtype>* p = head;
	int count = 0;
	while (count<i-1&&p!=NULL)
	{
		p = p->next;
		count++;
	}
	if (p != NULL && p->next != NULL)
	{
		node<elemtype> *q = p->next;
		p->next = q->next;
		delete q;
	}
}
//析构函数
template<class elemtype>
linklist<elemtype>::~linklist()
{
	while (head != NULL)
	{
		node<elemtype>* p = head;
		head = head->next;
		delete p;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

0x3f3f3f3f3f

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

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

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

打赏作者

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

抵扣说明:

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

余额充值