链表的基础操作| 8月更文挑战

308 阅读3分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

想要坚持写点什么,那干脆写一个系列吧。想想有什么可以写的呢?程序=算法+数据结构,可见算法的重要性。这个系列老诗力求用最简单的语言把算法讲得明明白白,由浅到深,有兴趣的话,可以关注一下专栏。

专栏的前面几篇已经写了几种算法了,冒泡排序,选择排序,插入排序,快速排序。其实还是有很多排序的,但是个人觉得其他的排序也并没有那么重要,除非条件非常苛刻,不然我们一般都很少碰到其他的排序。所以排序算法写到这里就够了。今天给大家来讲讲链表的基本操作。

链表的描述

什么是链表呢?有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。下图所示,他就是一块申请的地址,串联了起来。

image.png

链表的结构

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;  
        }
    }

image.png

上面的代码,我画了一个草图,其实他的操作就是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);
        }
    }

image.png

图示,上述代码进行了以上操作。

链表总的来说并不是太难,但是很多学生在上数据结构的时候就犯迷糊了,因为搞不清链表,所以之后的一堆问题就很难解决。其实我们只需要一步步模拟一下指针的指向,只要足够细心的话,那就会把逻辑理清楚的。

图是临时画的,画得不好的话多多担待。

想要学习更多算法问题,或者要更多项目源码,请移步到公众号:诗一样的代码

既然进来了,原创不易。小伙伴点个赞再走呗