C++实现链表

链表初始化

链表的初始化是必要的。只有初始化后,稍后的插入、删除等操作才能使用。

  • 头结点不存放数据
  • 将头结点指针域置空
  • 注意是头结点的指针域为nullptr,而不是整个头结点为nullptr
// 初始化链表
void Init(LinkedNode *&L){
    L = (LinkedNode *) malloc(sizeof (LinkedNode));
    L->next = nullptr;
}

链表插入

链表的插入,需要找到那个指针域为空的结点

void Insert(LinkedNode *&l, int x){
    LinkedNode *p = l;
    while (p->next != nullptr){
        p = p->next;
    }
    LinkedNode *temp = (LinkedNode *) malloc(sizeof (LinkedNode));
    temp->data = x;
    temp->next = nullptr;
    p->next = temp;
}

链表的遍历

遍历所以结点,注意头结点不算链表长度,因为头结点不存放数据。

void Traversal (LinkedNode *l){
    LinkedNode *p = l->next;
    while (p != nullptr){
        printf("%d",p->data);
        p = p->next;
    }
}

销毁链表

  • 链表回收需要回收头结点
  • 要先保存下一个元素才能回收上一个元素
void Destroy(LinkedNode *&L){
    LinkedNode *pre,*p;
    pre = L; p = pre->next;
    while (p!= nullptr){
        free(pre);
        pre = p->next;
        p = p->next;
    }
    free(pre);
}

获取链表长度

  • 头结点不算长度
// 求链表长度
void  GetLength(LinkedNode *L){
    LinkedNode *p = L->next;
    int i = 0;
    while (p != nullptr){
        i++;
        p = p->next;
    }
    printf("Length:%d",i);
}

获取链表的第n个元素

// 返回第n个元素 未找到返回0  n表示第几个元素而不是下标 ,e用于存储返回元素
int GetElem(LinkedNode *L, int n , int &e){
    int j = 0;
    if (n <= 0)return 0;
    LinkedNode *p = L;
    while (p != nullptr && j < n){
        j++;
        p = p->next;
    }
    if (p != nullptr){
        e = p->data;
    } else return 0;
}
与获取链表长度,首结点赋值的不同

如果你仔细观察代码就会发现,与获取链表长度方法相比,这里的首结点赋值不同。获取链表长度,是将首结点赋值为头结点的下一个结点,而这个方法是将头结点赋值为首结点(这样操作必须要考虑是否会发送获取头结点的错误)。如下图所示,获取长度是为了提前判定下一个结点是否为空;而获取第n个元素就需要使用如下图“第二种情况”这种方式了。
在这里插入图片描述

按值查找

// 按值查找 返回是链表的第几个元素
int Locate(LinkedNode *l, int x){
    LinkedNode *p = l->next;
    int i = 1;
    while (p != nullptr && p->data != x){
        i++;
        p = p->next;
    }
    if (p == nullptr)return 0;
    else return i;
}

插入运算

先找到需要插入的结点的前序结点

  • 前序结点指针域赋值给插入结点
  • 将前序结点的指针域指向插入结点
int InsElem(LinkedNode *L,int n, int x){
    int i = 0;
    LinkedNode *pre = L;
    while (pre != nullptr && i<n-1){
        i++;
        pre = pre->next;
    }
    if (pre == nullptr)return 0;
    else {
        LinkedNode *temp = (LinkedNode *) malloc(sizeof (LinkedNode));
        temp->data = x;
        temp->next = pre->next;
        pre->next = temp;
        return 1;
    }
}

删除运算

找到前序结点,并通过前序结点找到当前结点,将当前结点的指针域赋值给前序结点指针域

//删除节点
int DelElem(LinkedNode *&L, int n){
    LinkedNode *p = L;
    int i = 0;
    while (p != nullptr && i < n-1){
        i++;
        p = p->next;
    }
    if (p == nullptr)return 0;
    else {
        LinkedNode *q = p->next;
        // 没有第n个节点
        if (q == nullptr) return 0;
        else {
            p->next = q->next;
            free(q);
            return 1;
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值