链表就是磁带

首先,链表的一些概念相信大家都已经知道了,这边不再赘述。

这里说出我的理解

                         链表就是磁带,你把链表想成磁带就可以了

链表的每个节点就像是磁带里面的每个听力单元。

那么,我们首先利用结构体创建一个这样的单元

typedef struct node
{
	int name;
	struct node* next;
}Node;

一个链表的节点包括两个部分:1 数据本身  2 指向的地址;

那么,我们改如何创建一个链表呢?

想象一下,我们现在想要戏弄一下英语老师,在听力材料中插入一段自己的讲话。

那么,我们首先需要生成自己讲话的录音带

//创建链表头结点
Node* p = (Node*)malloc(sizeof(Node));
//创建读写装置
Node* head, * tail;
head = p;
tail = p;
tail->next = NULL;
//开始创建一个链表;
for (int i = 0; i < 5; i++)
{
	p = (Node*)malloc(sizeof(Node));
	p->name = i;
	//左限位不动,尾指针发生变化
	tail->next = p;//上一个结点的指针指向这个结点;
	tail = p;//这个节点也变成了尾结点
	tail->next = NULL;
}
//写入完毕,读写头归位

这边创建了三个结构体指针,这三个结构体指针我给他取名字叫  头指针  尾指针  读写头指针
然后呢?

然后看上面的for循环,我们不断地创建节点,然后不断把节点连在了一起。

我们现在创建的这一段录音带假如就是老师的录音带,那么我们现在应该如何插入呢?

首先,我们需要录下自己的音

		int num;
		Node* pa;
		pa = (Node*)malloc(sizeof(Node));//创建空间
		printf("请插入数字>>");
		scanf("%d", &(pa->name));
		printf("请选择插入你想插入在哪个数字后面>>");
		scanf("%d", &num);

这里我们创建了一块空间作为一个新的结点,这块节点现在已经被我们输入了需要输入的数据,并且,我们想要插入的地方也需要明确

那么问题来了,假设我们需要在第三单元的听力后面插入自己的录音,我们怎么找到第三单元?

大家记得英语老师是怎么做的吧:从头开始快进听

	while (p != NULL)
	{
		if (p->name == num)
		{
			pa->next = p->next;//新节点的指向和老街店一样
			p->next = pa;//老结点指向新结点;
		}
		p = p->next;
	}
	p = head->next;

像是上面的代码一样,我们必须从链表的头部开始找到指定的位置。并且把这块新的结点连接进去

并且,这里值得注意的是,在使用完链表之后一定要让读写头也就是读写指针P回到原位。要不然下次就读不到链表了。

整体代码如下

typedef struct node
{
	int name;
	struct node* next;
}Node;

int main()
{
	//创建链表头结点
	Node* p = (Node*)malloc(sizeof(Node));
	//创建读写装置
	Node* head, * tail;
	head = p;
	tail = p;
	tail->next = NULL;
	//开始创建一个链表;
	for (int i = 0; i < 5; i++)
	{
		p = (Node*)malloc(sizeof(Node));
		p->name = i;
		//左限位不动,尾指针发生变化
		tail->next = p;//上一个结点的指针指向这个结点;
		tail = p;//这个节点也变成了尾结点
		tail->next = NULL;
	}
	//写入完毕,读写头归位
	p = head->next;//因为有效位置是从第二个节点开始的
	while (p != NULL)
	{
		printf("%d -->", p->name);
		p = p->next;
	}
	p = head->next;
	//开始插入
	while (1)
	{
		int num;
		Node* pa;
		pa = (Node*)malloc(sizeof(Node));//创建空间
		printf("请插入数字>>");
		scanf("%d", &(pa->name));
		printf("请选择插入你想插入在哪个数字后面>>");
		scanf("%d", &num);

		while (p != NULL)
		{
			if (p->name == num)
			{
				pa->next = p->next;//新节点的指向和老街店一样
				p->next = pa;//老结点指向新结点;
			}
			p = p->next;
		}
		p = head->next;
		while (p != NULL)
		{
			printf("%d-->", p->name);
			p = p->next;
		}
		p = head->next;
	}
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值