靜態鏈表概念及代碼

一、順序表與靜態鏈表的不同
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、運行結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章