数据结构-静态链表

/*国嵌版的静态链表*/

#ifndef _STATICLSIT_H_
#define _STATICLIST_H_

typedef void StaticList;
typedef void StaticListNode;

/*
    该方法用于创建并且返回一个空的线性表
*/
StaticList* StaticList_Create(int capacity);

/*
    该方法用于销毁一个线性表list
*/
void StaticList_Destroy(StaticList* list);

/*
    该方法用于将一个线性表list中的所有元素清空
    使得线性表回到创建时的初始状态
*/
void StaticList_Clear(StaticList* list);

/*
    该方法用于返回一个线性表list中的所有元素个数
*/
int StaticList_Length(StaticList* list);
int StaticList_Empty(StaticList* list); 
int StaticList_Capacity(StaticList* list);
/*
    该方法用于向一个线性表list的pos位置处插入新元素node
    返回值为1表示插入成功,0表示插入失败
*/
int StaticList_Insert(StaticList* list, StaticListNode* node, int pos);

/*
    该方法用于获取一个线性表list的pos位置处的元素
    返回值为pos位置处的元素,NULL表示获取失败
*/
StaticListNode* StaticList_Get(StaticList* list, int pos);

/*
    该方法用于删除一个线性表list的pos位置处的元素
    返回值为被删除的元素,NULL表示删除失败
*/
StaticListNode* StaticList_Delete(StaticList* list, int pos);

#endif
#include <stdio.h>
#include <malloc.h>
#include "StaticList.h"
#define AVAILABLE -1
typedef struct _tag_StaticListNode
{
	unsigned int data;
	int next;
} TStaticListNode;
typedef struct _tag_SaticList
{
	int capacity;
	TStaticListNode header;  /*记录表头信息*/
	TStaticListNode node[];	/*TStaticListNode node[0]也是临时记录表头信息*/
} TStaticList;

StaticList* StaticList_Create(int capacity)
{
	TStaticList* ret = NULL;
	int i = 0;
	ret = (TStaticList*)malloc(sizeof(TStaticList)+(capacity+1)*sizeof(TStaticListNode));
	if (ret != NULL)
	{
		ret->capacity = capacity;
		ret->header.data = 0;
		ret->header.next = 0;
		for(i=1;i<=capacity;i++)
		{
			ret->node[i].next = AVAILABLE;	
		}	
	}
    return ret;
}

void StaticList_Destroy(StaticList* list)
{
	free(list);
}

void StaticList_Clear(StaticList* list)
{
	TStaticList* slist = (TStaticList*)list;
	int i=0; 
	if (slist != NULL)
	{
		slist->header.data = 0;
		slist->header.next = 0;	
		for(i=1;i<=slist->capacity;i++)
		{
			slist->node[i].next = AVAILABLE;	
		}	
	}
}

int StaticList_Length(StaticList* list)
{
    TStaticList* slist = (TStaticList*)list;
    int ret = -1;
	if (slist != NULL)
	{
			ret = slist->header.data;
	}
	return ret;
}
int StaticList_Empty(StaticList* list)
{
	TStaticList* slist = (TStaticList*)list;
    int ret = 0;
	if ((slist != NULL)&&(slist->header.data == 0))
	{
			ret = 1;
	}
	return ret;
}
int StaticList_Capacity(StaticList* list)
{
    TStaticList* slist = (TStaticList*)list;
    int ret = -1;
	if (slist != NULL)
	{
			ret = slist->capacity;
	}
	return ret;
}

int StaticList_Insert(StaticList* list, StaticListNode* node, int pos)
{
	TStaticList* slist = (TStaticList*)list;
	int ret = 0;
	int index = 0;
	int current = 0;
	int i = 0;
	if((slist != NULL)&&(node != NULL)&&(0 <=pos)&&(slist->header.data + 1 <slist->capacity))  /*合法性检测*/
	{
		ret = 1;	
	}
	if(ret)
	{
		for(i=1;i<=slist->capacity;i++)
		{
			if(slist->node[i].next == AVAILABLE)                /*找到可用的空间,返回index*/
			{
				index = i;
				break;	
			}
		}
		slist->node[0] = slist->header;
		slist->node[index].data = (unsigned int)node;	
		for(i=0;(i<pos) && (slist->node[current].next != 0);i++)               /*current记录插入位置的前面的那个位置*/
		{                             
			current = slist->node[current].next;	
		}                                                             
		slist->node[index].next = slist->node[current].next;
		slist->node[current].next = index;
		slist->node[0].data++;
		slist->header = slist->node[0];	
	}
	
    return ret;
}

StaticListNode* StaticList_Get(StaticList* list, int pos)
{
	TStaticList* slist = (TStaticList*)list;
	StaticListNode* ret = NULL;
	int i = 0;
	int current = 0; 
	int object = 0;
	if((slist != NULL) && (0 <= pos) && (pos < slist->header.data))
	{
		slist->node[0]  = slist->header;
		for(i=0;i<pos;i++)
		{
				current = slist->node[current].next;
		}
		object = slist->node[current].next;
		ret = (StaticListNode*)(slist->node[object].data);	
	}
    return ret;
}

StaticListNode* StaticList_Delete(StaticList* list, int pos)
{
    TStaticList* slist = (TStaticList*)list;
	StaticListNode* ret = NULL;
	int current = 0;
	int i = 0;
	int object = 0;
	if((slist != NULL)&&(0 <=pos))
	{
		slist->node[0] = slist->header;
		for(i=0;(i<pos) && (slist->node[current].next != 0);i++)
		{
			current = slist->node[current].next;	
		}	
		object = slist->node[current].next; 
		ret = (StaticListNode*)(slist->node[object].data);
		slist->node[current].next = slist->node[object].next;
 		slist->node[0].data--;
		slist->header = slist->node[0];	
		slist->node[object].next = AVAILABLE;
	}	
    return ret;
}


#include <stdio.h>
#include <stdlib.h>
#include "StaticList.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) 
{
	StaticList* list = StaticList_Create(10);
	printf("the StaticList capacity is %d\n",StaticList_Capacity(list));
	char v1 = 'a';
	char v2 = 'b';
	char v3 = 'c';
	char v4 = 'd';
	char v5 = 'e';
	char v6 = 'f';
	char v7 = 'g';
	int i = 0;
	StaticList_Insert(list,(StaticListNode*)&v1,0);
	StaticList_Insert(list,(StaticListNode*)&v2,0);
	StaticList_Insert(list,(StaticListNode*)&v3,0);
	StaticList_Insert(list,(StaticListNode*)&v4,0);
	StaticList_Insert(list,(StaticListNode*)&v5,0);
	StaticList_Insert(list,(StaticListNode*)&v6,0);
	StaticList_Insert(list,(StaticListNode*)&v7,0);
	
	for(i=0;i<StaticList_Length(list);i++)
	{
		char* p	= (char *)StaticList_Get(list,i);
		printf("the %d elem is %c\n",i,*p);	
	}
	printf("the StaticList length is %d\n",StaticList_Length(list));
	printf("delete \n");
	while(StaticList_Length(list)>0)
	{
		char* p	= (char *)StaticList_Delete(list,StaticList_Length(list)-1);
		printf("the StaticList length is %d\n",StaticList_Length(list));
		printf("the %d elem is %c\n",6-StaticList_Length(list),*p);	
	}
	printf("\n");
	StaticList_Clear(list);
	printf("the StaticList is Empty(%d)\n",StaticList_Empty(list));
	StaticList_Destroy(list); 
	return 0;
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值