1. Linklist设计要点
- 类模板,通过头结点访问后继节点
- 定义内部节点类型Node,用于描述数据域和指针域
- 实现线性表关键操作如增、减、查等
2、Linklist的定义
3.代码
#ifndef LINKLIST_H
#define LINKLIST_H
#include "List.h"
namespace DataStructureLib
{
template <typename T>
class LinkList:public List<T>
{
protected:
struct Node{
T value;
Node* next;
};
mutable Node m_header;//头结点 、mutable为了让get函数中的const属性导致的&m_header(编译器认为是要修改成员变量)mutable就允许const成员函数取地址
int m_length;//链表的长度
Node* position(int i) const//返回第i和元素的指针
{
Node* ret=&m_header;
for(int p=0;p<i;p++)
{
ret=ret->next;
}
return ret;//元素地址保存在该节点的next指针域中
}
public:
LinkList()
{
m_header.next=NULL;
m_length=0;
}
bool insert(int index, const T& elem)//思路:1.找到index位置处的元素;2.在该元素尾部insert新元素
{
bool ret=(index<=m_length)&&(index>=0);
Node* NewNode=new Node ;
if (ret)
{
if (NULL!=NewNode)
{
NewNode->value=elem;
Node* indexNode=position(index);
NewNode->next=indexNode->next;
indexNode->next=NewNode;
m_length++;
}
else{
throw("has Not enougth memory to insert new element ...");
}
}
return ret;
}
bool remove(int index)
{
bool ret=((index<=m_length)&&(index>=0));
if (ret)
{
Node* CurrentNode=position(index);
Node* toDelNode=CurrentNode->next;
CurrentNode->next=toDelNode->next;
delete toDelNode ;
m_length--;
}
return ret;
}
bool set(int index,const T& e)
{
bool ret=((0<=index)&&(index<=m_length));
if (ret)
{
Node* CurrentNode=position(index);
CurrentNode->next->value=e;
}
return ret;
}
bool get(int index, T& elem) const
{
bool ret=((index<=m_length)&&(index>=0));
if (ret)
{
Node* CurrentNode=position(index);
elem= CurrentNode->next->value;
}
return ret;
}
T get(int index)
{
T ret;
if((index<m_length)&&(0<=index))
{
Node* CurrentNode=position(index);
ret= CurrentNode->next->value;
}
return ret;
}
int getlength() const
{
return m_length;
}
void clear()
{
while (m_header.next)
{
Node* toDelNode=m_header.next;
m_header.next=toDelNode->next;
delete toDelNode;
}
m_length=0;
}
//寻找e元素所在的位置,
//返回值 失败:-1 成功:e元素所在的位置的id
int find(T& e)
{
int ret = -1;
for (int i=0;i<m_length;i++)
{
if (e==get(i))
{
ret=i;
}
}
return ret;
}
~LinkList()
{
clear();
}
};
}
#endif
测试
#include<iostream>
#include "object.h"
#include "SeqList.h"
#include "LinkList.h"
using namespace std;
using namespace DataStructureLib;
int main(int argc, char const *argv[])
{
LinkList<int> linklist;
for (int i=0;i<9;i++)
{
linklist.insert(0,i);
}
for (int i=0;i<linklist.getlength();i++)
{
int tmp;
linklist.get(i,tmp);
cout<<tmp<<'\n';
}
int value=5;
cout<<"value location :"<<linklist.find(value)<<'\n';
linklist.clear();//清空链表中的数据
for (int i=0;i<linklist.getlength();i++)
{
int tmp;
linklist.get(i,tmp);
cout<<tmp<<'\n';
}
system("pause");
return 0;
}
小结
(1)通过类模板实现链表,包括头结点成员和长度成员
(2)定义结点类型,并通过堆中的结点对象构成链式存储
(3)插入和删除操作需要保证链表的完整性
浙公网安备 33010602011771号