一、順序表與靜態鏈表的不同
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、運行結果