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

你可能感兴趣的文章
PyQt5 - QThread:在线程仍在运行时被销毁
查看>>
PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件
查看>>
PyQt5 Designer 不工作:此应用程序无法启动,因为无法初始化 Qt 平台插件
查看>>
PyQt5 QLCNumber 没有更新
查看>>
PyQt5 TabWidget选项卡BarClicked TypeError:本机Qt信号不可调用
查看>>
PyQt5 从 PyQt4 转换信号代码
查看>>
PyQt5 和 asyncio:从永不完成的收益
查看>>
PyQt5 和 Django:如何使用 HTTP 请求(Multipart-form)上传图像?
查看>>
PyQt5 按钮运行功能和更新 LCD
查看>>
pyqt5 获取Qlabel中的图片并对其进行处理(包括Qimage转换为Mat)
查看>>
pyqt5 设置控件在最上层或者在下层
查看>>
pyqt5 设置网格布局的间距
查看>>
pyTorch Hub 系列#4:PGAN — GAN 模型
查看>>
PyQt5-基本窗口控件-QMainWindow
查看>>
PyQt5:如何安装/运行 Qt 设计器
查看>>
PyQt5——pyqtgraph绘图大招
查看>>
PyQt5——多窗口之间数据处理
查看>>
PyQt5——多线程、信号与槽
查看>>
PyQt5——开发地图软件
查看>>
PyQt5——装饰器信号与槽
查看>>