本文主要是介绍严蔚敏 《数据结构》第二章线性表 2.3节线性表的链式表示 C++实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
严蔚敏 《数据结构》第二章线性表 2.3节线性表的链式表示 C++实现
代码没有怎么测试过,可能有些地方有BUG
// link_list.h
// By Envirian
#ifndef LINK_LIST_H_
#define LINK_LIST_H_
#include <iostream>
using std::cin;
using Status = int; // 返回值类型
const int TRUE = 1;
const int FALSE = 0;
const int OK = 1;
const int ERROR = 0;
const int INFEASIBLE = -1;
using ElemType = int; // 数据项类型
// LinkList为带头节点的单链表,第0个元素不储存信息,第1个元素开始储存信息
// 使用之前必须先调用InitList()!!!!!
class LinkList {
private:struct LNode{ElemType data;LNode* next{nullptr};};public:// 以下是P37到P38的函数Status InitList(){// 构造一个空的线性链表if (head_)return ERROR; // 已经存在线性链表了head_ = new LNode;tail_ = nullptr;len_ = 0;return OK;}Status DestroyList(){// 销毁线性链表,使其回到InitList()之前的状态,并释放空间if (!head_)return OK;LNode* p = head_;// 回到初始化之前状态head_ = tail_ = nullptr;len_ = 0;// 释放空间LNode* q = p->next;while (p) {delete p;p = q;q = p->next;}return OK;}Status ClearList(){// 将线性链表重置为初始化后的空表DestroyList();if (!InitList())return ERROR;return OK;}Status InsFirst(const ElemType& e){// 把e插入到链表头部if (!ListInsert(1, e))return ERROR;return OK;}Status DelFirst(ElemType& e){// 删除链表的第一个节点并以e返回if (!ListDelete(1, e))return ERROR;return OK;}Status InsLast(const ElemType& e){if (!ListInsert(len_ + 1, e))return ERROR;return OK;}Status DelLast(ElemType& e){// 删除链表的尾节点并以e返回if (!ListDelete(len_, e))return ERROR;return OK;}Status GetHead(ElemType& e){// 获取第一个元素,用e返回if (!head_->next)return ERROR;e = head_->next->data;return OK;}Status GetBack(ElemType& e){// 获取最后一个元素,用e返回if (!tail_)return ERROR;e = tail_->data;return OK;}Status ListEmpty(){// 若链表为空表,则返回TRUE,否则返回FALSEif (len_ == 0)return TRUE;return FALSE;}int ListLength(){// 返回线性表中的元素个数return len_;}// 以下是P29到P31的函数Status GetElem(int i, ElemType& e){// 当第i个元素存在时,其值赋给e并返回OK,否则返回ERRORLNode* p = head_->next;int ctr = 1; // 初始化,p指向第一个节点,ctr为计数器while (p && ctr < i) { // 顺指针向后查找,直到p指向第i个元素或p为空p = p->next;++ctr;}if (!p || ctr > i)return ERROR; // 第i个元素不存在e = p->data; // 取第i个元素return OK;}Status ListInsert(int i, const ElemType& e){// 在带头结点的单链线性表中第i个位置之前插入元素eLNode* p = head_;int ctr = 0;while (p && ctr < i - 1) { // 寻找i-1个节点p = p->next;++ctr;}if (!p || ctr > i - 1)return ERROR; // i大于表长加1或i小于1LNode* s = new LNode; // 生成新节点s->data = e; // 赋值if (p->next == nullptr)tail_ = s; // 如果是插入后成为最后一个节点,更新尾节点s->next = p->next; // 插入L中,注意顺序p->next = s;++len_;return OK;}Status ListDelete(int i, ElemType& e){// 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值LNode* p = head_;int ctr = 0;while (p->next && ctr < i - 1) {// 寻找第i个节点并令p指向其前驱p = p->next;++ctr;}if (!p->next || ctr > i - 1)return ERROR; // 删除位置不合理if (!p->next->next)tail_ = p; // 如果要删除的是尾节点,那么更新尾节点LNode* q = p->next; // 删除并释放节点p->next = q->next;e = q->data;delete q;--len_;return OK;}Status CreateList(int n){// 逆位序输入n个元素的值,建立带表头结点的单链线性表(头插法)if (head_)return ERROR; // 单链线性表非空// TODO(@Envirian): 等写了清空操作之后把这里改写成先清空head_ = new LNode; // 建立带头结点for (int i = 0; i < n; ++i) {LNode* p = new LNode; // 生成新节点cin >> (p->data);if (i == 0)tail_ = p; // 第一个插入的节点也是尾节点p->next = head_->next; // 放到表头head_->next = p;}return OK;}private:LNode* head_{nullptr}; // 头节点LNode* tail_{nullptr}; // 尾节点int len_{0}; // 线性表中数据元素的个数
};#endif
这篇关于严蔚敏 《数据结构》第二章线性表 2.3节线性表的链式表示 C++实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!