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

静态链表要解决的问题是:如何静态模拟动态链表关于存储空间申请和释放,动态链表可以借助malloc和free两个函数实现。在静态链表中,由于操作的是数组,不存在像动态链表的节点申请和释放问题,因此我们得自己完成两个函数来模拟这两个动作。

解决办法:

将静态链表划分为“有效链表,备用链表”,通过两者模拟节点的申请和释放

静态链表:

1)有效链表(已经使用的数组元素按游标cur链接而成)

2)备用链表(未使用的数组元素按游标cur链接而成)

Malloc_SL(申请节点):从备用链表中取得一个节点

Free_SL   (释放节点)  :将释放的节点连接到备用链表中

所实现的静态链表的结构如下图所示:

具体实现参考如下代码:

StaticList.h

//静态链表
//数组第一个元素和最后一个元素特殊化处理
//1:s[0].cur存放备用链表的第一个节点的下标(备用链表的头结点),非0表示存在备用链表,为0表示不存在备用链表
//2:s[MAXSIZE-1].cur存放第一个有数值的节点的下标(相当于头结点)非0表示存在有效链表,为0表示不存在有效链表

#include<iostream>
#include<cstdlib>
#include<cassert>
using namespace std;

typedef enum{FALSE,TRUE}Status;
typedef int ElemType;
#define MAXSIZE 10

typedef struct StaticNode
{
	ElemType data;
	int cur;
}StaticNode;
typedef StaticNode StaticList[MAXSIZE];

void Init_SL(StaticList &SL)
{
	for (int i = 0; i < MAXSIZE - 1; ++i)
	{
		SL[i].cur = i + 1;
	}
	SL[MAXSIZE - 1].cur = 0;//开始静态链表为空,没有有效节点,所以有效链表的头结点的指向为NULL(0)
}
//开辟成功:返回开辟节点的下标
//开辟失败:返回0
int Malloc_SL(StaticList &SL)
{
	int i = SL[0].cur;
	if (i != 0)//存在备用链表
	{
		SL[0].cur = SL[i].cur;//备用链表用了一个节点,把它的下一个节点用来备用
	}
	return i;
}
//将释放的节点,头插到备用链表中
void Free_SL(StaticList &SL,int k)
{
	SL[k].cur = SL[0].cur;
	SL[0].cur = k;
}

void Show_SL(StaticList SL)
{
	int i = SL[MAXSIZE - 1].cur;//找到第一个有效节点的下标
	while (i != 0)
	{
		cout << SL[i].data << "-->";
		i = SL[i].cur;
	}
	cout <<"Nul."<< endl;
}
Status Push_Back(StaticList &SL, ElemType x)
{
	int i = Malloc_SL(SL);
	if (i == 0)
	{
		cout << "静态链表已满"<<x<<"无法尾插" << endl;
		return FALSE;
	}
	SL[i].data = x;
	SL[i].cur = 0;

	int j = SL[MAXSIZE - 1].cur;//寻找最后一个节点(最后一个节点的cur为0),进行尾插
	while (SL[j].cur != 0)
	{
		j = SL[j].cur;
	}
	SL[j].cur = i;
	return TRUE;
}
Status Push_Front(StaticList &SL, ElemType x)
{
	int i = Malloc_SL(SL);
	if (i == 0)
	{
		cout << "静态链表已满" << x << "无法头插" << endl;
		return FALSE;
	}
	SL[i].data = x;
	SL[i].cur = SL[MAXSIZE - 1].cur;
	SL[MAXSIZE - 1].cur = i;
	return TRUE;
}
Status Pop_Front(StaticList &SL)
{
	if (SL[MAXSIZE - 1].cur == 0)
	{
		cout << "静态链表已空,无法头删" << endl;
		return FALSE;
	}
	int i = SL[MAXSIZE - 1].cur;
	SL[MAXSIZE - 1].cur = SL[i].cur;
	Free_SL(SL, i);
	//SL[MAXSIZE - 1].cur = SL[i].cur;//从有效节点中删除
	//SL[i].cur = SL[0].cur;//将删除的节点头插入到备用链表中
	//SL[0].cur = i;
	return TRUE;
}
Status Pop_Back(StaticList &SL)
{
	if (SL[MAXSIZE - 1].cur == 0)
	{
		cout << "静态链表已空,无法头删" << endl;
		return FALSE;
	}
	int i = MAXSIZE - 1;
	while (SL[SL[i].cur].cur != 0)//寻找最后一个节点的前驱
	{
		i = SL[i].cur;
	}
	int tmp = SL[i].cur;//有效链表的最后一个节点的坐标(先保存下来)
	SL[i].cur = 0;//在有效链表中删除尾节点
	Free_SL(SL,tmp);
	//SL[tmp].cur = SL[0].cur;
	//SL[0].cur = tmp;
	return TRUE;
}

main.cpp

#include"StaticList.h"
int main()
{
	StaticList SL;
	Init_SL(SL);
	for (int i = 0; i < 5; ++i)
	{
		//Push_Back(SL, i);
		Push_Front(SL, i);
	}
	Show_SL(SL);
	for (int i = 0; i < 5; ++i)
	{
		//Pop_Front(SL);
		Pop_Back(SL);
		Show_SL(SL);
	}

	system("pause");
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 07:02:58

【c++版数据结构】之用c语言实现静态链表的相关文章

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

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

看数据结构写代码(5)静态链表

静态链表用于 不能使用 指针的 编程语言中. 下面奉上代码: // StaticLinkList.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> //静态链表的 实现 typedef int Element; #define INIT_SIZE 10 //为了测试,故意将值设置的很小 enum E_STATE { E_STATE_ERROR = 0, E_STATE_OK = 1, }; str

数据结构 静态链表

数据结构 严蔚敏版本 P31 的静态链表 用一位数组来实现链表 通过数组来实现链表的时候,需要自己定义Malloc和Free函数: 静态链表的结构 1 #define MAXSIZE 10 2 typedef struct { 3 int val; 4 int cur; 5 }SLinkList[MAXSIZE]; 对一个链表进行一下的初始化 1 void InitSpace_SL(SLinkList &space){ 2 for(int i=0; i<MAXSIZE-1; ++i) spa

数据结构与问题求解-Java语言描述(第三版)

数据结构对程序的重要性不言而喻,用java语言来实现常见的一些数据结构,以及在相应数据结构上的操作对学习java的同学来说是必须掌握的. 本系列博文参考<数据结构与问题求解-Java语言描述(第三版)>来实现 在自己学习的过程中,更希望有机会与大家交流. PS :本人是菜鸟,只是用博客的方式激励自己.请轻喷.Fighting!

C语言版数据结构算法

C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu.com/s/1u8YW897MjJkoOfsbHuadFQ 在上一篇的FIFO中就是基于数据结构思维中的队列实现的,而基本的数据结构内容还有 算法效率分析.线性表.栈和队列.串.数组和广义表.树和二叉树.图.查表.排序.动态存储管理 上面两个链接就是<数据结构(C语言版)>严蔚敏教授严奶奶的书籍

《数据结构与算法分析—C语言描述》pdf

下载地址:网盘下载 内容简介 编辑 <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行时间分析的基础上考查了一些高级数据结构,从历史的角度和近年的进展对数据结构的活跃领域进行了简要的概括.由于<数据结构与算法分析:C语言描述(原书第2版)>选材新颖,方法实用,题例丰富,取舍得当.<数据结构与算法分析:C语言描述(原书第2版)>的目的是培养学生良好的程序设计技巧和熟练的算

C语言实现单链表-03版

在C语言实现单链表-02版中我们只是简单的更新一下链表的组织方式: 它没有更多的更新功能,因此我们这个版本将要完成如下功能: Problem 1,搜索相关节点: 2,前插节点: 3,后追加节点: 4,一个专门遍历数据的功能: Solution 我们的数据结构体定义如下,和上一个版本稍微有所不同: 例如,我们把人这个结构体添加一个name域,前几个版本没有名字的节点: 我们叫起来很尴尬,都是第几个第几个节点,好啦!现在有名字啦! #include <stdio.h> #include <s

数据结构与算法分析 c语言描述 pdf 高清下载

网盘下载:数据结构与算法分析 c语言描述 pdf 高清下载 – 易分享电子书PDF资源网 作者: [美] Mark Allen Weiss 出版社: 机械工业出版社 副标题: C语言描述 原作名: Data Structures and Algorithm Analysis in C:Second Edition 译者: 冯舜玺 出版年: 2004-1-1 页数: 391 定价: 35.00元 装帧: 平装 内容简介 · · · · · · 本书是<Data Structures and Alg

数据结构C语言实现——线性链表

declaration.h #ifndef DECLARATION_H_INCLUDED #define DECLARATION_H_INCLUDED #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 #define ElemType int typedef ElemType* Triplet; typedef int Status; type