voidCreateList_Tail(LinkList &L, int n) { if (L->next != NULL) { cout << "链表已存在,请先清空或销毁链表!" << endl; return; } LinkList r = L; // r指向尾节点 cout << "请依次输入" << n << "个数据:" << endl; for (int i = 1; i <= n; i++) { LinkList p = new LNode; cout << "第" << i << "个数据: "; cin >> p->data; p->next = NULL; r->next = p; // 插入到尾部 r = p; // r指向新的尾节点 } cout << "链表创建成功!" << endl; }
功能: 使用尾插法创建包含n个节点的链表 优点: 保持输入顺序 时间复杂度: O(n)
3.3 获取链表长度
1 2 3 4 5 6 7 8 9 10 11
intListLength(LinkList L) { int length = 0; LinkList p = L->next; // 从第一个数据节点开始 while (p != NULL) { length++; p = p->next; } return length; }
功能: 遍历链表统计节点个数 时间复杂度: O(n)
四、查找操作模块
4.1 按位置获取元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14
Status GetElem(LinkList L, int i, int &e) { LinkList p = L->next; int j = 1; while (p && j < i) // 查找第i个节点 { p = p->next; j++; } if (!p || j > i) // 位置不合法 return ERROR; e = p->data; // 获取数据 return OK; }
intLocateElem(LinkList L, int e) { LinkList p = L->next; int position = 1; while (p != NULL) { if (p->data == e) return position; p = p->next; position++; } return0; // 未找到返回0 }
Status ListInsert(LinkList &L, int i, int e) { LinkList p = L; int j = 0; while (p && j < i - 1) // 找到第i-1个节点 { p = p->next; j++; } if (!p || j > i - 1) return ERROR; LinkList s = new LNode; // 创建新节点 s->data = e; s->next = p->next; // 新节点指向后继 p->next = s; // 前驱指向新节点 return OK; }
功能: 在第i个位置插入元素e 步骤:
找到第i-1个节点
创建新节点
修改指针完成插入
时间复杂度: O(n)
5.2 删除元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Status ListDelete(LinkList &L, int i, int &e) { LinkList p = L; int j = 0; while (p->next && j < i - 1) // 找到第i-1个节点 { p = p->next; j++; } if (!(p->next) || j > i - 1) return ERROR; LinkList q = p->next; // q指向待删除节点 e = q->data; // 保存数据 p->next = q->next; // 修改指针 delete q; // 释放内存 return OK; }
typedefstructLNode { int data; structLNode *next; } LNode, *LinkList;
// 初始化单链表 Status InitList(LinkList &L) { L = new LNode; if (!L) return OVERFLOW; L->next = NULL; return OK; }
// 创建单链表(尾插法) voidCreateList_Tail(LinkList &L, int n) { if (L->next != NULL) { cout << "链表已存在,请先清空或销毁链表!" << endl; return; } LinkList r = L; cout << "请依次输入" << n << "个数据:" << endl; for (int i = 1; i <= n; i++) { LinkList p = new LNode; cout << "第" << i << "个数据: "; cin >> p->data; p->next = NULL; r->next = p; r = p; } cout << "链表创建成功!" << endl; }
// 获取链表长度 intListLength(LinkList L) { int length = 0; LinkList p = L->next; while (p != NULL) { length++; p = p->next; } return length; }
// 按位置获取元素 Status GetElem(LinkList L, int i, int &e) { LinkList p = L->next; int j = 1; while (p && j < i) { p = p->next; j++; } if (!p || j > i) return ERROR; e = p->data; return OK; }
// 按值查找位置 intLocateElem(LinkList L, int e) { LinkList p = L->next; int position = 1; while (p != NULL) { if (p->data == e) return position; p = p->next; position++; } return0; // 未找到返回0 }
// 在指定位置插入元素 Status ListInsert(LinkList &L, int i, int e) { LinkList p = L; int j = 0; while (p && j < i - 1) { p = p->next; j++; } if (!p || j > i - 1) return ERROR; LinkList s = new LNode; s->data = e; s->next = p->next; p->next = s; return OK; }
// 删除指定位置元素 Status ListDelete(LinkList &L, int i, int &e) { LinkList p = L; int j = 0; while (p->next && j < i - 1) { p = p->next; j++; } if (!(p->next) || j > i - 1) return ERROR; LinkList q = p->next; e = q->data; p->next = q->next; delete q; return OK; }
// 清空链表 voidClearList(LinkList &L) { LinkList p, q; p = L->next; while (p != NULL) { q = p; p = p->next; delete q; } L->next = NULL; }