数据结构的概念
数据介绍
数据:计算机能够识别,存储,用来描述客观事物的。
数据的种类:
数值数据:整数,小数,字符串......
非数值数据:图像,视频,音频......
数据的组成:数据项--->数据元素--->数据对象--->数据
数据项:数据的最小单位,用来组成数据元素。(例:一个学生的学号)
数据元素:由数据项组成,用来描述事物特征的。(例:一个学生)
数据对象:由属性相同的数据元素组成的数据对象。(例:一个班级)
数据结构研究的是数据元素
结构介绍
结构:数据元素之间的关联情况
结构的种类:逻辑结构,存储结构
- 逻辑结构:就是数据元素之间的关系,具体可以分为以下几种结构
集合结构:数据元素之间没有任何关系。单纯在一个集合中而已。
线性结构:数据元素之间存在一对一的关系。这种结构,除了第一个元素没有前驱,最后一个元素没有后继以外,每个元素都有一个前驱和一个后继。
树形结构:数据元素之间存在一对多的关系。
图形结构:数据元素之间存在多对多的关系。
- 存储结构:将逻辑结构上的数据元素在物理内存上的映射
顺序存储:将数据元素逻辑上相连,在物理内存上也相连。
链式存储:将逻辑上相连的数据,在物理内存上随机存储。
索引存储:将存储的数据用一个索引表记录存储的位置。
散列存储:又称为哈希存储,存放数据的位置与数据自己有关系。
线性表
概念:相同属性的数据元素组成的线性结构,称为线性表
特点:
- 数据元素属性相同
- 数据元素之间是线性结构
种类:顺序表(顺序存储的线性表),链表(链式存储的线性表),栈(操作受限的线性表),队列(操作受限的线性表)
顺序表(sequence)
顺序表:顺序存储的线性表
顺序表存放的方式
可以使用数组存放数据,可以实现逻辑上相连,物理内存上也相连。
也可以用malloc在堆区申请一片连续的空间,存放数据,实现逻辑相连,物理内存上也相连。
顺序表的组成
需要一片连续的空间,存放数据,可以是数组,也可以是连续的堆区空间。
还需要一个变量来记录当前顺序表的长度(以存放的元素个数)。
顺序表结构体
格式:
struct sequence
{
char data[20];
int len; //顺序表的长度,已存放的元素个数
};
例:
//宏定义 线性表的最大容量
#define MAX 30
//类型重定义,表示要存放数据的类型
typedef char DataType;
//定义顺序表的结构体类型
typedef struct sequence
{
DataType data[MAX];
int len; //顺序表的长度,已存放的元素个数
}seqList, *seqListPtr;
顺序表的相关操作(功能函数的封装)
顺序表的创建
函数功能:创建一个顺序表。
在堆区申请顺序表的大小空间,将申请的地址返回给主程序使用,需要判断申请的堆区空间是否合法。创建完顺序表后需要将顺序表长度置0,将数组清空。
格式:
数据类型 函数名 ()
{
数组;
顺序表长度;
}
分析:
数据类型:与顺序表的指针的类型相同
- 先在头文件中定义顺序表结构体(定义数组表示顺序表的最大容量,定义int类型变量表示顺序表长度),并声明顺序表的创建
- 在源文件中完成顺序表空间的申请和判断空间是否合法
- 在main文件中完成顺序表的创建
判空
功能:判断顺序表是否为空(顺序表长度为0)
需要判断申请的堆区空间是否合法
参数列表:顺序表
如果为空返回真(1),非空返回假(0)
判满
功能:判断顺序表是否为满(顺序表长度为最大值)
需要判断申请的堆区空间是否合法
参数列表:顺序表
如果为满返回真(1),非满返回假(0)
顺序表的增加
功能:增加顺序表(将新的数据放入下标为len的位置)
需要判断申请的堆区空间是否合法
参数列表:顺序表,要增加的数据
需要判断顺序表是否为满
顺序表的遍历
功能:遍历顺序表
需要判断申请的堆区空间是否合法
参数列表:顺序表
需要判断顺序表是否为空
任意位置插入数据
需要判断申请的堆区空间是否合法
参数列表:顺序表,插入位置,插入数据
练习:
存放学生的信息。
i) 独立完成今天顺序表的创建、判空、判满、增加、遍历、任意位置插入数据。(要求:尽量每行代码都有注释)
ii) 完成顺序表的任意位置删除数据功能函数的封装。
头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//宏定义 线性表的最大容量
#define MAX 30
//定义顺序表的结构体类型
typedef struct sequence
{
//定义结构体
struct student
{
char name[128];
int age;
}stu;
int len; //顺序表的长度,已存放的元素个数
}seqList, *seqListPtr;
//顺序表的创建
seqListPtr seq_create();
//判空
int empty(seqListPtr s);
//判满
int full(seqListPtr s);
//顺序表增加
int seq_add(seqListPtr s,char a[128],int b);
//顺序表遍历
void seq_show(seqListPtr s);
源文件
#include "sequence.h"
//顺序表的创建
seqListPtr seq_create()
{
//在堆区申请顺序表的空间,返回给主函数使用
seqListPtr s=(seqListPtr)malloc(sizeof(seqList));
//判断空间是否合法
if(NULL==s)
{
printf("创建失败\n");
return NULL;
}
//顺序表的长度置0
s->len=0;
printf("创建成功\n");
return s;
}
//判空
int empty(seqListPtr s)
{
if (NULL==s)
{
printf("顺序表不合法\n");
return -1;
}
else
return s->len==0;
}
//判满
int full(seqListPtr s)
{
if (NULL==s)
{
printf("顺序表不合法\n");
return -1;
}
else
return s->len==MAX;
}
//顺序表增加
int seq_add(seqListPtr s,char a[128],int b)
{
if (NULL==s || full(s))
{
printf("增加失败\n");
return 0;
}
strcpy(s->stu.name,a);
s->stu.age=b;
s->len++;
return 1;
}
//顺序表遍历
void seq_show(seqListPtr s)
{
if(NULL==s||empty(s))
{
printf("遍历失败\n");
return;
}
else
{
for(int i=0;i<s->len;i++)
{
printf("%s %d ",s->stu.name,s->stu.age);
}
putchar(10);
}
}
main文件
#include "sequence.h"
int main()
{
//创建顺序表
seqListPtr s=seq_create();
printf("%p\n",s);
//判满
full(s);
//增加数据
seq_add(s,"张三",24);
seq_add(s,"李四",32);
seq_show(s);
//判空
empty(s);
}