静态链表的实现与操作(C语言实现)

我们知道要实现单链表,必须要有指针,那么像Java这样没有指针的的语言就略显蛋疼了。

没关系,我们有静态链表,其本质就是用采用数组的方式实现单链表的功能。

头文件:

#ifndef _StaticLinkList_H_
#define _StaticLinkList_H_

typedef void StaticLinkList;
typedef void StaticLinkListNode;   

StaticLinkList * StaticLinkList_Create(int capacity);

void StaticLinkList_DesTroy(StaticLinkList * list);

void StaticLinkList_Clear(StaticLinkList* list);

int StaticLinkList_Length(StaticLinkList* list);

int StaticLinkList_Capacity(StaticLinkList* list);

int StaticLinkList_Insert(StaticLinkList* list, StaticLinkListNode* node, int pos);

StaticLinkListNode* StaticLinkList_Get(StaticLinkList* list, int pos);

StaticLinkListNode* StaticLinkList_Delete(StaticLinkList* list, int pos);

#endif 

源文件:

// 静态链表.cpp : 定义控制台应用程序的入口点。
//
//静态链表的出现主要是为了弥补有些编程语言没有指针而不能创建单链表的缺憾

#include "stdafx.h"
#include <stdlib.h>
#include <malloc.h>
#include "StaticLinkList.h"
const int AVAILABLE = -1;

typedef struct    //header.data  用作存放数组的长度
{
	int data;   //数据域
	int next;   //下一个元素的下标
}TStaticLinkListNode;

typedef struct
{
	int capacity;   //链表的总长度
	TStaticLinkListNode header;  //头结点,data为数组的长度,next为第一个元素的下标
	TStaticLinkListNode node[];  //数组,存放数据
}TStaticLinkList;

int _tmain(int argc, _TCHAR* argv[])
{
	StaticLinkList* list = StaticLinkList_Create(10);   //创建一个总长度为10的静态链表

    int index = 0;
    int i = 0;
    int j = 1;
    int k = 2;
    int x = 3;
    int y = 4;
    int z = 5;

    StaticLinkList_Insert(list, (StaticLinkListNode*)&i, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&j, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&k, 0);

	for(index=0; index<StaticLinkList_Length(list); index++)
    {
		int* p = (int*)StaticLinkList_Get(list, index);

        printf("插入了: %d\n", *p);
    }

    printf("\n");

    while( StaticLinkList_Length(list) > 0 )
    {
		int* p = (int*)StaticLinkList_Delete(list, 0);

        printf("删除了: %d\n", *p);
    }

    printf("\n");
    printf("重新插入: \n\n");
	StaticLinkList_Insert(list, (StaticLinkListNode*)&x, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&y, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&z, 0);

	//打印总长度和长度
	printf("Capacity: %d Length: %d\n", StaticLinkList_Capacity(list), StaticLinkList_Length(list));

    for(index=0; index<StaticLinkList_Length(list); index++)
    {
        int* p = (int*)StaticLinkList_Get(list, index);

        printf("插入了: %d\n", *p);
    }

	StaticLinkList_DesTroy(list);//销毁

	system("pause");
	return 0;
}

//创建
StaticLinkList * StaticLinkList_Create(int capacity)
{
	TStaticLinkList * list = NULL;
	if(capacity > 0)
	{
		list = (TStaticLinkList*)malloc(sizeof(TStaticLinkList) + sizeof(TStaticLinkListNode)*(capacity + 1));
	}
	if(NULL != list)
	{
		list->header.data = 0;
		list->header.next = 0;
		list->capacity = capacity;
	}

	for (int i = 1; i<=list->capacity; i++)
	{
		list->node[i].next = AVAILABLE;
	}

	return list;
}
//销毁
void StaticLinkList_DesTroy(StaticLinkList * list)
{
	free(list);
}

//清空
void StaticLinkList_Clear(StaticLinkList* list)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	if(sList != NULL)
	{
		sList->capacity = 0;
		sList->header.data = 0;
		sList->header.next = 0;
	}
}

//获得长度
int StaticLinkList_Length(StaticLinkList* list)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int len = -1;
	if(NULL != sList)
	{
		len = sList->header.data;
	}
	return len;
}

//获得总长度
int StaticLinkList_Capacity(StaticLinkList* list)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int capacity = -1;
	if(NULL != sList)
	{
		capacity = sList->capacity;
	}
	return capacity;
}

//插入
int StaticLinkList_Insert(StaticLinkList* list, StaticLinkListNode* node, int pos)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	TStaticLinkListNode* sNode = (TStaticLinkListNode*)node;
	int current = 0;
	int index = 0;
	int i = 0;
	int bol = 0;
	for( i=1; i<=sList->capacity; i++)
	{
		if(sList->node[i].next == AVAILABLE)
		{
			index = i;
			break;
		}
	}
	if((NULL != sList) && (NULL != sNode) && (pos >= 0) && (sList->header.data+1 <= sList->capacity))
	{
		sList->node[index].data = (unsigned int)node;
		sList->node[0] = sList->header;

		for( i=0; i<pos && sList->node[i].next != 0; i++)
		{
			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];
		 bol = 1;
	}
	return bol;
}

//获取结点
StaticLinkListNode* StaticLinkList_Get(StaticLinkList* list, int pos)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int i = 0;
	int obj = 0;
	int current = 0;
	if((NULL != sList) && (pos>=0) && (pos < sList->header.data))
	{
		sList->node[0] = sList->header;
		for( i=0; i<pos; i++)
		{
			current = sList->node[current].next;
		}
		obj = sList->node[current].next;
	}
	return (StaticLinkListNode*)sList->node[obj].data;
}

//删除
StaticLinkListNode* StaticLinkList_Delete(StaticLinkList* list, int pos)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int  i = 0;
	int current = 0;
	int obj = 0;
	if((NULL != sList) && (pos >= 0) && (pos < sList->header.data))
	{
		sList->node[0] = sList->header;
		for( i=0; i<pos; i++)
		{
			current = sList->node[current].next;
		}
		obj =  sList->node[current].next;
		sList->node[current].next = sList->node[obj].next;
		--(sList->node[0].data);
		sList->header = sList->node[0];
		sList->node[obj].next = AVAILABLE;

	}
	return (StaticLinkListNode*)sList->node[obj].data;
}

运行结果:

插入了: 2
插入了: 1
插入了: 0

删除了: 2
删除了: 1
删除了: 0

重新插入:

Capacity: 10 Length: 3
插入了: 5
插入了: 4
插入了: 3
请按任意键继续. . .

小结:

1,静态链表其实是单链表的另一种实现方式

2,静态链表的实现“媒介”不是指针而是数组

3,静态链表主要用于不支持指针的程序设计语言中

4,静态链表的实现是一种内存管理的简易方法

如果错误,望不吝指出。

静态链表的实现与操作(C语言实现)

时间: 2024-10-20 09:57:57

静态链表的实现与操作(C语言实现)的相关文章

【c++版数据结构】之用c语言实现静态链表

静态链表要解决的问题是:如何静态模拟动态链表关于存储空间申请和释放,动态链表可以借助malloc和free两个函数实现.在静态链表中,由于操作的是数组,不存在像动态链表的节点申请和释放问题,因此我们得自己完成两个函数来模拟这两个动作. 解决办法: 将静态链表划分为"有效链表,备用链表",通过两者模拟节点的申请和释放 静态链表: 1)有效链表(已经使用的数组元素按游标cur链接而成) 2)备用链表(未使用的数组元素按游标cur链接而成) Malloc_SL(申请节点):从备用链表中取得一

用数组代替指针实现静态链表

在没有C语言之前还没有指针这个概念,但是那个时候就已经有和现在静态链表操作形式类似数据存储类型.静态链表的优势就在于,在对其中存储的信息进行插入删除操作的时候它的时间复杂度是 O(1) ,那么在没有指针的时候是使用什么来实现这种存储操作的那? 那就是用数组来代替指针,静态链表在进行数据遍历的时候是依靠前一个结点存储的下一个结点的地址来进行遍历.并且可以将所有零散的空间利用起来,这样就更加的节省资源的(数组版本的静态链表在这一点上就做的不好,因为数组需要提前设置好它的大小,所以为了防止存储的数据超

05.线性表(四)链式存储结构.静态链表

链式存储结构.静态链表   一.静态链表 1.静态链表存储结构 单链表是通过指针实现的,但是我们也可以通过数组来代替指针描述单链表,即静态链表.如何实现静态链表?构造数组的元素由两个数据域组成:data和cur,即数组的每个下标都对应一个data和一个cur. 数据域data:用来存放数据元素,即要处理的数据: 游标cur:存放该元素的后继在数组中的下标,相当于单链表中的next指针: 为了方便插入数据,我们通常会把数组建立得大一些,以便有一些空闲空间而不致于出现溢出情况. 线性表的静态链表存储

树的实现与操作(C语言实现)

首先来简单说下一些关于的基本概念. 树是一种非线性的数据结构 1,树是由 n(n>=0)个结点组成的有限集合 如果n = 0 ,称为空树 如果n > 0,则: 有一个特定的称之为根(root)的结点,它只有直接后继,但没有直接前驱 除了根以外的其他结点划分为:m(m>=0)个互不相交的有限集合,T0,T1,T2-Tn-1,每个集合又是一棵树,并且称之为根的子树 2,树中的概念: 树的结点包括一个数据及若干指向子树的分支 结点拥有的子树树称为结点的度 度为0的结点称为叶结点 度不为0的结点

栈的实现与操作(C语言实现)

栈的定义  1, 栈是一种特殊的线性表  2,栈仅能在线性表的一端进行操作  3,栈顶(Top): 同意操作的一端 同意操作的一端  4,栈底(Bottom): ,不同意操作的一端 不同意操作的一端 这里我做出了 栈的顺序实现 和 链式实现.分别例如以下: =========================================华丽丽的切割线========================================================== 栈的顺序实现: 首先

使用C语言描述静态链表和动态链表

静态链表和动态链表是线性表链式存储结构的两种不同的表示方式. 静态链表的初始长度一般是固定的,在做插入和删除操作时不需要移动元素,仅需修改指针,故仍具有链式存储结构的主要优点. 动态链表是相对于静态链表而言的,一般地,在描述线性表的链式存储结构时如果没有特别说明即默认描述的是动态链表. 下面给出它们的简单实现,关于线性表更为详尽的C语言的实现,可以参考 http://www.cnblogs.com/choon/p/3876606.html 静态链表 #define _CRT_SECURE_NO_

静态链表----数据结构(C语言版) 算法2.17 心得

今天学习了数据结构中的静态链表,刚开始有些语句不能理解,研究了大半天终于想通了.记录于此留待以后查看,同时,对于同样对静态链表有些许不理解的人一点启发.文章中难免有理解上的问题,请指正.下面进入正文. 一.静态链表结构 静态链表可以在不设"指针"类型的高级程序设计语言中使用链表结构.静态链表如下所示:   首先,了解一下静态链表.静态链表中跟单链表类似,包含有很多结点,第i个结点中有包括数据space[i].data,和游标cur,游标space[i].cur的值为下一个结点的数组下标

动态单链表的传统存储方式和10种常见操作-C语言实现

顺序线性表的优点:方便存取(随机的),特点是物理位置和逻辑为主都是连续的(相邻).但是也有不足,比如:前面的插入和删除算法,需要移动大量元素,浪费时间,那么链式线性表 (简称链表) 就能解决这个问题. 一般链表的存储方法 一组物理位置任意的存储单元来存放线性表的数据元素,当然物理位置可以连续,也可以不连续,或者离散的分配到内存中的任意位置上都是可以的.故链表的逻辑顺序和物理顺序不一定一样. 因为,链表的逻辑关系和物理关系没有必然联系,那么表示数据元素之间的逻辑映象就要使用指针,每一个存储数据元素

静态链表 C语言描述

静态链表1.下标为0的游标存放最后存放数据节点的游标,即是第一个没有存放元素(备用链表)的下标2.最后一个的节点存放第一个由数值得下标3.第一个和最后一个都不存放数据 即是备用链表的第一个的下标 4.最后一个存储数据的节点的游标为0 静态链表主要是根据游标来遍历,以前没有指针用的思想 假如我要删除一个元素 图不多描述,自己画画就明白,然后代码部分.都有注释, 1 #include <stdio.h> 2 #define ElemType int 3 #define Status int 4 #