线性表之静态链表(简述)
2015-08-25 15:35
211 查看
静态链表
静态链表结构是为数组中每个元素附加一个链接指针。它容许我们不改变各个元素的物理位置,我们只要重新改变其逻辑顺序就可以了。由于在整个运算过程中存储空间的大小不会发生变化,所以我们称之为静态链表。
静态链表的结构的每个节点由两个数据成员组成。一个是称为data的数据域。还有用来存放链接指针的link域。它们中的所有结点形成一个结点数组。可以是带有头结点的!如图所示它为一个静态链表的结构。
具体实现请看代码:
静态链表结构是为数组中每个元素附加一个链接指针。它容许我们不改变各个元素的物理位置,我们只要重新改变其逻辑顺序就可以了。由于在整个运算过程中存储空间的大小不会发生变化,所以我们称之为静态链表。
静态链表的结构的每个节点由两个数据成员组成。一个是称为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--; } } } }
相关文章推荐
- angularJS中的ng-click和ng-change
- SVN changelist and commit
- 关于mysql has gone away的解决办法
- 分享一款强大的图片查看器插件,手机PC 通吃,功能超级齐全!
- sql基础
- 服务器
- Jmeter学习笔记(一)
- 全排列
- 设计模式: 自己手动写一个装饰者模式
- 教你做一款高口碑的产品
- cloudant,nothing found on db path
- CLRS 4.5用主方法求解递归式
- openssl生成RSA格式,并转为pkcs8格式
- deep learning:Theano安装攻略
- Spring的数据源配置
- mysql空间扩展 VS PostGIS
- Opencv用鼠标绘制线段
- Java实现数据结构中的栈
- visual studio has encountered an exception .this may be caused by an extension
- Android自定义日期滚动控件