混子数据结构学习之第二章线性表链式表示之基本操作查询、取值

2022-02-16  本文已影响0人  那个混子

"磨棱角,褪优越,沉下心"
"不止于心动,更付诸于行动,执行力!“

前言

本篇将补充几个操作,主要涉及到链表的按地址取值、查询地址、删除、插入某一个结点这些操作,有了前面那些操作的学习,理解这些其实相对很简单了。

链表的基本操作的补充

取值操作

概念:就是取出第i个结点的数据。

算法步骤

代码实现

说明:

 //--------取值:取单链表中第i个元素的内容
ElemType GetElem_L(LinkList L, int i)
{
    LinkList p; //定义一个结点地址,用于存储
    unsigned int k = 1;

    p = L->next; 
    while(p && k < i) //向后扫描,直到p指向第i个元素或p为空 
    {
        p = p->next;
        ++k;//记录位置(不能和前面的写反)
    }
    //printf("测试检查:%d\n",p->date);

    if(!p || k > i)//第i个元素不存在
    { 
        return FALSE;
    }
    return p->date;//取第i个元素 
}

按值查找地址

概念:就是给定一个数值,看这个值在链表的哪个位置(地址),当然这个位置可以是对应的存储地址也可以是从链表顺序上看的第几个的位置。
下面就说查找实际地址一种,另外的也类似,加个计数的变量即可得出位置!
算法步骤:

代码实现

说明:

//----取地址:查找指定元素的地址
Node* Get_Address(LinkList L, ElemType e)
{
    LinkList p; //定义一个结点地址,用于存储
    p = L->next;

    while((p->date != e) && (p != NULL))
    {
        p = p->next;
    }
    if(p->date == e)
    {
       return p;
    }
    else
    {
         return NULL;
    }
}

删除第i个结点元素

概念:
删除指定的第i个结点,销毁结点的空间。

算法步骤:

代码实现

//----删除第i个结点,释放结点的空间
unsigned char  NodetDelete_L(LinkList *L,  int i, ElemType *e)//需要操作链表的结点,故传入二级指针,等同于Node **L
{
    LinkList p,q; //定义一个结点地址,用于存储
     int k = 1;

    p = *L; //临时储存要处理的链表 注意不要少*

    while( p->next && k < i )//寻找第i个结点,并令p指向其前驱
    { 
        p = p->next;//遍历移动链表中的各个结点
        ++k;
    }

    if(!(p->next) || k > i )//删除位置不合理,出错
    {
        return FALSE;
    }

    q =  p->next;//临时保存被删结点的地址以备释放 
    p->next = q->next;//改变删除结点前驱结点的指针域 
    *e = q->date;//保存删除结点的数据域 
    free(q);//释放删除结点的空间 

    return OK;
}

在第i个位置插入结点

概念:
在指定的位置插入新的结点。

算法步骤:

代码实现

//---在第i个位置(ai)插入结点,开辟空间 
// s->next = p->next; p->next = s;
unsigned char  NodeInsert_L(LinkList *L,  int i, ElemType e)//需要操作链表的结点,故传入二级指针,等同于Node **L
{
    LinkList p,s; //定义一个结点地址,用于存储
     int k = 1;

    p = *L; //临时储存要处理的链表 注意不要少*

    while( p && k < i )//寻找第i个结点
    { 
        p = p->next;//遍历移动链表中的各个结点
        ++k;
    }

    if(!p || k > i )//插入位置不合理,出错
    {
        return FALSE;
    }
    s = (LinkList)malloc((sizeof(Node)));//生成新的结点,开启结点空间
    s->date = e;//新结点数据域
    s->next = p->next;//新结点指针域指向p的后继
    p->next = s; //s成为p的后继

    return OK;
}
过程记录注意点
小结

这部分代码还是比较有共性的,特别是删除和插入结点的操作,可以类比学习。对比线性结构的插入删除操作,链表是相对方便的,效率也直观感受到很高,线性表中需要每一个结点都进行依次移动,但是链表并不需要,只要找出上一个结点就可以对其操作。
记住核心操作基本就可以掌握了这些算法了。

好了,就到这里了,睡觉了,最近也没时间学习写,疫情来了............

参考资料:
青岛大学.王卓.数据结构与算法
《数据结构 C语言版》.严蔚敏
《大话数据结构》.程杰

若上述描述有问题或者歧义的,欢迎与我反馈交流,共同进步学习!

欢迎关注本人微信公众号:那个混子
记录自己学习的过程,分享乐趣、技术、想法、感悟、情感!
单片机类嵌入式交流学习可加企鹅群:120653336
上一篇下一篇

猜你喜欢

热点阅读