单链表的实现
程序员文章站
2022-05-06 12:40:00
...
想说的话:由于今年要考研,所以必须得重新学一遍数据结构,说是重新学,其实只是懂得其原理,从来没有用代码来实现过。借此机会使用C语言将数据结构中的某些结构和算法都实现。
单链表的实现
- 链表节点的构造
typedef struct LINKNODE
{
void* data;
struct LINKNODE* next;
}LNode;
- 初始化
LNode* Init_Link()
{
LNode* link = (LNode*)malloc(sizeof(LNode));
link->data = "head";
link->next = NULL;
return link;
}
- 尾插法插入数据
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;
}
- 头插法插入数据
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)
- 根据值删除某个结点
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:感觉总结说的是废话,我的意思是脚踏实地,代码是一行一行写出来的。不是“自以为是”。
上一篇: 【学生信息管理系统】——问题篇
下一篇: 通往架构师路上的经验总结
推荐阅读
-
extern实现源文件(头文件)之间变量和函数的引用
-
各情景下元素宽高的获取实现代码_javascript技巧
-
Android实现从activity中停止Service的方法
-
Android编程实现使用SoundPool播放音乐的方法
-
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
-
c# 自定义泛型链表类的详解
-
Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)
-
C#实现写入与读出文本文件的实例代码
-
Android无需root实现apk的静默安装
-
Android listview ExpandableListView实现多选,单选,全选,edittext实现批量输入的实例代码