单链表结构
头结点不存放数据,开始存放数据的节点为开始节点。
带头结点的单链表相关操作
/* * @file 单链表.cpp * @brief 单链表的创建及其相关操作 * @author linzijie * @platform Ubuntu 16.04 gcc version 5.4.0 * @date 2019/11/9 */ #include <iostream> #include <vector> using namespace std; // 单链表节点存储的数据类型定义 typedef int ElemType; // 单链表结构体定义如下 typedef struct LNode { ElemType data; struct LNode * next; }LinkList; /* * @brief 头插法建立单链表 * @param list 单链表头结点指针的引用 * datas 需要放入节点的数据 * @note list指针为空,建立时初始化,头结点不保存数据 * 采用头插法,数据的顺序与datas相反 * 动态申请内存空间,需要调用DestroyLinkList函数手动销毁 * @Sample LinkList *list = nullptr; * vector<ElemType> datas{1, 2, 3, 4, 5}; * CreateLinkListF(list, datas); */ void CreateLinkListF(LinkList *&list, vector<ElemType>& datas) { list = new LinkList; list->next = nullptr; LinkList *tmp = nullptr; for(auto iter = datas.begin(); iter != datas.end(); iter++) { tmp = new LinkList; tmp->data = (*iter); tmp->next = list->next; list->next = tmp; } } /* * @brief 尾插法建立单链表 * @param list 单链表头结点指针的引用 * datas 需要放入节点的数据 * @note list指针为空,建立时初始化,头结点不保存数据 * 采用尾插法,数据的顺序与datas一致 * 动态申请内存空间,需要调用DestroyLinkList函数手动销毁 * @Sample LinkList *list = nullptr; * vector<ElemType> datas{1, 2, 3, 4, 5}; * CreateLinkListR(list, datas); */ void CreateLinkListR(LinkList *&list, vector<ElemType>& datas) { list = new LinkList; list->next = nullptr; LinkList *tmp = nullptr; LinkList *now = list; for(auto iter = datas.begin(); iter != datas.end(); iter++) { tmp = new LinkList; tmp->data = (*iter); now->next = tmp; now = tmp; } now->next = nullptr; } /* * @brief 打印单链表 * @param list 单链表头结点指针的引用 * @note 头结点不保存数据,所以不打印头结点 * @Sample PrintLinkList(list) */ void PrintLinkList(LinkList *list) { LinkList *ptr = list; // 头结点不放数据 if (ptr != nullptr) ptr = ptr->next; while(ptr != nullptr) { cout << ptr->data << " "; ptr = ptr->next; } cout << endl; } /* * @brief 销毁单链表 * @param list 单链表头结点指针的引用 * @note 销毁动态申请的内存空间,防止内存泄露 * @Sample DestroyLinkList(list) */ void DestroyLinkList(LinkList *& list) { LinkList *now = list; LinkList *next = list->next; while(next != nullptr) { delete(now); now = next; next = now->next; } delete(now); } /* * @brief 单链表的数据插入 * @param list 单链表头结点指针的引用 * data 需要插入的数据 * index 需要插入的位置 * @note index从1开始,插入成功返回真,插入错误返回假 * @Sample ElemType data = 12; * int index = 2; * InsertData(list, data, index); */ bool InsertData(LinkList *& list, ElemType data, int index) { int count = 1; LinkList *iter = list; while(iter != nullptr) { if(count == index) { LinkList *node = new LinkList; node->data = data; node->next = iter->next; iter->next = node; return true; } else { iter = iter->next; count++; } } return false; } /* * @brief 单链表的数据删除 * @param list 单链表头结点指针的引用 * index 需要删除的位置 * @note index从1开始,删除成功返回真,删除错误返回假 * @Sample int index = 2; * IDeleteData(list, index); */ bool DeleteData(LinkList *& list, int index) { int count = 1; LinkList *iter = list; while(iter != nullptr) { if(count == index) { LinkList *tmp = iter->next; iter->next = iter->next->next; delete(tmp); return true; } else { iter = iter->next; count++; } } return false; } /* * @brief 单链表按位置查找元素值 * @param list 单链表头结点指针的引用 * index 需要定位的元素位置 * elem 获取的元素值存放的对象 * @note index从1开始,定位成功返回真,并且值保存在elem中,定位失败返回假 * @Sample GetElem(list, 1, elem); */ bool GetElem(LinkList *& list, int index, ElemType &elem) { LinkList *iter = list; if(iter != nullptr) iter = iter->next; int count = 1; while(iter != nullptr) { if(index == count) { elem = iter->data; return true; } else { iter = iter->next; count++; } } return false; } /* * @brief 单链表根据值定位节点 * @param list 单链表头结点指针的引用 * elem 元素值的引用 * result 保存定位到的LinkList指针 * @note index从1开始,定位成功返回真,并且值存放在result中,定位失败返回假 * result需清空后进行存放 * @Sample LocateElem(list, elem, result); */ bool LocateElem(LinkList *& list, const ElemType &elem, vector<LinkList*>& result) { LinkList *iter = list; if(iter != nullptr) iter = iter->next; result.clear(); while(iter != nullptr) { if(iter->data == elem) { result.push_back(iter); } iter = iter->next; } return !result.empty(); } /* * @brief 获取单链表节点数 * @param list 单链表头结点指针的引用 * @note 节点数包含头结点(未存放值的节点) * @Sample int length = GetLinkListLength(list); */ int GetLinkListLength(LinkList *& list) { int length = 0; LinkList *iter = list; while(iter != nullptr) { length++; iter = iter->next; } return length; }