静态链表概念及代码

一、顺序表与静态链表的不同
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、运行结果
在这里插入图片描述

发布了13 篇原创文章 · 获赞 3 · 访问量 626

猜你喜欢

转载自blog.csdn.net/weixin_43873172/article/details/104127331