热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

静态链表(数据结构)

静态链表:结构体变量中包含数据域和游标域typedefstructNode{ELEM_TYPEmdata;数据域intcursor;游标}SNode;静态链表:1.数组的下标为0的

静态链表:
结构体变量中包含数据域和游标域

typedef struct Node
{
	ELEM_TYPE mdata;//数据域
	int cursor;//游标
}SNode;
静态链表:
1.数组的下标为0的元素的游标域存放的是未使用链表的第一个节点的下标。
2.数组的最后一个元素(SLIST_SIZE-1)存放的是第一个有数据值得元素的下标。
3.最后一个元素相当于单链表的头结点。

静态链表(数据结构)
静态链表(数据结构)
静态链表(数据结构)
具体代码如下:

//=============SList.h============
#define SLIST_SIZE 22

typedef int ELEM_TYPE;

typedef struct Node
{
	ELEM_TYPE mdata;
	int cursor;
}SNode;

typedef struct List
{
	SNode node[SLIST_SIZE];
}SList,*PSList;

void init(PSList psl);//初始化
static int isFull(PSList psl);
void insertTail(PSList psl,ELEM_TYPE val);//尾插
void insertHead(PSList psl,ELEM_TYPE val);
int isEmpty(PSList psl);
void DeleteKey(PSList psl,int val);
void Show(PSList psl);
void Clear(PSList psl);
void Destroyed(PSList psl);
//=============SList.cpp===========
# include 
# include "SList.h"

void init(PSList psl)//初始化
{
	if(psl == NULL)
	{
		return;
	}
	int i=0;
	for(i;inode[i].cursor = i+1;
	}
	psl->node[i++].cursor = -1;
	psl->node[i].cursor=-1;
}
static int isFull(PSList psl)
{
	return psl->node[0].cursor ==-1;
}
void insertTail(PSList psl,ELEM_TYPE val)
{
	if(psl == NULL||isFull(psl))
	{
		return;
	}
	int index = psl->node[0].cursor;
	psl->node[0].cursor = psl->node[index].cursor;

	psl->node[index].mdata =val;
    psl->node[index].cursor=-1;

	int lastindex=SLIST_SIZE-1;
	while(psl->node[lastindex].cursor != -1)
	{
		lastindex=psl->node[lastindex].cursor ;
	}
	psl->node[lastindex].cursor =index;
}
void insertHead(PSList psl,ELEM_TYPE val)
{
	if(psl == NULL||isFull(psl))
	{
		return;
	}
	int index = psl->node[0].cursor;
	psl->node[0].cursor = psl->node[index].cursor;

	psl->node[index].mdata =val;

	psl->node[index].cursor=psl->node[SLIST_SIZE-1].cursor;
	psl->node[SLIST_SIZE-1].cursor=index;
}
int isEmpty(PSList psl)
{
	return psl->node[SLIST_SIZE-1].cursor==-1;
}
void DeleteKey(PSList psl,int val)
{
	if(psl==NULL||isEmpty(psl))
	{
		return;
	}
	int index = SLIST_SIZE -1;
	int nextindex =psl->node[index].cursor ;
	while(nextindex !=-1)
	{
		if(psl->node[nextindex].mdata == val)
		{
			break;
		}
		index = nextindex;
		nextindex = psl->node[nextindex].cursor;
	}
	if(nextindex == -1)
	{
		return;
	}
	psl->node[index].cursor = psl->node[nextindex].cursor;

	psl->node[nextindex].cursor =psl->node[0].cursor;
	psl->node[0].cursor=nextindex;
}
void Show(PSList psl)
{
	if(psl==NULL)
	{
		return;
	}
	int index = psl->node[SLIST_SIZE-1].cursor ;
	while(index!=-1)
	{
		printf("%d ",psl->node[index].mdata);
		index =psl->node[index].cursor;
	}
	printf("\n");
}
void Clear(PSList psl)
{
	if(psl==NULL)
	{
		return;
	}
	int i=0;
	for(i;inode[i].cursor=i+1;
	}
	psl->node[i++].cursor =-1;
	psl->node[i].cursor=-1;
}
void Destroyed(PSList psl)
{
	Clear(psl);
}
//==============main.cpp========
# include "SList.h"

int main()
{
	SList sl;
	init(&sl);
	int i=0;
	for(i;i<10;i++)
	{
		insertHead(&sl,i+1);
	}
	Show(&sl);
	DeleteKey(&sl,4);
	for(i;i<20;i++)
	{
		insertTail(&sl,i+1);
	}
	Show(&sl);
	Clear(&sl);
	Destroyed(&sl);
	return 0;

}

输出结果:
静态链表(数据结构)


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 给定一个二维平面上的一些点,通过计算曼哈顿距离,求连接所有点的最小总费用。只有任意两点之间有且仅有一条简单路径时,才认为所有点都已连接。给出了几个示例并给出了对应的输出。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
author-avatar
逃跑的骨拉拉gf_761
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有