是时候补一补基础了,那么在算法之前,要搞定的就是数据结构。
基本概念
首先介绍其中比较重要的几个基本概念
数据(data)是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称
数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据对象(data object)是性质相同的数据元素的结合,是数据的一个子集。
数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。
根据数据元素之间关系的不同特性,通常有下列四类基本结构:
- 集合:结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系
- 线性结构:结构中的数据元素之间存在一个对一个的关系
- 树形结构 :结构中的数据元素之间存在一个对多个的关系
- 图状结构或网状结构: 结构中的数据元素之间存在多个对多个的关系
线性表(List):零个或者多个数据严肃的有限序列
线性表的顺序存储结构
线性表的顺序存储结构的表示和实现
线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INIT_SIZE 10 //初始化表长
#define INCREMENT_SIZE 5 //分配增量
typedef int Status;
typedef int Elemtype;
/*
* 存储结构
*/
typedef struct
{
Elemtype *elem; //存储空间基址
int length; //当前长度
int size; //当前分配的表长大小
// 当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;
初始化一个空的线性表(InitList)
/*
* 初始化一个空的线性表
*/
Status InitList(SqList *L)
{
L->elem = (Elemtype *) malloc(INIT_SIZE * sizeof(Elemtype));
if (!L->elem)
{
return ERROR;
}
L->length = 0; //空表长度为0
L->size = INIT_SIZE; //初始存储容量
return OK;
}
销毁线性表(DestroyList)
/*
* 销毁线性表
*/
Status DestroyList(SqList *L)
{
free(L->elem);
L->length = 0;
L->size = 0;
return OK;
}
清空线性表(ClearList)
/*
* 清空线性表
*/
Status ClearList(SqList *L)
{
L->length = 0;
return OK;
}
判断线性表是否为空(isEmpty)
/*
* 判断线性表是否为空
*/
Status isEmpty(const SqList L)
{
if (0 == L.length)
{
return TRUE; //这里为什么把0写前边。。。好别扭。。
}
else
{
return FALSE;
}
}
获取长度(getLength)
/*
* 获取长度
*/
Status getLength(const SqList L)
{
return L.length; //这个最简单粗暴又多此一举了
}
根据位置获取元素(GetElem)
/*
* 根据位置获取元素
*/
Status GetElem(const SqList L, int i, Elemtype *e)
{
if (i < 1 || i > L.length)
{
return ERROR; //判断合法性
}
*e = L.elem[i-1]; //试想一下返回第一个 那么就是第[0]个元素。所以要-1
return OK;
}
比较两个元素是否相等(compare)
/*
* 比较两个元素是否相等 前小返回-1 前大返回1 相等返回0
*/
Status compare(Elemtype e1, Elemtype e2)
{
if (e1 == e2)
{
return 0;
}
else if (e1 < e2)
{
return -1;
}
else
{
return 1;
}
}
查找元素(FindElem)
/*
* 查找元素
*/
Status FindElem(const SqList L, Elemtype e, Status (*compare)(Elemtype, Elemtype))
{
int i;
for (i = 0; i < L.length; i++)
{
if (!(*compare)(L.elem[i], e))
{
return i + 1;
}
}
if (i >= L.length)
{
return ERROR;
}
}
查找前驱元素(PreElem)
/*
* 查找前驱元素
*/
Status PreElem(const SqList L, Elemtype cur_e, Elemtype *pre_e)
{
int i;
for (i = 0; i <