本文主要总结常用的数据结构——线性表之链式描述,实现其基本的增删查改功能,不涉及完整功能,目的是为了熟悉常用数据结构属性和代码实现底层原理。
顺序表结构有以下缺点:
- 插入或删除节点时,需要移动大量数据
- 如果表很大,有时难以分配连续存储空间,导致内存分配失败而无法存储
而链表内存空间却可以不是连续的,所以链表恰好解决了顺序表只能申请连续存储空间的缺点。那么,链表是什么呢?接下来让我们学习一下什么是链表?
一、线性表——链式描述ChainList
1.1链表定义(链表数据结构的创建和调用(C++))
- 链表的定义可以参考博主上面写的一篇博客,本文主要是讲解链表的创建,增删查改的代码实现。
链表是在物理上可以是非连续的存储空间,由一片片存储区域组成,每个存储区域又被成为节点,每个节点又指向下一个节点,用一个链表头和链表尾串起来,所以被称为链表。链表的每个节点由两部组成,分别是数据区和指针。数据区存储需要的数据,指针指向下一个节点。下面是一个链表示意图:
图1 链表结构
由上图可知,链表每个节点都由数据区和指针区域组成,这些节点通过指针指向下一个节点。
1.2线性表的基本运算
1.2.1基本运算
(1) 初始化(构造一个空的链表)
(2) 计算表长(线性表节点个数)
(3) 插入节点(插入当前位置,指向当前节点的修改为指向要插入的节点)
(4) 删除节点(指向要删除的指针修改为指向下一个节点,然后释放被删除节点的内存空间)
(5) 查找节点(返回查找到的节点首地址或者指针)
(6) 修改节点(先查找,然后再替换该节点数据)
简单来说,就是实现链表的初始化、节点的增删查改。
1.3线性表结构(链表)
图1 链表结构
1.4代码实现
common.h
#pragma once
typedef short int BYTE;
typedef unsigned int WORD32;
Element.h
#pragma once
#include "common.h"
class Element
{
public:
Element();
Element(BYTE key, WORD32 value);
~Element();
BYTE getKey() const;
WORD32 getValue() const;
private:
BYTE key;
WORD32 value;
};
Node.h
#pragma once
#include "Element.h"
class Node
{
public:
Node(const Element& data, Node* next = nullptr);
~Node();
const Element& getData() const;
Node* getNext();
void setNext(Node* next);
void dumpData() const;
Node* next; // 指向下一节点指针
private:
Element data; // 数据成员
};
Node.cpp
#include "Node.h"
#include <iostream>
Node::Node(const Element& data, Node* next)
: data(data)
, next(next)
{
}
Node::~Node()
{
}
const Element& Node::getData() const
{
return data;
}
Node* Node::getNext()
{
return next;
}
void Node::setNext(Node* next)
{
this->next = next;
}
void Node::dumpData() const
{
std::cout << "Node: key == " << data.getKey() << " value == "
<< data.getValue