链表的后续完善---添加尾结点指针

目录

前期的链表有什么问题

怎么修改

如何测试


前期的链表有什么问题

没有问题,但是不够好,最常用的操作在链表尾部添加结点,是通过查找链表末尾然后再插入的,用时较长。

对于不是频繁在链表末尾 插入/删除操作,没什么影响。

那有没有什么方式来完善呢?添加尾结点指针,可以更好的解决频繁插入问题。标记链表末尾,在链表末尾插入时就不必遍历链表来查找链表末尾所在位置了。

注意,只是在链表尾部插入结点时,省了些许时间,因为是单向链表,尾结点指针无法直接前移,要想在链表末尾删除节点时省些时间,只能通过双向链表来实现了。

源文件及测试文件我上传到CSDN上了:Add Tail Pointer LinkedList.zip

怎么修改

最先需要修改的是链表的定义,之后就是修改在链表尾部添加结点函数,再之后就是针对初始化、插入、删除、清空等涉及到结点数发生变化的 函数添加尾结点指针指向。

typedef struct list
{
    Node* head;             /* 指向链表头的指针 */
    Node* tail;             /* #TODO 指向尾结点的指针 */
    L_NUMBER_type items;         /* 链表中的项数 */
}LinkedList;
/**
 * LinkedListAddNode  #TODO
 * @brief   添加到链表尾部
 * @param   item 参数描述: 要写入结点的数据域
 * @param   plist 参数描述: 链表指针
 * @retval  true 返回值描述: 插入成功
 * @retval  false 返回值描述: 插入失败
 * @note    1.若链表已满,返回失败 2.新建结点,数据域复制到结点 3.将结点插入到链表 4.记录链表尾端的位置,链表结点数加1
 */
bool LinkedListAddNode(Item item, LinkedList* plist)
{
    Node* pnew;
    if(LinkedListIsFull(plist))
    {
        return false;                               /* 若链表已满,返回失败 */
    }

    pnew = (Node*)malloc(sizeof(Node));             /* 新建结点 */
    if(pnew == NULL)
    {
        printf("Unable to allocate memory! \n");
        exit(1);
    }

    CopyToNode(item, pnew);                         /* 结点初始化 */
    pnew->next = NULL;

    if(LinkedList
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值