回头整理一下以前课程实验的代码,顺便学习一波。
问题描述实验要求
基于教材内容,实现线性表。
基本要求
需要基于顺序表(数组)或链表来实现线性表ADT
需要实现线性表的各个基本操作
编写一个demo程序,测试线性表的各个基本操作的功能是否正常
一、实验分析:
ADT就是抽象数据结构,线性表有两种,顺序表也就是我们常用的数组,另一种是链表,顺序表和链表最大的区别就在于地址,顺序表存储数据的地址是连续的且空间利用率高。而链表存储数据的地址是不连续的,空间利用率比顺序表低很多,因为链表的空间需要存储指针和数据。顺序表如何实现我就不说了,重点说下链表的实现方式。实现链表一般基于类或者结构体均可。刚才我说了链表有两种东西是一定要定义的:数据域和指针域,因此可以这样定义:int data , Link * next ;那么单个链表节点类需要的属性就定义好了,注意是单个链表节点,一定要分清和链表的区别,多个链表节点连起来才是链表。构造方法就是初始化一下这些属性。然后就是链表的构造再单独写一个类,这个类的作用就是链接节点以及一些链表的基本操作(基本操作有删除一个节点、添加一个节点、查找某一个节点,就是删查找)。
二、具体实现:
链表单个节点类:
class LinkNode{ //单链表
public:
int elem;//数据域,用于保存节点的数据
LinkNode *next; //next指针,指向节点的元素域
LinkNode(int Elem = 0,LinkNode *link = NULL) { this->elem = Elem; this->next = link; }//构造一个链表
};
(整条链表)链表类:
class LLink{
private:
LinkNode* head;//表头节点
LinkNode* tail;//表尾节点
int length;//链表长度
public:
LLink();
~LLink();
bool Add(LinkNode* );//向链表添加节点
bool insert(int,LinkNode'*);//在任意位置插入一个新节点
void print();//打印链表
int getLenght(){ return this->length;}//返回链表长度
int getElementByPos(int);//返回任意位置节点
void pop();//删除链尾节点
int getLast() const;//返回链尾节点
bool deleteElementByPos(int);//删除任意位置节点
int getPos(int,LLink* link);//返回元素的位置
};
以上这个类分别定义了一些基本操作。
下面讲如何具体实现:
1.如何将节点连成一条链呢?
有两种方法:(1)头插法(2)尾插法。
头插法就是先定义一个表头,就是那个head指针,表头独有的,然后每往链表加入一个新节点,都将新节点接在头节点的后面,这样子的插入方法叫头插法。
如图:
第二种就是尾插法啦,尾插顾名思义每次都将新节点作为尾节点插入,什么意思呢?就是接在上一次插入节点的后面。
如图: