静态链表

来源:互联网 发布:恋恋有词软件 编辑:程序博客网 时间:2024/06/06 01:03

对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。

这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针

故仍具有链式存储结构的主要优点。

静态链表为存储器基址寻址,相比较与动态链表通过指进行针存储器间接寻址速度稍快,少访问一次存储器;

http://www.cnblogs.com/walfud/articles/2111624.html )

但静态链表容量固定,容易造成浪费或空间不够。

//staticList.hconst int maxSize = 100;template<class T>struct SLinkNode{T data;int link;};//静态链表实际上用两个逻辑上的链表实现//第一个链表表示装入数据的链表,从物理地址0开始,到elem[i].link = -1;结束;//第二个链表表示剩余链表节点,从物理地址avail开始,到物理地址maxSize-1 即 elem[ i ].link = -1结束template<class T> class StaticList{public:StaticList();int length();int search( T x );int locate( int i);bool apend( T x);bool insert(int i , T x);bool remove( int i );bool isEmpty();T getSIndex ( int i);private:SLinkNode <T> elem[ maxSize ];//当前可分配空间首地址int avil;};template< class T>StaticList<T>::StaticList(){//链表空间初始化(链表1)elem[0].link = -1;avil = 1;//从1 开始建立带表头节点的空链表 (链表2)for( int i = 1; i< maxSize -1 ;i++)elem[i].link = i+1;elem[maxSize -1 ].link= -1;};template<class T>int StaticList<T>::length(){int len = 0;int next = 0;while( elem[next].link != -1 ){next = elem[next].link;len++;}return len;};template<class T>int StaticList<T>::search(T x){int loc = 0;for ( ; elem[loc].data == x; loc = elem[loc].link) ;return loc;};//查找第i 个节点的位置,-1表示失败template<class T>int StaticList<T>::locate(int i){int dat = 0;int next = 0;int cnt = 0;if( StaticList<T>::length() < i )return -1;while( cnt != i ){cnt++;next = elem[next].link;}return next;};template<class T>bool StaticList<T>::apend(T x){int len = length();int tail = locate( len);//链入新节点if( avil == -1)return false;int p = avil;avil = elem[p].link;elem[p].link = -1;elem[p].data = x;elem[tail].link = p;};template<class T>bool StaticList<T>::isEmpty(){if ( avil == -1 ){return true;}return false;};//插入到第i个节点后template<class T>bool StaticList<T>::insert(int i ,T x){if( i > length() || avil == -1)return false;int p = locate(i);int q = avil;avil = elem[q].link;elem[q].data = x;//链入elem[q].link = elem[p].link;elem[p].link = q;return true;};template<class T>bool StaticList<T>::remove(int i){if( i > length() )return false;int len = length();int p = locate(len);elem[p].link = avil;avil = p;p = locate(len-1);elem[p].link = -1;return true;};template<class T>T StaticList<T>::getSIndex(int i ){if( i <= length() ){int k = locate(i);return elem[k].data;}elsereturn -1;};

//main#include <iostream>#include "staticList.h"using namespace std;int main(){StaticList<int> slist;slist.apend(5);slist.apend(6);slist.insert(2,4);slist.insert(2,2);slist.insert(2,1);for( int i = 1; i <= slist.length();i++){cout<<slist.getSIndex(i);}return 0;}


0 0
原创粉丝点击