这是我参与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);
        }
    }
复制代码
图示,上述代码进行了以上操作。
链表总的来说并不是太难,但是很多学生在上数据结构的时候就犯迷糊了,因为搞不清链表,所以之后的一堆问题就很难解决。其实我们只需要一步步模拟一下指针的指向,只要足够细心的话,那就会把逻辑理清楚的。
图是临时画的,画得不好的话多多担待。
想要学习更多算法问题,或者要更多项目源码,请移步到公众号:诗一样的代码。
既然进来了,原创不易。小伙伴点个赞再走呗。






















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
