这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
想要坚持写点什么,那干脆写一个系列吧。想想有什么可以写的呢?程序=算法+数据结构,可见算法的重要性。这个系列老诗力求用最简单的语言把算法讲得明明白白,由浅到深,有兴趣的话,可以关注一下专栏。
专栏的前面几篇已经写了几种算法了,冒泡排序,选择排序,插入排序,快速排序。其实还是有很多排序的,但是个人觉得其他的排序也并没有那么重要,除非条件非常苛刻,不然我们一般都很少碰到其他的排序。所以排序算法写到这里就够了。今天给大家来讲讲链表的基本操作。
链表的描述
什么是链表呢?有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。下图所示,他就是一块申请的地址,串联了起来。
链表的结构
typedef struct _LINK_NODE
{
int data;
struct _LINK_NODE* next;
}LINK_NODE;
复制代码
链表里面有data这里面不一定只是int,可以是其他类型的数据。然后再是一个链表指针,这是用于连接下一个链表用的。
创建链表
LINK_NODE* pLinkNode = NULL;
pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));
pLinkNode->data = value;
pLinkNode->next = NULL;
复制代码
这里是新增加一个链表结点,将新增加的链表结点拼接上原来已经有的链表就行了。
链表插入
p=head;
while(p->next!=null)
{
p=p->next;
if(p->data ==value)
{
LINK_NODE* pLinkNode = NULL;
pLinkNode = (LINK_NODE*)malloc(sizeof(LINK_NODE));
pLinkNode->data = value;
pLinkNode->next = p->next;
p->next =pLinkNode;
}
}
复制代码
上面的代码,我画了一个草图,其实他的操作就是p是扫描指针,当扫描到需要插入的位置,新建一个节点,新建节点的next连接原来的p->next,而原来的而新建节点本身就成为了原来的p->next。
链表的删除
p=head;
while(p->next!=null)
{
if(p->next->data ==value)
{
needdel = p->next;
p->next=needdel->next;
free(needdel);
}
}
复制代码
图示,上述代码进行了以上操作。
链表总的来说并不是太难,但是很多学生在上数据结构的时候就犯迷糊了,因为搞不清链表,所以之后的一堆问题就很难解决。其实我们只需要一步步模拟一下指针的指向,只要足够细心的话,那就会把逻辑理清楚的。
图是临时画的,画得不好的话多多担待。
想要学习更多算法问题,或者要更多项目源码,请移步到公众号:诗一样的代码。
既然进来了,原创不易。小伙伴点个赞再走呗。