相关内容:

线性表的顺序实现

链式实现(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. javaScript 笔记(4) -- 弹窗 & 计时事件 & cookie

    弹窗 可以在 JavaScript 中创建三种消息框:警告框.确认框.提示框. 警告框:经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. 语法: window ...

  2. Intellij热部署插件JRebel

    Intellij热部署插件JRebel 安装JRebel 激活JRebel 相关设置 Intellij热部署插件JRebel 项目需求,一直用eclipse的我,也要改用IDEA了,一开始,很不习惯. ...

  3. 洛谷 [P3620] 数据备份

    贪心神题 首先我们发现一个显然的贪心策略,连接相邻两个写字楼总是更优. 所以本题就变成了数轴上一堆点,要选 k 个彼此不相邻的区间,使得区间长度最小 对于 10000 的数据来说,我们可以用 DP 解 ...

  4. 【UVA10561】Treblecross(SG函数)

    题意:有n个格子排成一行,其中一些格子里面有字符X.两个游戏者轮流操作,每次可以选一个空格,在里面放上字符X. 如果此时有3个连续的X出现,则该游戏者赢得比赛.初始条件下不会有3个X连续出现. 判断先 ...

  5. 30+ Excellent Windows Phone 7 Development Tutorials

    原文发布时间为:2012-01-16 -- 来源于本人的百度文章 [由搬家工具导入] Here are 30+ cool Windows Phone Development articles for ...

  6. ashx输出文字,执行JavaScript,输出图片等

    原文发布时间为:2009-09-30 -- 来源于本人的百度文章 [由搬家工具导入] 一提到Ashx文件,我们就会想到http handler以及图片加载(在之前我们一般使用ASPX或者Webserv ...

  7. C# List排序,附加使用Linq排序

    首先先介绍一下平时最常用的几种排序方法. 第一种:实体类实现IComparable接口,而且必须实现CompareTo方法 实体类定义如下: class Info:IComparable { publ ...

  8. Color.FromArgb()方法详解

    关于颜色值的表示 常用的颜色值表示方式有两种,一种是10进制的RGB值表示,如(0,113,255),三个值分别表示(红,绿,蓝):一种是16进制的颜色码表示,如#ff3212.这两种形式在编程中都可 ...

  9. C# 用实例来理解IComparable和IComparer

    通过Array的Sort方法来理解的 Sort方法要 通过对象去继承IComparable接口来实现排序(当然也有其它办法),我想入门这可能就是对这句话有点不理解,在下面会有注释 using Syst ...

  10. Android判断是否为刘海屏

    主要总结主流品牌小米.华为.oppo.vivo的刘海屏判断.在某些特殊页面需要适配刘海屏时,可以用以下方法判断.或者判断屏幕比例是否大于2. /** * 小米刘海屏判断. */ public stat ...