一、顺序表与静态链表的不同
1、顺序表和静态链表的物理结构(即存储结构)是相同的,在计算机内存中以数组的形式保存的线性表,是用一组地址连续的存储单元依次存储数据元素的线性结构,但两者的数据结构(逻辑结构)是不同的。
2、顺序表:着眼于整个数组,采用动态分配的一维数组,仍然借助了指针进行数据操作,具体描述如下:
typedef struct
{
int *elem;
int length;
int listsize;
}Sqlist;
在线性表的插入和删除操作时,需要借助指针来移动元素。
3、静态表:不使用指针而使用链表结构,数组元素的一个分量用于存放数据,另一个用来作为“游标”指示下一结点在数组中的相对位置,数据的存储尽管是采用一维数组的形式存储在计算机中,但仍然是继承了链表指向不一定总是指向紧挨着其的结点,描述如下:
typedef struct
{
int data;
int cur;
}Component, StaticLinkList[MAXSIZE];
这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针(游标),故仍具有链式存储结构的主要优点。
二、静态链表的特点
便于在没有指针类型的高级程序设计语言中使用链表结构
三、代码展示
1、头文件
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
2、声明静态链表
#define maxsize 100
typedef struct Component
{
int data;
int cur; //cur指向下一个结点
}StaticLinkList[maxsize];//结构体数组
3、函数代码
//初始化
void initList(StaticLinkList space)
{
for(int i=0;i<maxsize;i++)
{
space[i].cur=-1;
}
}
//插入
void Zinsert(StaticLinkList space,int value,int pos) //value是插入的值,pos是下一个值得位置(注:从零开始)
{
//判满
int count=0;
for(int i=0;i<maxsize;i++)
{
if(space[i].cur==-1)
{
count++;
}
}
if(count==1) //不是一整个循环的前提下。如果是一个循环count=0
{
printf("已满,无法进行插入操作!");
return;
}
//插入
for(int i=0;i<maxsize;i++)
{
if(space[i].cur==-1)
{
space[i].data=value;
space[i].cur=pos;
break;
}
}
}
//值删除
void Valuedelete(StaticLinkList space,int value)
{
//获取value在结构体数组中的位置和value所指向的下一个结点位置
int pos1,pos2;//pos1为value在结构体数组中的位置,pos2为value所指向的下一个结点位置
for(int i=0;i<maxsize;i++)
{
if(space[i].data==value&&space[i].cur!=-1)
{
pos1=i;
pos2=space[i].cur;
space[i].cur=-1;
for(int j=0;j<maxsize;j++)
{
if(space[j].cur==pos1)
{
space[j].cur=pos2;
}
}
}
}
}
//打印
void myprint(StaticLinkList space,int start,int end) //start为开始的位置 ,结束时cur的值
{
//判空
int count=0;
for(int i=0;i<maxsize;i++)
{
if(space[i].cur==-1)
{
count++;
}
}
if(count==maxsize)
{
printf("空,无法进行打印操作!");
return;
}
//打印
int i=start;
while(1)
{
printf("%d",space[i].data);
i=space[i].cur;
if(space[i].cur==end)
{
printf("%d\n",space[i].data);
break;
}
}
}
4、主函数
int main()
{
StaticLinkList space;
initList(space);
//插入
Zinsert(space,1,1);
Zinsert(space,2,3);
Zinsert(space,4,4);
Zinsert(space,3,2);
Zinsert(space,5,5);
Zinsert(space,6,0);
//打印
myprint(space,0,0);
//删除值为3的结点
Valuedelete(space,3);
//打印
myprint(space,0,0);
}
5、运行结果