写在前面的一些话:这只是个人学习王道数据结构的代码笔记,仅供参考,如果有错误请友好的指出,谢谢!!!
一、静态链表
1、定义一个静态链表
借助数组实现链式存储结构,和链表中指针不同的是,静态链表的指针是用游标代替的,存放的是下一个结点在数组中的相对位置
定义一个静态链表的代码如下:
#define MaxSize 10 //静态链表的最大长度
typedef struct { //静态链表结构类型的定义
int data; //存储数据元素
int next; //下一个数据元素的数组下表(游标)
}SLinkList[MaxSize];
以上代码等同于如下
#define MaxSize 10
struct Node{
int data;
int next;
};
typedef struct Node SLinkList[MaxSize];
2、初始化一个静态链表
初始化一个静态链表:
把a[0]的next设成-1,用-1来标识最后一个结点,a[0]也是头结点,不存放数据
把其他结点的next设置成一个特殊的值来表示结点空闲,这里我设置成-2
代码如下:
#include <iostream>
using namespace std;
#define MaxSize 10//静态链表的最大长度
typedef struct {//静态链表结构类型的定义
int data;//存储数据元素
int next;//下一个数据元素的数组下表(游标)
}SLinkList[MaxSize];
bool InitSLinkList(SLinkList &L){
//初始化一个静态链表
L[0].next=-1;//用-1来标识最后一个结点
for(int i=1;i<10;i++){
L[i].next=-2;//用-2表示该结点空闲
}
return true;
}
bool SLinklistInsert(SLinkList &L,int i,int e){
//在数组第i个位置插入元素e
if(i<0 || i>9)
return false;//i值不合法
if(L[i].next!=-2)
return false;//i不是空闲结点
int j=0;
while(L[j].next!=-1)//循环找到最后一个结点
j=L[j].next;
L[j].next=i;//修改原来最后一个结点的游标为i
L[i].data=e;
L[i].next=-1;//把新结点设成最后一个结点
return true;
}
void PrintSLinkList(SLinkList L){
//打印静态链表的数据
cout<<"静态链表的数据元素是:"<<endl;
int i=0;
while(L[i].next!=-1){
i=L[i].next;
cout<<L[i].data<<" ";
}
cout<<endl;
cout<<"数组中的存储数据是:"<<endl;
for(i=0;i<10;i++){
if(L[i].next==-2||i==0)
continue;
cout<<"L["<<i<<"]="<<L[i].data<<" ";
}
cout<<endl;
}
int main(){
SLinkList L;
InitSLinkList(L);//初始化一个静态链表
SLinklistInsert(L,3,1);//在数组的第三个位置插入数据元素1
SLinklistInsert(L,1,2);//在数组的第一个位置插入数据元素2
SLinklistInsert(L,4,3);//在数组的第一个位置插入数据元素3
PrintSLinkList(L);//打印静态链表
return 0;
}
代码运行结果:
总结
静态链表和链表一样,逻辑上相邻的元素物理位置上不一定相邻,不同的是,前者使用游标来表示下一个元素的位置,后者使用指针指向下一个元素的地址。