静态链表——用顺序存储实现链式存储功能
2017-04-06 13:52
591 查看
一 静态链表
结构体
一个成员存放数据,另一个成员(link)存放下一个数据的位置。
存于数组中,构成静态链表:node SL[MAXSIZE]
数据前后关系不是以数组顺序决定,由link决定。或者说:
链表输出不是以数组顺序输出,而是由指定位置(link)输出。
值得注意的是,存在着两个链表:
数据链表:该链表存放有用的数据,头节点在SL【0】;
备用链表:插入新数据时分配此链表的空间,分配的空间转换成数据链表的一部分;头节点在SL【MAXSIZE-1】。
如下图所示:
二 程序实现:
1 建立一个SList.h文件:
2 测试SList类:
三 运行结果:
结构体
struct node{ T data; int link; };
一个成员存放数据,另一个成员(link)存放下一个数据的位置。
存于数组中,构成静态链表:node SL[MAXSIZE]
数据前后关系不是以数组顺序决定,由link决定。或者说:
链表输出不是以数组顺序输出,而是由指定位置(link)输出。
值得注意的是,存在着两个链表:
数据链表:该链表存放有用的数据,头节点在SL【0】;
备用链表:插入新数据时分配此链表的空间,分配的空间转换成数据链表的一部分;头节点在SL【MAXSIZE-1】。
如下图所示:
二 程序实现:
1 建立一个SList.h文件:
#ifndef SLIST_H
#define SLIST_H
const int MAXSIZE=10;
template <typename T>
class SList{
struct node{ T data; int link; };
private:
node SL[MAXSIZE];
int New(){
int i=SL[MAXSIZE-1].link;
if(i)
SL[MAXSIZE-1].link=SL[i].link;
return i;
}
void Delete(int k){
SL[k].link=SL[MAXSIZE-1].link;
SL[MAXSIZE-1].link=k;
}
public:
SList(){
int i;
SL[0].link=0;
SL[MAXSIZE-1].link=1;
for(i=1;i<MAXSIZE-2;i++)
SL[i].link=i+1;
SL[MAXSIZE-2].link=0;
}
void ClearList(){
int j,i=SL[MAXSIZE-1].link;
while(i){
j=i;
i=SL[i].link;
}
SL[j].link=SL[0].link;
SL[0].link=0;
}
bool ListEmpty(){
return SL[0].link==0;
}
int ListLen()const{
int count=0,i=SL[0].link;
while(i){
i=SL[i].link;
count++;
}
return count;
}
bool PriorElem(T e, bool(*eq)(T, T), T &pre_e)const
{
int j, i=SL[0].link;
do
{
j=i;
i=SL[i].link;
}while(i && !eq(SL[i].data, e));
if(i)
{
pre_e=SL[j].data;
return true;
}
return false;
}
bool NextElem(T e, bool(*eq)(T, T), T &next_e)const
{
int i=SL[0].link;
while(i)
{
if(eq(SL[i].data, e) && SL[i].link)
{
next_e=SL[SL[i].link].data;
return true;
}
i=SL[i].link;
}
return false;
}
bool InsertElem(int i,T e){
int m,k=0;
for(m=1;m<i;m++){
k=SL[k].link;
if(k==0)
break;
}
if(m<i) return false;
else{
m=New();
if(m){
SL[m].data=e;
SL[m].link=SL[k].link;
SL[k].link=m;
return true;
}
return false;
}
}
bool DeleteElem(int i,T &e){
int m,k=0;
for(m=1;m<i;m++){
k=SL[k].link;
if(k==0) break;
}
if(m<i||SL[k].link==0) return false;
else{
m=SL[k].link;
SL[k].link=SL[m].link;
e=SL[m].data;
Delete(m);
return true;
}
}
void ListPrint(void(*visit)(T*)){
int i=SL[0].link;
while(i){
visit(&SL[i].data);
i=SL[i].link;
}
cout<<endl;
}
};
#endif
2 测试SList类:
#include <iostream> #include<string> using namespace std; typedef string T; bool equal(string c1, string c2) { return c1==c2; } void print(T* c) { cout<<*c<<" "; } #include "SList.h" int main() { SList<T> L; T e, e0="kobe"; bool i; int j, k; T s; cout<<"请输入你心中最好的6名球星:"<<endl; for(j=1; j<=6; j++){ cin>>s; i=L.InsertElem(j, s); } cout<<endl; cout<<"你的榜单L="; L.ListPrint(print); cout<<"L是否空?"<<boolalpha<<L.ListEmpty()<<",L长="; cout<<L.ListLen()<<endl; i=L.PriorElem(e0, equal, e); if(i) cout<<"球星"<<e0<<"的前一名为"<<e<<endl; i=L.NextElem(e0, equal, e); if(i) cout<<"球星"<<e0<<"的后一名为"<<e<<endl; k=L.ListLen(); for(j=k+1; j>=k; j--) { i=L.DeleteElem(j, e); if(i) cout<<"删除第"<<j<<"个球星成功,他是"<<e<<endl; else cout<<"删除第"<<j<<"个球星失败(榜单不存在此球星),"; } cout<<"依次输出L的球星:"; L.ListPrint(print); L.ClearList(); cout<<"清空L后,L="; L.ListPrint(print); cout<<"L是否空?"<<boolalpha<<L.ListEmpty()<<",L长="; cout<<L.ListLen()<<endl; return 0; }
三 运行结果:
相关文章推荐
- 单链表的顺序实现例程[静态分配存储空间]
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- 线性表的顺序存储和链式存储的实现(C)
- 线性表的顺序存储和链式存储的实现(C)
- 线性表链式存储(单链表)及其15种操作的实现
- 线性表的链式存储(单链表)的c语言实现
- 数据结构:线性表(顺序存储)顺序表类(实现顺序表的创建,输出,插入,删除功能)
- 顺序表的添加、删除、查找功能的链式实现
- 线性表的链式存储(单链表)C语言实现
- 线性表(顺序存储)结构与功能的简易实现
- 线性表链式存储(单循环链表)及其15种操作的实现
- 栈的Java实现(顺序存储实现与链式存储实现)
- 数据结构——单向链表的顺序存储及实现
- 单链表-链式存储-Java实现
- 顺序存储链表 C语言实现
- Java单链表顺序和链式实现(数据结构五)
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
- 线性结构的顺序存储和链式存储的实现代码(一)
- 【线性表一:】两种存储结构的代码实现:顺序存储和链式存储
- 线性表 顺序存储 链式存储 ---java实现