您的位置:首页 > 其它

线性表之静态链表(简述)

2015-08-25 15:35 211 查看
静态链表

静态链表结构是为数组中每个元素附加一个链接指针。它容许我们不改变各个元素的物理位置,我们只要重新改变其逻辑顺序就可以了。由于在整个运算过程中存储空间的大小不会发生变化,所以我们称之为静态链表。

静态链表的结构的每个节点由两个数据成员组成。一个是称为data的数据域。还有用来存放链接指针的link域。它们中的所有结点形成一个结点数组。可以是带有头结点的!如图所示它为一个静态链表的结构。



具体实现请看代码:

#ifndef STITCLT_H
#define STITCLT_H
#include<iostream>
using namespace std;
#define maxsize 100
template<typename T> struct slinknode{
T data;
int link;
};
template<typename T>class  slist{
slinknode<T> elem[maxsize];
int avil;
public:
void Initlist();
int Length();
int Search(T x);
int Locate(int i);
bool Append(T x);
bool Insert(int i,T x);
bool Remove(int i);
bool Isempty();
void output(int type);
};
template<typename T> void slist::Initlist()
{
elem[0].link=-1;
avil=1;
for(int i=1;i<maxsize-1;i++)
{
elem[i].link=i+1;
}
elem[maxsize-1].link=-1;
};
template<typename T> int slist::Length()
{
int p=elem[0].link;
int i=0;
while(p!=-1)
{
p=elem[p].link;
i++;
}
return i;
};
template<typename T> bool slist::Isempty(){
if(elem[0].link==-1)
{
return true;
}
else return false;
};
template<typename T> int slist::Search(T x)
{
int p=elem[0].link;
while(p!=-1)
{
if(elem[p].data==x)  break;
else p=elem[p].link;
}
return p;
};
template<typename T> int slist<T>::Locate(int i)
{
if(i<0)  return -1;
if(i==0)  return 0;
int j=1;int p=elem[0].link;
while(p!=-1&&j<i)
{
p=elem[p].link;
j++;
}
return p;
};
template<typename T> bool slist<T>::Append(T x)
{
if(avil==-1)
{
return false;
}
int q=abil;
avil=elem[avil].link;
elem[q].data=x;elem[q].link=-1;
int p=0;
while(elem[p].link!=-1)
{
p=elem[p].link;
}
elem[p].link=q;
return true;
};
template<typename T> bool slist<T>::Insert(int i,T x)
{
int p=Locate(i);
if(p==-1)  return false;
int q=avil;
avil=elem[avil].link;
elem[q].data=x;elem[q].link=elem[p].link;
elem[p].link=q;
return true;
};
template<typename T> bool slist::Remove(int i){
int p=Locate(i-1);
if(p==-1) return false;
int q=elem[p].link;
elem[p].link=elem[q].link;
elem[q].link=avil;
avil=q;
return true;
};
template<typename T> void slist<T>::output(int type)
{
if(type==0)
{
int p=elem[0].link;
while(p!=-1)
{
cout<<p<<" "<<elem[p].data<<endl;
p=elem[p].link;
}
}
else
{
int a=avil;
for(int i=1,len=Length();len>0;i++)
{
if(i==a)
{
cout<<i<<" "<<elem[i].link<<endl;
a=elem[a].link;
}
else{
cout<<i<<" "<<elem[i].data<<endl;
len--;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: