博客
关于我
C++实现单链表的16种基本操作
阅读量:501 次
发布时间:2019-03-07

本文共 4153 字,大约阅读时间需要 13 分钟。

C++实现单链表的16种基本操作

单链表是数据结构中最基本的线性数据组织方式之一,广泛应用于内存分配、文件读写等场景。本文将详细介绍C++实现单链表的16种基本操作,并附上对应的代码示例。

1. 链表初始化

链表的初始化需要创建一个带有头节点的空链表。头节点的data域可以为空,next域指向第一个数据节点。

bool InitList_L(Linklist &L) {    // 创建一个带有头节点的空链表    L = new Lnode;    if (!L) return false;    L->next = NULL;    return true;}

2. 头插法创建链表

头插法的特点是新插入的节点会成为链表的新头,链表的数据顺序会与输入顺序相反。

void CreateList_H(Linklist &L) {    int n;    cout << "请输入元素个数n:" << endl;    cin >> n;    cout << "头插法创建单链表" << endl;    cout << "请依次输入n个元素:" << endl;    Linklist s = new Lnode;    L->next = NULL;    while (n--) {        s->data = cin;        s->next = L->next;        L->next = s;        s = s->next;    }}

3. 尾插法创建链表

尾插法的特点是新插入的节点会成为链表的新尾,链表的数据顺序与输入顺序一致。

void CreateList_R(Linklist &L) {    int n;    cout << "请输入元素个数n:" << endl;    cin >> n;    cout << "尾插法创建单链表" << endl;    cout << "请依次输入n个元素:" << endl;    Linklist s = new Lnode;    Linklist r = L;    while (n--) {        s->data = cin;        s->next = NULL;        r->next = s;        r = s;        s = new Lnode;    }}

4. 输出链表元素

通过遍历链表节点,逐个打印数据域的内容即可实现链表的输出。

void Show_L(Linklist &L) {    Linklist s = L->next;    while (s) {        cout << s->data << " ";        s = s->next;    }    cout << endl;    cout << "输出完毕" << endl;}

5. 取值操作

通过遍历链表,根据给定的索引位置取出对应节点的数据。

int getelem_l(Linklist &L, int i) {    Linklist p = L;    int j = 0;    while (p && j < i) {        p = p->next;        j++;    }    if (!p || j >= i) {        return -1;    }    return p->data;}

6. 查找节点数据

通过遍历链表,查找数据域等于指定值的节点,并返回其位置。

int LocateElem_L(Linklist L, int e) {    Linklist p = L;    int j = 0;    while (p && p->data != e) {        p = p->next;        j++;    }    if (!p) {        return -1;    }    return j;}

7. 链表插入操作

在指定位置插入新节点,链表的前后节点指针需要正确调整。

bool ListInsert_L(Linklist &L, int i, int e) {    int j;    Linklist p = L;    j = 0;    while (p && j < i - 1) {        p = p->next;        j++;    }    if (!p || j >= i - 1) {        return false;    }    Linklist s = new Lnode;    s->data = e;    s->next = p->next;    p->next = s;    return true;}

8. 链表删除操作

删除指定位置的节点,需要调整前后节点的指针。

bool ListDelete_L(Linklist &L, int i) {    Linklist p = L;    int j = 0;    while (p && j < i - 1) {        p = p->next;        j++;    }    if (!p || j >= i - 1) {        return false;    }    Linklist q = p->next;    p->next = q->next;    free(q);    return true;}

9. 逆转链表

通过调整节点的指针,实现链表的逆转。

void Reverse_L(Linklist &L) {    if (!L->next) {        return;    }    Linklist r = NULL;    Linklist p = L->next;    Linklist q = p->next;    while (p) {        p->next = r;        r = p;        p = q;        q = q->next;    }    L->next = r;}

10. 链表清空

释放链表中的所有节点,链表变为空链表。

void clear_L(Linklist &L) {    Linklist p = L->next;    while (p) {        Linklist q = p;        p = q->next;        free(q);    }    L->next = NULL;}

11. 删除重复数据节点

通过遍历链表,删除数据域与前一个节点相同的节点。

void DeleteRepeat(Linklist &L) {    Linklist r = L;    Linklist p = L->next;    while (p) {        Linklist s = L->next;        while (s != p) {            if (s->data == p->data) {                r->next = p->next;                free(p);                p = r;                break;            }            s = s->next;        }        r = p;        p = p->next;    }}

12. 计算链表节点个数

通过遍历链表,统计节点的个数(不包括头节点)。

int GetLength(Linklist &L) {    int n = 0;    Linklist p = L;    while (p->next) {        p = p->next;        n++;    }    return n;}

13. 判断链表是否为空

检查头节点的next域是否为空来判断链表是否为空。

bool IsEmpty(Linklist &L) {    return L->next == NULL;}

14. 有序合并两个链表

将两个有序链表合并,生成一个新的有序链表。

void GuiblingList(Linklist &A, Linklist &B) {    Linklist p = A;    Linklist q = B;    while (p->next && p->next->data <= q->data) {        p = p->next;    }    Linklist r = q;    q = q->next;    p->next = r;    while (q) {        r->next = q;        while (p->next && p->next->data <= q->data) {            r = r->next;            p = p->next;        }        q = q->next;        r = r->next;    }}

15. 无序合并两个链表

将两个无序链表合并,生成一个新的链表,无需排序。

void CoalitionLinkList(Linklist &A, Linklist &B) {    Linklist p = A;    Linklist q = B;    while (p->next) {        p = p->next;    }    p->next = q->next;    free(B);}

16. 其他操作

通过以上基本操作,可以实现链表的初始化、插入、删除、查找、逆转、清空、合并等功能,满足多种实际需求。

转载地址:http://acrcz.baihongyu.com/

你可能感兴趣的文章
Paint类(画笔)
查看>>
paip. 调试技术打印堆栈 uapi print stack java php python 总结.
查看>>
paip.android 手机输入法制造大法
查看>>
paip.spring3 mvc servlet的配置以及使用最佳实践
查看>>
Palindrome Number leetcode java
查看>>
Palo Alto Networks Expedition 未授权SQL注入漏洞复现(CVE-2024-9465)
查看>>
Palo Alto Networks Expedition 远程命令执行漏洞(CVE-2024-9463)
查看>>
Palo Alto Networks PAN-OS身份认证绕过导致RCE漏洞复现(CVE-2024-0012)
查看>>
Panalog 日志审计系统 libres_syn_delete.php 前台RCE漏洞复现
查看>>
Springboot中@SuppressWarnings注解详细解析
查看>>
Panalog 日志审计系统 sprog_deletevent.php SQL 注入漏洞复现
查看>>
Panalog 日志审计系统 sprog_upstatus.php SQL 注入漏洞复现(XVE-2024-5232)
查看>>
Panalog 日志审计系统 前台RCE漏洞复现
查看>>
PANDA VALUE_COUNTS包含GROUP BY之前的所有值
查看>>
pandas - 如何将所有列从对象转换为浮点类型
查看>>
Pandas - 按列分组并将数据转换为 numpy 数组
查看>>
Pandas - 有条件的删除重复项
查看>>
pandas -按连续日期时间段分组
查看>>
pandas -更改重新采样的时间序列的开始和结束日期
查看>>
SpringBoot+Vue+Redis前后端分离家具商城平台系统(源码+论文初稿直接运行《精品毕设》)15主要设计:用户登录、注册、商城分类、商品浏览、查看、购物车、订单、支付、以及后台的管理
查看>>