文章目录
前言
单链表实现的一个很大的作用来源于指针,但如果没有指针之前,该如何来描述单链表呢?有人提出用数组来代替指针,来描述单链表。接下来就看看它是如何实现的?
一、静态链表的定义
用数组来存放元素的值和地址。由于数组元素的个数一旦确定就不会改变,因而称这种链表为静态链表。
数组元素由两部分组成:data和cur。数据域data,用来存放数据元素(要处理的数据);游标cur相当于单链表的next指针,存放该元素的后继在数组中的下标。
二、静态链表的插入和删除操作
要想实现元素的插入和删除首先静态链表要解决的是:如何用静态模拟动态链表结构的存储空间的分配,需要时申请,无用时释放。
在动态链表中,结点的申请和释放分别用malloc()和free()函数来实现。在静态链表中,操作的是数组,不存在动态链表的结点申请和释放问题,所以我们需要自己实现这两个函数才能做插入和删除操作。
代码如下(示例):
#include<stdio.h>
void Init(component *L)//初始化静态链表
{
unsigned short i;
for(i=0; i<MAXSIZE-1; i++)
L[i].cur=i+1;
L[MAXSIZE-1].cur=0;
}
component* Insert(component *L)//插入数据到链表
{
component *T, *temp1, *temp2;
unsigned short i;
ElemType ch;
if( i=Malloc(L) ){
T=temp1=&L;
T->cur=0;
} else
return 0;
while( (ch=getchar()) != '\n' ){
if( i=Malloc(L) ){
temp2=&L;
temp2->data=ch;
temp2->cur=0;
temp1->cur=i;
temp1=temp2;
}
else
return 0;
}
return T;
}
short Malloc(component *L)//分配空间
{
unsigned short i;
i=L[0].cur;
if(L[0].cur){
L[0].cur=L.cur;
return i;//成功返回空间位置
}
return 0;//失败返回0
}
void Free(component *L, short i) //回收空间
{
L.cur=L[0].cur;
L[0].cur=i;
}
void Disp(component *T, component *L)//显示静态链表数据
{
while(T->cur){
T=&L[T->cur];
printf("%c", T->data);
}
printf("\n");
}
void Purge(component *T, component *L) //删除重复数据
{
component *tmp, *temp;
for(T=&L[T->cur]; T->data; T=&L[T->cur])//若T->data中没数据,则退出循环
{
for(temp=T, tmp=&L[T->cur]; tmp->data;)
{//若tmp->data中没数据,则退出循环
if(T->data==tmp->data){
temp->cur=tmp->cur;
Free(L, (short)(tmp-L));//回收空间
tmp=&L[temp->cur];
}
else{
tmp=&L[tmp->cur];
temp=&L[temp->cur];
}
}
}
}
三、静态链表优缺点
优点:
在插入和删除操作时,只需要修改游标,不需要移动元素,从而改进了在顺序存储结构中插入和删除操作需要移动大量元素的缺点
缺点:
没有解决连续存储分配带来的表长难以确定的问题
失去了顺序存储结构随机存取的特性。