C/C++链表(一)

目录

  1. 链表的原理
  2. 链表的实现
  3. 链表的插入
  4. 链表的删除
  5. 总结

链表的原理

有时候我们在处理一连串的数据的时候进行一些插入和删除的时候用数组就显得非常的不方便,但是如果用数组来实现就显得方便许多。
那么链表是如何实现的呢?
链表是由一个个节点连成的,就像锁链的一个个锁环,这个节点分成两个部分组成,第一部分是data,用来储存数据。第二部分是一个指针,用来指向下一个节点。
将这些节点一个个连在一起就形成了链表。光说不练假把式,下面我们就来看看链表是如何实现的。

链表的实现

首先,我们先定义一下节点,这里我们用一个结构体类型来储存这个节点如下

struct node
{
	int data;	//这里用来存储数据
	struct node *next	//由于下一个节点也是这个类型的所以指针的类型也是struct node类型
};

这里我们便把链表最基础的元素搭建好了
我先现在开始搭建链表
首先我们需要一个头指针head指向链表最开始的地方,之后我们遍历这个链表的时候也是从head开始遍历

struct node *head;
head = NULL;	//因为这里链表还没有开始搭建,所以这里head指针指向空节点

现在我们来创建第一个节点,并用临时指针p指向这个节点

struct node *p;
p = (struct node *)malloc(sizeof(struct node));

malloc函数用来动态生成一个临时空间,比如生成一个可以储存int型数据的临时空间malloc(4)
sizeof函数用来判断某一个类型的数据需要多少空间,比如 sizeof(int) == 4
现在我们设置这个节点的data部分和指针部分

cin>>a;
p->data = a;	//将输入的数据保存到节点的data里
p->next = NULL;	//设置这个节点的后继指针为空,即这个节点的下一个节点为空

现在我们将头节点与这个节点连接到一起

if(head == NULL) 
	head = p;	//如果这是第一个节点,则将头结点指向这个节点
else
	q->next = p;	//如何不是这个节点,则将上一个节点的后继节点指向该节点

完整代码如下

#include <bits/stdc++>
using namespace std;
struct node 
{
	int data;
	struct node *next;
};

int main () 
{
	struct node *head ,*p ,*q ,*t;
	int n,a;
	cin>>n;	//创建的链表含有节点的个数
	head = NULL;
	for(int i=0;i<n;i++) {
		cin>>a;
		p=(struct node *)malloc(sizeof(struct node));
		p->data = a;
		q = head;
		p->next = NULL;
		if(head == NULL)
			head = p;
		else
			q->next = p;

		q=p;	//指针p也指向当前节点
	}
	//开始遍历所有节点
	t = head;
	while(t != NULL) {
		cout<<t->data<<endl;
		t = t->next; 
	}
	system("pause");
	return 0;
}

以上是完整的代码,这只是链表实现的一种方式,链表的实现还有一种方式,大家可以想一想,我可能会在之后的博客中写。

链表的插入

链表的插入,实现起来其实不是很难,我们只需要找到相应的插入位置,将上一个节点后继节点指向该节点,再将待插入的节点的后继指针指向下一个节点就完成了,这里我们按大小插入。

cin>>a;	//	读入待插入的数
while(t!=NULL) //我们依旧从头开始遍历该链表
{
	if(t->next == NULL || t->next->data > a)
	//如何当前节点是最后一个节点或者下一个节点的值大于待插入的数的时候插入
	{
		p=(struct node *)malloc(sizeof(struct node));
		p->data = a;
		p->next = t->next;	//新增节点的后继指针指向当前节点的后继指针
		t->next=p;	//当前节点的后继指针指向新增节点
		break;
	}
	t = t->next;
}

链表的删除

链表的删除实现起来也不是很难,只需要当前节点的前一个节点的后继指针指向该节点的后继指针就可以了。

//这里我们假设删除数据为2的节点
while(t != NULL)
{
	if(t->next == NULL && t->data != 2)
	//如果该节点为最后一个节点且该节点不为2
	cout<<"该链表里没有节点数据为2的节点"<<endl;
	if(t->next == NULL && t->data == 2)
	//如果最后一个节点满足条件的话直接删除掉该节点就可以
	free(t);
	if(t->next->data == 2) {
	//如果该节点的下一个节点满足条件
	struct node *p;
	p = t->next->next; //p指向被删节点的下一个节点
	t->next = p; //将当前节点的后继指针指向被删节点的后继节点
	free(t->next); //释放掉被删的节点
	}
	t=t->next;
}

总结

这是链表的最基础的形式,也是最常用的形式,还有许多形式的链表比如双向链表等,我会在以后的博文里讲。
链表作为最基础的数据结构是每个程序员的必修课,它能带给我们不仅仅只是一种数据结构,我觉得更是一种链式思想,比如,节点里的数据部分仅仅可以存放数据吗?
最后提一嘴,这是用指针实现链表,其实还可用数组实现链表,这种链表被称为模拟链表。
以上就是我对链表的理解,如果有不对的地方欢迎大佬在评论区纠错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值