博客
关于我
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/

你可能感兴趣的文章
python各种库安装
查看>>
python可视化matplotlib_如何使用Python中最强大的可视化工具Matplotlib?
查看>>
python可维护性_使用这7大神器,让你的Python 代码更容易于维护
查看>>
Python只运行一次while循环
查看>>
python变量的详细教程_Python零基础入门教程之语法入门[变量](第二期)
查看>>
Python变量命名方法-ChatGPT4o作答
查看>>
Python变量与运算符
查看>>
Python变量/运算符/函数/模块/string
查看>>
python发送邮件的时候出现 error (535, b‘5.7.3 Authentication unsuccessful‘) 解决方法
查看>>
python系列【仅供参考】:python flask框架 debug功能
查看>>
python发送notes邮件_使用python在Lotus Notes中发送邮件
查看>>
Python双版本下创建一个Scrapy(西瓜皮)项目
查看>>
Python双版本下No module named 'requests'
查看>>
python及pycharm2018软件安装教程
查看>>
python去重txt文本_Python实现的txt文件去重功能示例
查看>>
python去掉列表的逗号,从Python列表项中删除标点符号
查看>>
Python卸载所有包
查看>>
python单线程下实现多个socket并发
查看>>
Python单元测试框架介绍(超详细~)
查看>>
Python单元测试框架
查看>>