线性表的链式实现(C++)
相关内容:
(推荐在GitHub上查看,下面代码只是最初实现,后续如果有修改,由于太麻烦,不会再更改下文,仅仅更新Github上的代码文件)
结点以及链表类的定义:
#define ElemType int class LNode {
public:
LNode(ElemType ele, LNode *pointer) :data(ele), next(pointer) { } LNode(ElemType ele) {
data = ele;
next = nullptr;
} LNode() {
data = ;
next = nullptr;
} ElemType data;
LNode *next;
}; class LinkList {
public:
LinkList() {
head = nullptr;
} // 初始化时,创建一个长度为len的链表
LinkList(int len) {
head = nullptr;
this->LListAddNodes(len);
} ~LinkList() {
this->LListDestory();
} LNode *LListHead() {
return head;
} // 设置链表头结点
void LListSetHead(LNode *node) {
head = node;
} // 获取链表长度
int LListLength(); // 判断链表是否为空
bool LListEmpty() {
return(head == nullptr) ? true : false;
} // 返回链表中第pos个结点
bool GetNode(int pos, LNode **node); // 返回指定data在链表中第一次出现的位置
bool LocateNode(ElemType ele, LNode **node); // 在指定位置插入后一个结点,但若pos为0是表示在链表头插入一个结点
bool LListInsert(int pos, LNode *node); // 删除指定位置结点
bool LListDelete(int pos); // 删除指定位置结点并返回被删除结点的信息
bool LListDelete(int pos, LNode *node); // 遍历线性表
void LListTraverse(); // 在链表尾添加cnt个结点
bool LListAddNodes(int cnt); // 销毁链表,释放所有结点资源
void LListDestory(); private:
LNode *head;
};
具体实现:
int LinkList::LListLength()
{
int cnt = ;
LNode *node = head; while (node != nullptr) {
cnt++;
node = node->next;
}
return cnt;
} bool LinkList::GetNode(int pos, LNode **node)
{
if (pos > this->LListLength() || pos < )
return false; LNode *cur = head; for (int i = ; i <= pos; i++) {
cur = cur->next;
} *node = cur; return true;
} bool LinkList::LocateNode(ElemType ele, LNode **node)
{
LNode *curNode = head;
while (curNode != nullptr) { if (curNode->data == ele) {
*node = curNode;
return true;
}
curNode = curNode->next;
} return false;
} bool LinkList::LListInsert(int pos, LNode *node)
{
// 插入位置错误
if (pos < || pos > this->LListLength())
return false; if (pos == ) {
node->next = head;
head = node;
}
else {
LNode *temp = nullptr;
this->GetNode(pos, &temp);
node->next = temp->next;
temp->next = node;
} return true;
} bool LinkList::LListDelete(int pos)
{
if (pos < || pos > this->LListLength())
return false; if (pos == ) { // 删除头结点
LNode *temp = head;
head = temp->next;
delete(temp);
}
else {
LNode *temp_1 = nullptr;
LNode *temp_2 = nullptr;
this->GetNode(pos - , &temp_1); // 获取被删除结点的前一个结点
temp_2 = temp_1->next;
temp_1->next = temp_2->next;
delete(temp_2);
} return true;
} // 删除结点立即释放结点所占用的空间,被返回的仅仅是被删除结点的信息
bool LinkList::LListDelete(int pos, LNode *node)
{
if (pos < || pos > this->LListLength())
return false; if (pos == ) {
LNode *temp = head;
head = temp->next;
node->data = temp->data;
node->next = temp->next;
delete(temp);
}
else {
LNode *temp_1 = nullptr;
LNode *temp_2 = nullptr;
this->GetNode(pos - , &temp_1);
temp_2 = temp_1->next;
temp_1->next = temp_2->next;
node->data = temp_2->data;
node->next = temp_2->next;
delete(temp_2);
} return true;
} void LinkList::LListTraverse()
{
LNode *curNode = head; while (curNode != nullptr) {
std::cout << curNode->data << std::endl;
curNode = curNode->next;
}
} bool LinkList::LListAddNodes(int cnt)
{
//std::cout << cnt << std::endl; if (cnt < )
return false;
else if (cnt == )
return true; LNode *curNode = head; if (curNode != nullptr) {
// 找到链表尾结点
while (curNode->next != nullptr) {
curNode = curNode->next;
} for (int i = ; i < cnt; i++) {
int temp;
std::cin >> temp;
LNode *node = new LNode(temp); if (!node) {
return false;
} //node->next = nullptr;
//node->data = i; curNode->next = node;
curNode = node;
}
}
else {
int temp;
std::cin >> temp;
LNode *node = new LNode(temp);
head = node;
curNode = node; for (int i = ; i < cnt - ; i++) {
std::cin >> temp;
node = new LNode(temp); if (!node) {
//std::cout << "new Error!" << std::endl;
return false;
} curNode->next = node;
curNode = node;
}
} return true;
} void LinkList::LListDestory()
{
//std::cout << "Destory!" << endl;
LNode *cur = head; if (!cur)
return; LNode *next = cur->next; while (cur) {
delete cur; if (next) {
cur = next;
next = next->next;
}
else
break;
}
}
用于测试的代码及测试结果:
#include "link_list.h" int main()
{
//LNode node(5);
//if (node.next == nullptr)
//std::cout << "next = nullptr, data = " << node.data << std::endl; LinkList list();
//LinkList list; int len = list.LListLength();
std::cout << "InitLen = " << len << std::endl; if (list.LListEmpty())
std::cout << "Empty List!" << std::endl; std::cout << std::endl << "First Traverse: " << std::endl; list.LListTraverse(); std::cout << std::endl << "Insert two Node!" << std::endl; LNode *node = new LNode(); if (!node)
std::cout << "new Error!" << std::endl; LNode *node_2 = new LNode(); if (!node_2)
std::cout << "new Error!" << std::endl; list.LListInsert(, node);
list.LListInsert(, node_2); len = list.LListLength();
std::cout << "CurLen = " << len << std::endl; std::cout << std::endl << "Second Traverse: " << std::endl;
list.LListTraverse(); std::cout << "Get Node's Data!" << std::endl;
LNode *node_pos_3 = nullptr;
list.GetNode(, &node_pos_3); std::cout << "node_pos_3: " << "data = " << node_pos_3->data << std::endl; LNode node_del;
if (list.LListDelete(, &node_del)) {
std::cout << "Delete Node: " << "data = " << node_del.data << std::endl;
} len = list.LListLength();
std::cout << "CurLen = " << len << std::endl; std::cout << std::endl << "Third Traverse: " << std::endl;
list.LListTraverse(); std::cout << "End..." << std::endl;
int temp;
std::cin >> temp; return ;
} /*
输出信息:
1
2
3
4
5
InitLen = 5 First Traverse:
1
2
3
4
5 Insert two Node!
CurLen = 7 Second Traverse:
0
1
2
3
4
5
6
Get Node's Data!
node_pos_3: data = 2
Delete Node: data = 2
CurLen = 6 Third Traverse:
0
1
3
4
5
6
End...
*/
线性表的链式实现(C++)的更多相关文章
- C++线性表的链式存储结构
C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...
- C语言 线性表 双向链式结构 实现
一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...
- C 线性表的链式存储实现及插入、删除等操作示例
一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...
- 数据结构-线性表的链式存储相关算法(C语言实现)
链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 线性表 顺序存储 链式存储 ---java实现
首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...
- 线性表的链式存储——C语言实现
SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...
- 线性表的链式存储C语言版
#include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...
随机推荐
- Ant自动打包
在ant的官网http://ant.apache.org进行下载后apache-ant-1.8.2包 解压(存放的路径不要有中文字符) 把ant里的lib设置到环境变量:E:\Android\apac ...
- BZOJ 2146 Construct
Construct [问题描述] 随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---56
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 移动开发平台 apicloud、wex5
http://www.apicloud.com/deepengine http://www.wex5.com
- syslog/rsyslog的使用
syslogd是Linux下的一个记录日志文件服务.从结构来说,可以理解为这个服务下面有一系列的子服务,例如mail.auth.cron.kern等等,这些子服务对外提供日志记录的功能,而当其它的程序 ...
- java模拟一次简单的sql注入
在数据库中生成 一个用户表 有用户名 username 和密码password 字段 并插入两组数据 正常的sql查询结果 非正常查询途径返回的结果 下面用一段java代码 演示一下用户登录时的sq ...
- dracut 基本介绍
dracut 维基 https://dracut.wiki.kernel.org/index.php/Main_Page http://www.360doc.com/content/13/042 ...
- grep的简单理解
概述: grep最早由肯·汤普逊写成.原先是ed下的一个应用程序,名称来自于g/re/p(globally search a regular expression and print,以正则进行全域查 ...
- 强连通分量(Tarjan)模板
贴模板,备忘. 模板1: #include<iostream> #include<cstring> #include<cmath> #include<cstd ...
- Codeforces Gym100814 B.Unlucky Teacher (ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (2015) Arab Academy for Science and Technology)
今日份的训练题解,今天写出来的题没有昨天多,可能是因为有些事吧... 这个题就是老师改卷子,忘带标准答案了,但是他改了一部分卷子,并且确定自己改的卷子没出错,他想从改过的卷子里把标准答案推出来. 因为 ...