本文共 4153 字,大约阅读时间需要 13 分钟。
单链表是数据结构中最基本的线性数据组织方式之一,广泛应用于内存分配、文件读写等场景。本文将详细介绍C++实现单链表的16种基本操作,并附上对应的代码示例。
链表的初始化需要创建一个带有头节点的空链表。头节点的data域可以为空,next域指向第一个数据节点。
bool InitList_L(Linklist &L) { // 创建一个带有头节点的空链表 L = new Lnode; if (!L) return false; L->next = NULL; return true;} 头插法的特点是新插入的节点会成为链表的新头,链表的数据顺序会与输入顺序相反。
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; }} 尾插法的特点是新插入的节点会成为链表的新尾,链表的数据顺序与输入顺序一致。
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; }} 通过遍历链表节点,逐个打印数据域的内容即可实现链表的输出。
void Show_L(Linklist &L) { Linklist s = L->next; while (s) { cout << s->data << " "; s = s->next; } cout << endl; cout << "输出完毕" << endl;} 通过遍历链表,根据给定的索引位置取出对应节点的数据。
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;} 通过遍历链表,查找数据域等于指定值的节点,并返回其位置。
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;} 在指定位置插入新节点,链表的前后节点指针需要正确调整。
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;} 删除指定位置的节点,需要调整前后节点的指针。
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;} 通过调整节点的指针,实现链表的逆转。
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;} 释放链表中的所有节点,链表变为空链表。
void clear_L(Linklist &L) { Linklist p = L->next; while (p) { Linklist q = p; p = q->next; free(q); } L->next = NULL;} 通过遍历链表,删除数据域与前一个节点相同的节点。
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; }} 通过遍历链表,统计节点的个数(不包括头节点)。
int GetLength(Linklist &L) { int n = 0; Linklist p = L; while (p->next) { p = p->next; n++; } return n;} 检查头节点的next域是否为空来判断链表是否为空。
bool IsEmpty(Linklist &L) { return L->next == NULL;} 将两个有序链表合并,生成一个新的有序链表。
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; }} 将两个无序链表合并,生成一个新的链表,无需排序。
void CoalitionLinkList(Linklist &A, Linklist &B) { Linklist p = A; Linklist q = B; while (p->next) { p = p->next; } p->next = q->next; free(B);} 通过以上基本操作,可以实现链表的初始化、插入、删除、查找、逆转、清空、合并等功能,满足多种实际需求。
转载地址:http://acrcz.baihongyu.com/