链表及其相关函数(理解总结)

链表代码链接

  • int InitLink(pNode *h)
    函数功能:链表初始化
    函数参数:头指针的地址
    函数返回值:成功返回success,失败返回failure

    链表初始化即为给头结点分配空间并初始化指针域。在定义头指针后它还是个野指针,给它分配空间就会得到一个新地址,所以需要传指针的指针来进行指针值修改。

  • int InsertLink(pNode h, int p, int num)
    函数功能:插入元素
    函数参数:头指针、插入的位置、插入的元素
    函数返回值:成功返回success,失败返回failure

    先进行入参判断,是否空指针
    while循环是从头指针开始,直到要插入的位置结束,不过要考虑一些特殊情况,如果p值过大,超出链表的长度,那么到最后一个元素就停止即指到了NULL地址。
    while中的判断是为了保证循环的正常进行以及防止超出范围。if语句就是对函数执行情况的反馈,如果传入的参数符合函数执行条件就继续,否则直接返回执行失败的信息。
    给即将插入的元素申请第一地址,接下来就是链表之间地址信息的交换。新插入的元素将自己的地址交给前一位,将后一位的地址存入,再把数据存入即插入完成。

  • int TraverseLink(pNode h);
    函数功能:遍历链表,打印出数值
    函数参数:头指针
    函数返回值:成功返回success,失败返回failure

    定义一个指针变量,从头指针往后移动直到最后一个NULL结束,把经过的元素都打印。

  • int GetElem(pNode h, int p)
    函数功能:给出一个位置,获取该位置处的数值
    函数参数:头指针 值所在位置
    函数返回值:所在位置的数据值
    定义一个指针,从头结点开始移动,再定义一个标记值,移动一下就加一,用来判断是否到达了指定位置。while (k < p && t != NULL),while的循环条件, t != NULL是为了确保如果位置值输入超出了链表长度时,指针的移动会停止,即遇到最后一个元素后下一个就是NULL地址。if (!t)是为了判断是否输入正确,提供返回值告诉main函数运行情况。

  • int LocateElem(pNode h, int e)
    函数功能:给出一个数值,得出该数值在链表中第一次出现的位置
    函数参数:头指针 给出的数值
    函数返回值:在链表中的位置

    定义一个指针,从第一个结点开始移动,再定义一个标记值,记录指针所在链表的位置,移动一次加一。当结点元素与所给元素相同,就返回此时的标记值。不符合继续往后移动。若移到链表末端即下一个指向NULL了还没有和所给值一致的,就返回failure,没有这个值。

  • int LengthLink(pNode h)
    函数功能:得出链表的长度
    函数参数:头指针
    函数返回值:长度值

    定义一个指针从头指针开始,定义一个变量计数,到最后一个NULL结束,返回计数的变量的值‘’

  • int PriorElem(pNode h, int num)
    函数功能:得出指定元素的前驱
    函数参数:头指针、指定的元素值
    函数返回值:前驱值

    需要返回前驱,但是这个链表只有往后指的(这个是单向链表),无法得出前一个元素。我们可以通过t->next->data,先指向后一个,如果后一个等于指定的元素,就输出该元素的值(是后一个元素的前驱)。

  • int NextElem(pNode h, int num)
    函数功能:得出指定元素的后继
    函数参数:头指针、指定的元素值
    函数返回值:后继值

    在循环条件的判定上,思路与前驱类似,因为最后一个元素没有后继,所以对空指针的判断要判断后一个。

  • int ReverseLink(pNode h)
    函数功能:将链表反置
    函数参数:头指针
    函数返回值:成功返回success,失败返回failure

    本质就是各个结构体元素里面的指针值的变动。第一个值变为最后一个,因为最后一个元素的标志是指针域里是NULL,所以把NULL给第一个元素,然后通过循环,分别把指针指向的结构体变动。指针如果直接覆盖掉,原来的值就没了,所以定义一个指针用来存放之前的指针,将之前的指针地址转移到另一个指针中去。

  • int LinkDel(pNode h, int p)
    函数功能:删除链表中的元素
    函数参数:头指针、所要删除元素的位置
    函数返回值:成功返回删除的值,失败返回failure

    删除结点,先定位,再删除。定位部分和插入的做法一致。定义一个指针从头指针开始移动到所要删除位置的前一个。然后进行指针域的交换。就是直接将后一个结点的地址给前一个结点,这样所要删除的结点就没有指针指向它了,就可以当做从这个链表里面“删除”了。最后将它的空间释放。

  • int ClearLink(pNode h)

    函数功能:删除链表
    函数参数:头指针
    函数返回值:成功返回success 失败返回failure

    删除链表就是将里面的元素全部删除。使得头指针指向为NULL。就是将删除链表操作进行循环,直到链表末端。

  • int DestroyLink(pNode h)
    函数功能:销毁链表
    函数参数:头指针
    函数返回值:成功返回success 失败返回failure

    销毁链表和清空链表的区别在于。清空了链表后还可以往里面再加入新的元素,而链表被销毁后就不能再添加元素了。体现在删除链表保留了头指针,所以还可以继续往后面的地址指向,所以将头指针也删除了,即将他的空间释放,就相当于销毁了链表。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值