博客
关于我
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中http协议编程_HTTP编程
查看>>
python中import os_Python:相对导入与绝对导入(import)、os.path、__file__
查看>>
python中is和==操作符
查看>>
Python中range对象的使用以及打印九九乘法表
查看>>
Python中set.discard和set.remove方法之间的运行时差异?
查看>>
python中tkinter中value_输入字段中的python Tkinter get()值
查看>>
Python中wx.FlexGridSizer
查看>>
Python中xPath技术和BeautifulSoup的使用
查看>>
python中yield的用法详解——最简单,最清晰的解释
查看>>
python中‘set.intersection()‘的算法是什么?
查看>>
Python中一个图形中的多个绘图
查看>>
python中一个好的持久同步队列
查看>>
Python中不准确的对数
查看>>
python中什么是实例方法_在Python中创建实例方法对象的不同方法
查看>>
Python中使用cutecharts实现简单的手绘风格的图表
查看>>
python中使用dxfgrabber,解析dxf文件信息生成obj文件
查看>>
Python中使用ncmbot玩转网易云音乐
查看>>
Python中使用PIL快速实现二值图
查看>>
Python中使用PIL快速实现灰度图
查看>>
Python中使用pip install ncmbot时各种错误解决办法
查看>>