欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单链表的实现

程序员文章站 2022-05-06 12:40:00
...

想说的话:由于今年要考研,所以必须得重新学一遍数据结构,说是重新学,其实只是懂得其原理,从来没有用代码来实现过。借此机会使用C语言将数据结构中的某些结构和算法都实现。

单链表的实现

  1. 链表节点的构造
typedef struct LINKNODE
{
	void* data;
	struct LINKNODE* next;
}LNode;
  1. 初始化
LNode* Init_Link()
{
	LNode* link = (LNode*)malloc(sizeof(LNode));
	link->data = "head";
	link->next = NULL;

	return link;
}
  1. 尾插法插入数据
void CreateLinkR(LNode* link, int val)
{
	LNode* node = (LNode*)malloc(sizeof(LNode));
	node->data = val;
	node->next = NULL;

	while (link->next != NULL)
	{
		link = link->next;
	}
	link->next = node;
}
  1. 头插法插入数据
void CreateLinkL(LNode* link, int val)
{
	LNode* node = (LNode*)malloc(sizeof(LNode));
	node->data = val;
	node->next = NULL;

	if (link->next == NULL)
	{
		link->next = node;
	}
	else
	{
		node->next = link->next;
		link->next = node;
	}
}

注意:这里得说一下,最开始写的时候出现了一些错误
a. 出现尾结点指向自己
这是代码

单链表的实现
这是调试后的结果(当时百思不得其解,最后请教了大佬)
单链表的实现
此处的原因就是因为没有加else,当第一次插入数据时,也执行了后面的语句导致第一个节点(不包括头节点)指向了自己。

定义了变量一定要初始化(指的是node->next = NULL)
  1. 根据值删除某个结点
int Delete_Link(LNode* link, int val)
{
	LNode* p, * q;
	p = link;
	q = link;
	while (p->next != NULL)
	{
		if (p->data == val)
		{
			q->next = p->next;
			free(p);
			break;
		}
		q = p;
		p = p->next;
	}
}
第二种
LNode* p, * q;
	p = link;
	//查找部分开始
	while (p->next != NULL)
	{
		if (p->next->data == val)
			break;
		p = p->next;
	}
	//查找部分结束

	if (p->next == NULL)
	{
		return 0;
	}
	else
	{
		//删除行开始
		q = p->next;
		p->next = p->next->next;
		free(q);
		//删除行结束
		return 1;
	}
其他的一些就不实现了,后续的就实现一下顺序表,单链表,双链表的有关考题。

总结:对于算法的实现,懂得其原理是不够的,我们应该使用代码将其实现一遍(最好用不同的方法,可以比较其差别),谈到应用又不同了,比如我前段时间看了一个有关基于stm32的智能小车的算法,其算法核心是弗洛伊德算法,但是我看算法那部分确一直看不懂(没咋学过32)就那样硬着头皮加同伴的讲解总算明白了。

ps:感觉总结说的是废话,我的意思是脚踏实地,代码是一行一行写出来的。不是“自以为是”。