相关内容:

线性表的顺序实现

链式实现(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++)的更多相关文章

  1. C++线性表的链式存储结构

    C++实现线性表的链式存储结构: 为了解决顺序存储不足:用线性表另外一种结构-链式存储.在顺序存储结构(数组描述)中,元素的地址是由数学公式决定的,而在链式储存结构中,元素的地址是随机分布的,每个元素 ...

  2. C语言 线性表 双向链式结构 实现

    一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...

  3. C++编程练习(2)----“实现简单的线性表的链式存储结构“

    单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...

  4. C 线性表的链式存储实现及插入、删除等操作示例

    一.链式存储的优势 线性表的存储可以通过顺序存储或链式存储实现,其中顺序存储基于数组实现(见本人上一篇博客),在进行插入删除等操作时,需对表内某一部分元素逐个移动,效率较低.而链式结构不依赖于地址连续 ...

  5. 数据结构-线性表的链式存储相关算法(C语言实现)

    链表的简单介绍 为什么需要线性链表 当然是为了克服顺序表的缺点,在顺序表中,做插入和删除操作时,需要大量的移动元素,导致效率下降. 线性链表的分类 按照链接方式: 按照实现角度: 线性链表的创建和简单 ...

  6. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  7. 线性表 顺序存储 链式存储 ---java实现

    首先抽象出一个线性表抽象类(包括主要的增删操作) public abstract class MyAbstractList<E> { public abstract void add(E ...

  8. 线性表的链式存储——C语言实现

    SeqList.h #ifndef _WBM_LIST_H_ #define _WBM_LIST_H_ typedef void List; typedef void ListNode; //创建并且 ...

  9. 线性表的链式存储C语言版

    #include <stdio.h> #include <malloc.h> #define N 10 typedef struct Node { int data; stru ...

随机推荐

  1. poj 1743 Musical Theme 后缀自动机/后缀数组/后缀树

    题目大意 直接用了hzwer的题意 题意:有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题."主题&qu ...

  2. form快速转json serialize

    原文发布时间为:2011-03-28 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tran ...

  3. 属性动画详解一(Property Animation)

    效果图: Android动画有3类: 1.View Animation (Tween Animation) 2.Drawable Animation (Frame Animation) 2.Prope ...

  4. Oracle创建自增长主键

    Oracle主键常用的分为UUID和自增长int两种,下面简单说下各自的优缺点: UUID的优点 1.生成方便,不管是通过sys_guid() 还是java的uuid都能很方便的创建UUID. 2.适 ...

  5. .NET 下二维码解决方案

    使用Zint和Zxing实现二维码的编码与解码(Using open-source tools to generate and decode Q-R code) 1.Zint生成二维码 http:// ...

  6. 源码分析——迁移学习Inception V3网络重训练实现图片分类

    1. 前言 近些年来,随着以卷积神经网络(CNN)为代表的深度学习在图像识别领域的突破,越来越多的图像识别算法不断涌现.在去年,我们初步成功尝试了图像识别在测试领域的应用:将网站样式错乱问题.无线领域 ...

  7. SQLite中特殊的INSERT语句

    SQLite中特殊的INSERT语句   在SQLite中,INSERT是基本语句,用来向表中插入数据.但是当表中存在字段存在唯一.非空.检查.主键等约束时,插入的数据很容易和约束冲突,造成插入操作失 ...

  8. 《Microsoft SQL Server 2008 Internals》读书笔记--目录索引

    http://blog.csdn.net/downmoon/article/details/5256548 https://sqlserverinternals.com/companion/

  9. linux 学习解决归档管理器打开rar和zip中文文件名乱码问题

    在ubunut下打开windows下压缩的rar文件和zip压缩文件出现中文文件名乱码的问题真的很头疼.文件名乱码其实也没有什么关系是不?至少重命名再改回来或者是使用英文命名都可以克服.不巧的是,如此 ...

  10. 排序算法之高速排序(Java)

    //高速排序 public class Quick_Sort { // 排序的主要算法 private int Partition(int[] data, int start, int end) { ...