C语言中的初等数据结构
目录
什么是数据结构
C语言中有哪些初等的数据结构
数组
链表
栈
队列
什么是数据结构
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合和该集合中数据元素之间的关系组成。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。(引用自百度百科)
C语言中有哪些初等的数据结构
1. 数组
数组是对类似对象的系统排列,在内存上有一块连续存储空间。
2.链表
链表(Linked list)(台湾称为连结串列)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。(来自百度百科)
3.栈
栈是一种后进先出的数据结构,可以用数组也可用链表实现
4.队列
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
数组
数组是非常基本的数据结构,数组的随机访问很方便。
但数组也有其固有的限制,大小分配后不能改变,因为保存的数据的个数在分配内存的时候就是确定的。按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
int a[10]; 说明整型数组a,有10个元素。
float b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。
char ch[20]; 说明字符数组ch,有20个元素
链表
链表不需要提前分配固定大小存储空间,当需要存储数据的时候分配一块内存并将这块内存插入链表中。
struct example
{
int content;
struct example* next;
}
此处定义了一个结构体节点,它拥有指向下个节点的指针next。content用于存储数据而next指向下一个数据。
此处h为头节点。对链表操作时,只能按顺序进行写入、读取或者删除。查看详情
除了基础的单链表,还有双链表,循环链表等。
栈
栈可以看作是一种特殊的链表。但它拥有FILO1的性质。对栈的操作只能在栈顶发生。最先写入的数据只能在最后读出来。
举例:
#include
#include
#defineDataTypeint
#defineMAXSIZE1024
typedefstruct
{
DataTypedata[MAXSIZE];
inttop;
}SeqStack;
SeqStack*Init_SeqStack()//栈初始化
{
SeqStack*s;
s=(SeqStack*)malloc(sizeof(SeqStack));
if(!s)
{
printf("空间不足\n");
returnNULL;
}
else
{
s->top=-1;
returns;
}
}
intEmpty_SeqStack(SeqStack*s)//判栈空
{
if(s->top==-1)
return1;
else
return0;
}
intPush_SeqStack(SeqStack*s,DataTypex)//入栈
{
if(s->top==MAXSIZE-1)
return0;//栈满不能入栈
else
{
s->top++;
s->data[s->top]=x;
return1;
}
}
intPop_SeqStack(SeqStack*s,DataType*x)//出栈
{
if(Empty_SeqStack(s))
return0;//栈空不能出栈
else
{
*x=s->data[s->top];
s->top--;
return1;
}//栈顶元素存入*x,返回
}
DataTypeTop_SeqStack(SeqStack*s)//取栈顶元素
{
if(Empty_SeqStack(s))
return0;//栈空
else
returns->data[s->top];
}
intPrint_SeqStack(SeqStack*s)
{
inti;
printf("当前栈中的元素:\n");
for(i=s->top;i>=0;i--)
printf("%3d",s->data[i]);
printf("\n");
return0;
}
intmain()
{
SeqStack*L;
intn,num,m;
inti;
L=Init_SeqStack();
printf("初始化完成\n");
printf("栈空:%d\n",Empty_SeqStack(L));
printf("请输入入栈元素个数:\n");
scanf("%d",&n);
printf("请输入要入栈的%d个元素:\n",n);
for(i=0;i
{
scanf("%d",&num);
Push_SeqStack(L,num);
}
Print_SeqStack(L);
printf("栈顶元素:%d\n",Top_SeqStack(L));
printf("请输入要出栈的元素个数(不能超过%d个):\n",n);
scanf("%d",&n);
printf("依次出栈的%d个元素:\n",n);
for(i=0;i
{
Pop_SeqStack(L,&m);
printf("%3d",m);
}
printf("\n");
Print_SeqStack(L);
printf("栈顶元素:%d\n",Top_SeqStack(L));
return0;
}
队列
队列与栈相似,区别是它拥有FIFO2的性质。如图:
实际操作与链表、栈相似。
下面是循环队列元素个数计算公式:队列头指针为front,队列尾指针为rear,队列容量为M,则元素个数
x=M⋅(|rear−front+M|M−⌊|rear−front+M|M⌋)
附送一只皮卡丘:
first in last out ↩
first in first out,最先写入的数据最先读出 ↩