C语言动态数据结构
Posted 电气自动化资料库
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言动态数据结构相关的知识,希望对你有一定的参考价值。
分配内存空间函数malloc
分配内存空间函数calloc
释放内存空间函数free
函数名:malloc
函数功能:是在内存的动态存储区中分配一块确定长度的连续空间
函数原型:void * malloc(long NumBytes)
该函数分配了长度为NumBytes个字节的内存区域,并返回指向这块内存的指针。返回类型为void类型,因此需要在返回时对其进行强制类型转换,转换为需要的类型。如果分配失败,则返回空指针(NULL)。
函数名:calloc
函数功能:是在内存的动态存储区中分配n块确定长度的连续空间
函数原型:void * calloc(int n,long NumBytes)
free函数是和malloc函数组合使用的函数,对于malloc分配的内存区域,一定记住要使用free函数予以释放。
free函数使用的一般形式为:
链表的建立
链表的遍历
链表是一种物理存储结构上非连续的数据结构,它由一系列数据结点连接而成,这些结点也称为链表的元素,是链表中数据的主要载体。
链表采用动态的分配方法为一个结构体分配内存空间。
一方面,需要时就分配一块空间用来存放,从而节约了宝贵的内存资源;且便于删除与加入。
建立链表就是指从无到有地建立起一个链表,即一个个地输入各结点数据,并建立起前后相连的关系。
链表结点的插入
链表结点的删除
链表结点的插入和删除是通过改变链表引用域的指针来实现的。
链表中间插入新结点时应首先将链表插入位置的前一个节点的引用域指向要插入的结点,然后将要插入结点的引用域指向插入位置的下一个结点。
从一个链表中删除一个结点,并不是真正从内存中把它抹去,而是把它从链表中分离开来,可以通过改变链表的链接关系完成。
数据结构是计算机存储、管理数据的方式。数据必须依据某种逻辑联系组织在一起存储在计算机内,数据结构研究的就是这种数据的存储结构和数据的逻辑结构。
选择合适的数据结构是非常重要的。在许多类型的程序设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了,算法得到了,问题才能够得到顺利的解决。有些时候事情也会反过来,可以根据特定算法来选择合适的数据结构。
线性结构是简单而且常用的数据结构,而线性表则是一种典型的线性结构。存储数据,最简单、最有效的方法就是把它们存储在一个线性表中,只有当需要组织和搜索大量数据时,才考虑使用更复杂的数据结构。
一个线性表是n个数据元素的有限序列,每个元素在不同的情况下有不同的含义,可以是数字,也可以是字符,或者是其他信息。
栈的基本运算
顺序栈的类型定义
链式栈的类型定义
在实际使用过程中,常用的栈的操作有如下一些。
(1) InitStack(S):构造一个空栈S。
(2) StackEmpty(S):判栈空。若S为空栈,则返回TRUE,否则返回FALSE。
(3) StackFull(S):判栈满。若S为满栈,则返回TRUE,否则返回FALSE。
(4) Push(S,x):进栈。若栈S不满,则将元素x插入S的栈顶。
(5) Pop(S):退栈。若栈S非空,则将S的栈顶元素删去,并返回该元素。
(6) StackTop(S):取栈顶元素。若栈S非空,则返回栈顶元素,但不改变栈的状态
顺序栈的定义和顺序表的定义一样,通常我们使用结构体定义顺序栈,记录栈顶坐标,从而操作栈实现各种功能。
#define StackSize 100 /*假定预分配的栈空间最多为100个元素*/
typedef char DataType; /*假定栈元素的数据类型为字符*/
typedef struct
{
DataType data[StackSize]; /*定义栈数组*/
int top; /*定义栈顶*/
}SeqStack;
注意:
(1) 栈底位置是固定不变的,可设置在向量两端的任意一个端点。
(2) 栈顶位置是随着进栈和退栈的操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶的位置。
栈的链式存储结构称为链栈。链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。跟单链表一样,通常我们使用结构体实现链式栈的功能,结构体内一个量存储结点值,一个量存储指针,实现链式结构。就像单链表有头指针一样,我们也为链式栈定义头结点,以便对链式栈进行操作。
队列的基本运算
顺序队列类型定义
链式队列类型定义
在实际使用过程中,常用的队列操作有如下一些。
(1) InitQueue(Q):置空队。构造一个空队列Q。
(2) QueueEmpty(Q):判队空。若队列Q为空,则返回真值,否则返回假值。
(3) QueueFull(Q):判队满。若队列Q为满,则返回真值,否则返回假值。
(4) EnQueue(Q,x):若队列Q非满,则将元素x插入Q的队尾。此操作简称入队。
(5) DeQueue(Q):若队列Q非空,则删去Q的队头元素,并返回该元素。此操作简称出队。
(6) QueueFront(Q):若队列Q非空,则返回队头元素,但不改变队列Q的状态。
队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。和顺序表一样,顺序队列用一个向量空间来存放当前队列中的元素。由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应设置为0。
1.链式队列简述
用链表可以实现队列,这种队列称为链式队列。它是限制仅在表头删除和表尾插入的单链表。链表会在插入和删除元素时进行动态的扩展和收缩,为了描述队列的头和尾,必须想办法跟踪链表的首个结点和最后一个结点,它们也就是队列的头和尾。
2.向链表中插入元素
当向队列中插入一个新的元素时,front指针的next指针将指向这个新元素,而且rear指针也将随之后移。
3.清空队列和销毁队列的区别
清空队列只是将队列中的元素清零,但是初始结点还将保留,且front指针和rear指针都指向初始结点。尽管这时队列是一个空队列,但队列仍然存在,因此仍然可以向队列中加入新元素。但是如果将队列销毁的话,那么就表示初始结点也会被释放,队列也就不复存在了。
树形结构是一类重要的非线性结构。树形结构是结点之间有分支,并具有层次关系的结构。它类似于自然界中的树。
二叉树是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树的形式。即使是一般的树,也能简单地转换为二叉树。而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。
顺序查找
折半查找
顺序查找如同数组的遍历,就是从数组的第1个元素开始,检查数组的每一个元素,以便确定是否有查找的数据。因为是从头检查到尾,所以数组数据是否排序就不重要了。
如果查找的数据已经排序,虽仍然可以使用顺序查找法进行顺序查找,不过有一种更好的方法,那就是折半查找法。
折半查找法使用分区数据,然后查找的方法。首先折半查找检查中间元素,如果中间元素小于查找的关键值,可以确定数据是存储在前半段,否则就在后半段。然后继续在可能存在的半段数据内重复上述操作,直到找到或已经没有数据可以分区,表示没有找到。
如果数组的上下范围分别是low和high,此时的中间元素是(low+high)/2。在进行查找时,可以分成以下3种情况:
(1) 如果查找关键值小于数组的中间元素,关键值在数据数组的前半部分。
(2) 如果查找关键值大于数组的中间元素,关键值在数据数组的后半部分。
(3) 如果查找关键值等于数组的中间元素,中间元素就是查找的值。
求解迷宫问题。以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。对任意设定的迷宫,求出一条从入口到出口的通路,并输出所经过的坐标点,或得出没有通路的结论。
以上是关于C语言动态数据结构的主要内容,如果未能解决你的问题,请参考以下文章