【数据结构】静态链表

本文介绍了一种使用下标而非指针来实现链表的方法——静态链表。通过这种方式,可以在保持链表插入和删除操作优势的同时,降低实现的复杂度。文章提供了C语言的示例代码,展示了如何创建、插入、删除元素以及管理备用链表空间。
摘要由CSDN通过智能技术生成


数据结构静态链表实现


前言

静态链表,是一种巧妙的数据结构实现方式。

静态链表:

        每个节点有一个数据域(data),用来存放有用的数据信息;

        还有一个下标域(cur),用来指示下一个元素的下标位置。


我们都知道链式线性表的优势在于插入和删除元素,时间复杂度都是O(1),因为不需要像顺序存储结构的线性表那样在插入和删除时需要移动大量的元素。

而静态链表的实现就弥补了这样的不足,我们以下标的方式来代替链式结构中使用的的指针,从而达到减少时间复杂度的功能。


分析



实现静态链表

下面是代码,实现了最基本的几个函数,包括插入元素删除元素获取和释放备用链表空间。

读者可以自行添加其他的操作函数。

//======================================================================    
//    
//        Copyright (C) 2014-2015 SCOTT        
//        All rights reserved    
//    
//        filename: StaticList.c  
//        description: a demo to display StaticList
//    
//        created by SCOTT at  02/10/2015
//        http://blog.csdn.net/scottly1  
//    
//======================================================================    

#include <stdio.h>
#include <stdlib.h>

#define TRUE		1
#define FALSE		0
#define MAX_LEN		100

typedef  int  Status;
typedef  int  ElemType;

typedef struct _tag_staticlist
{
	ElemType data;
	int cur;
}StaticList, List[MAX_LEN];


/* Init StaticList */
Status InitList(StaticList * list)
{
	int i = 0;

	for(i=0; i<MAX_LEN - 1; i++)
	{
		list[i].cur = i + 1;
		list[i].data = 0;    //此处初始化为0 是为了方便观看 实际中ElemType不一定是int型
	}

	list[MAX_LEN-1].cur = 0;
	list[MAX_LEN-1].data = 0;

	return TRUE;
}

/* Display StaticList */
void DisplayList(StaticList * list)
{
	int i = 0;

	for(i=0; i<MAX_LEN; i++)
	{
		printf("%d.cur = %d, %d.data = %d\n", i, list[i].cur, i, list[i].data);
	}

	return ;
}

/* Malloc StaticList, Get Free Space */
int Malloc_SL(StaticList * list)
{
	int ret = 0;

	ret = list[0].cur;

	list[0].cur = list[ret].cur;  // 指向下一个节点的cur

	return ret;
}

/* Free StaticList, Free Space */
Status Free_SL(StaticList * list, int j)
{
	list[j].cur = list[0].cur;   // 保存备用链表第一个节点下一个节点cur

	list[0].cur = j;             // j成为备用链表的首节点下标

	return TRUE;
}

/* Insert StaticList */
Status InsertList(StaticList * list, int pos, ElemType data)
{
	int i = 0;
	int j = 0;
	int k = MAX_LEN - 1;

	if(pos < 1 || NULL == list || pos >= MAX_LEN - 1)
		return FALSE;
		
	j = Malloc_SL(list);                    // Malloc cur
	list[j].data = data;			// Insert data
	for(i=1; i<pos; i++)
	{
		k = list[k].cur;
	}
		
	list[j].cur = list[k].cur;
	list[k].cur = j;

	return TRUE;
}


Status InsertList(StaticList * list, int pos, ElemType *ret)
{
	int i = 0;
	int j = 0;
	int k = MAX_LEN - 1;

	if(pos < 1 || NULL == list || pos >= MAX_LEN - 1)
		return FALSE;

	for(i=1; i<pos; i++)
	{
		k = list[k].cur;
	}

	j = list[k].cur;

	*ret = list[j].data;	

	Free_SL(list, j);

	return TRUE;
}


int main()
{
	List  L ;
	InitList(L);
	DisplayList(L);
	ElemType ret;

	printf("=============\n");
	InsertList(L, 1, 11);
	InsertList(L, 2, 22);
	InsertList(L, 3, 33);
	InsertList(L, 4, 44);
	InsertList(L, 5, 55);

	InsertList(L, 3, 66);
	DisplayList(L);

	printf("=============\n");
	InsertList(L, 1, &ret);
	DisplayList(L);
	printf("%d has been removed!\n", ret);

	return 0;
}

运行结果:


原创文章,转载请著名出处:http://blog.csdn.net/scottly1/article/details/43669933


静态链表是一种使用数组实现的链表结构。它通过数组中的元素自身的指针来实现链表的连接关系。以下是静态链表的基本操作: 1. 初始化:创建一个包含足够多元素的数组,每个元素包含两个字段,一个用于存储数据,另一个用于存储指向下一个元素的索引。初始化时,设置数组中所有元素的指针字段为-1,表示链表为空。 2. 插入:插入操作将新元素插入到静态链表中的指定位置。首先找到一个空闲位置并将新元素插入其中,然后将前一个元素的指针字段指向新元素,在将新元素的指针字段指向原来位置的后继元素。 3. 删除:删除操作将静态链表中指定位置的元素移除。首先将要删除的元素的前一个元素的指针字段指向要删除元素的后继元素,然后将要删除元素所在位置设置为空闲。 4. 查找查找操作可以根据给定的关键字或索引在静态链表中找到对应的元素。可以通过遍历整个链表,逐个比较每个节点中存储的值与给定关键字或索引进行匹配。 5. 更新:更新操作用于修改静态链表中指定位置元素的值。首先找到要更新的元素位置,然后将其值进行修改。 需要注意的是,静态链表的插入和删除操作可能需要额外的空间来存储空闲位置的索引信息,以便快速找到可用位置。另外,由于静态链表使用数组实现,插入和删除操作可能会涉及元素的移动,因此效率较低,适用于对数据的频繁查找而不是插入和删除的场景。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值