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

你可能感兴趣的文章
Objective-C实现IIR 滤波器算法(附完整源码)
查看>>
Objective-C实现IIR数字滤波器(附完整源码)
查看>>
Objective-C实现insertion sort插入排序算法(附完整源码)
查看>>
Objective-C实现integer partition整数分区算法(附完整源码)
查看>>
Objective-C实现integerPartition整数划分算法(附完整源码)
查看>>
Objective-C实现interpolation search插值搜索算法(附完整源码)
查看>>
Objective-C实现Interpolation search插值查找算法(附完整源码)
查看>>
Objective-C实现intersection交集算法(附完整源码)
查看>>
Objective-C实现intro sort内省排序算法(附完整源码)
查看>>
Objective-C实现inverse matrix逆矩阵算法(附完整源码)
查看>>
Objective-C实现inversions倒置算法(附完整源码)
查看>>
Objective-C实现isalpha函数功能(附完整源码)
查看>>
Objective-C实现islower函数功能(附完整源码)
查看>>
Objective-C实现isPowerOfTwo算法(附完整源码)
查看>>
Objective-C实现isupper函数功能(附完整源码)
查看>>
Objective-C实现ItemCF算法(附完整源码)
查看>>
Objective-C实现ItemCF算法(附完整源码)
查看>>
Objective-C实现iterating through submasks遍历子掩码算法(附完整源码)
查看>>
Objective-C实现iterative merge sort迭代归并排序算法(附完整源码)
查看>>
Objective-C实现jaccard similarity相似度无平方因子数算法(附完整源码)
查看>>