一、概念
程序 = 数据结构 + 算法
数据结构:研究数据与数据之间的关系
学习数据结构,可以帮助我们更好构建模型,从而提高程序的运行效率
数据:能够输入计算机,并且能够被计算机,识别、处理、运算输出的符号的总称
数据元素:是组成数据的基本单位,一个数据元素可以记为一条记录
数据项:每一个数据元素是由若干数据项组成
结构:
1、逻辑结构
集合:
线性结构:第一个元素没有前驱,最后一个元素没有后继,中间元素有唯一前驱和唯一后继
树形结构:第一个元素没有前驱,最后一个元素没有后继,中间元素有唯一前驱,可以有多个后继
图形结构:元素与元素都可能有关联
2、存储结构
顺序存储:数据在内存中连续存储
链式存储:数据在内存中可以连续存储,也可以不连续。
在当前元素中存放下一个元素的地址即可
索引:
Hash:
3、算法
算法的特性:有穷性、确定性、可行性、输入、输出
语句频度:一个语句在程序中重复执行的次数
时间复杂度:所有可执行的语句频度之和
评判一个算法的优劣:
事后统计法:在程序运行结束之后,统计执行时间
事前估计法(大O计法):计算一个程序的时间复杂度,将时间复杂度的表达式,保留最高次幂的项,去掉系数、得到结果。
例:
3n^3 + 2n^2 + n +3 --> O(n^3)
特殊的,如果时间复杂度为常数,则记为O(1)
二、顺序表
逻辑结构:线性结构
存储结构:顺序存储
1、顺序表的相关结构体表示:
//struct book
//{
// char name[50];
//};
//struct book a[10];
#define N 10
typedef int data_t;
typedef struct seqlist
{
data_t data[N]; //定义的元素
int last; //last为表尾指针,记录顺序表中最后一个元素的下标
}Seqlist;
//Seqlist list;
2、顺序表实现的功能:
(1)创建顺序表 – Seqlist *Seqlist_Create();
(2)插入元素 – void Seqlist_Insert_Pos(Seqlist *list, int pos, data_t data);
(3)删除元素 – void Seqlist_Delete_Pos( Seqlist *list, int pos); //按位置删除
– void Seqlist_Delete_Data( Seqlist *list,data_t data); //按值删除
(4)修改元素 – void Seqlist_Update_Pos(Seqlist *list, int pos, data_t new_data); //按位置修改
– void Seqlist_Update_Data(Seqlist *list, data_t old_data, data_t new_data); //按值修改
(5)查找元素 – data_t Seqlist_Search_Pos(Seqlist *list, int pos); //按位置查找
– int Seqlist_Search_Data(Seqlist *list, data_t data); //按值查找
(6)清空表 – void Seqlist_Clear(Seqlist *list);
(7)删除表 – void Seqlist_Destory(Seqlist *list);
(8)判空 – int Seqlist_Is_Empty(Seqlist *list);
(9)判满 – int Seqlist_Is_Full(Seqlist *list);
(10)打印表 – void Seqlist_Show(Seqlist *list);
作业:实现顺序表的创建、插入、删除(任选一个)、打印、判空、判满
main.c
/*===============================================
* 文件名称:main.c
* 创 建 者:
* 创建日期:2024年03月20日
* 描 述:
================================================*/
#include <stdio.h>
#include "seqlist.h"
int main(int argc, char *argv[])
{
Seqlist *list = Seqlist_Create();
printf("list = %p\n", list);
return 0;
}
seqlist.c
/*===============================================
* 文件名称:seqlist.c
* 创 建 者:
* 创建日期:2024年03月20日
* 描 述:
================================================*/
#include "seqlist.h"
Seqlist *Seqlist_Create()
{
Seqlist *list = (Seqlist *)malloc(sizeof(Seqlist)); //在堆区给顺序表开辟空间
if(NULL == list)
{
printf("malloc failed!\n");
return NULL;
}
list->last = -1; //将表尾指针赋值为-1,表示初始的顺序表为空表
return list; //返回顺序表的首地址
}
//void Seqlist_Insert_Pos(Seqlist *list, int pos, data_t data); //按位置插入
//void Seqlist_Delete_Pos( Seqlist *list, int pos); //按位置删除
//void Seqlist_Delete_Data( Seqlist *list,data_t data); //按值删除
//void Seqlist_Show(Seqlist *list); //打印表
/*===============================================
* 文件名称:seqlist.h
* 创 建 者:
* 创建日期:2024年03月20日
* 描 述:
================================================*/
#ifndef __SEQLIST_H__
#define __sEQLIST_H__
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define N 50
typedef int data_t;
typedef struct seqlist //定义顺序表的类型
{
data_t data[N];
int last; //表尾指针,记录当前表中最后一个元素的下标
}Seqlist;
Seqlist *Seqlist_Create();
void Seqlist_Insert_Pos(Seqlist *list, int pos, data_t data); //按位置插入
void Seqlist_Delete_Pos( Seqlist *list, int pos); //按位置删除
void Seqlist_Delete_Data( Seqlist *list,data_t data); //按值删除
void Seqlist_Show(Seqlist *list); //打印表
#endif