对于数据结构,大致分为四种基本类型:
集合:元素之间没有任何关系
线性表:元素之间存在一对一关系(数组)
数组、链表、功能受限的表(栈、队列)
树:元素之间存在一对多关系
普通数、二叉树、完全二叉树、满二叉树、有序二叉树
图:元素之间存在多对多关系
邻接表、表的遍历(深度优先、广度优先)、最短路径
这篇主要讲表。
表,是一种线性结构,在实际应用中体现为两种,根据逻辑结构来分,分为栈和队列,根据存储结构来分,分为顺序表和链式表。
栈(逻辑结构)
限制为只有一个元素进出元素,就导致先进后出和特性
顺序栈(容量有限)、链式栈(可以无限容量)。
一般用于表达式解析,内存管理(为函数的调用提供支持)。
顺序栈:基本结构:
typedef struct Stack
{
TYPE* arr;//内存首地址
int len;//栈的内量
int top;//栈顶的下标
}Stack;
链式栈基本结构:
typedef struct Stack
{
Node* top;//栈顶长度
size_t len;//自定义长度
}Stack;
队列(逻辑结构)
限制为有一个端口进出元素,一个只管进,另一个只管出,就导致先进先出
顺序队列
链式队列
顺序队列基本结构:
typedef struct Queue
{
TYPE* base;
int size; //容量
int head; //队头
int tall; //队尾
int cnt; //数量
}Queue;
链式队列基本结构:
typedef struct Queue
{
Node* head;//头指针
Node* tail;//尾指针
size_t size;/长度
}Queue;
链表,单向链表:
typedef struct Node
{
TYPE data; // 数据
struct Node* next; // 后一个元素
}Node;// 创建节点
Node* creat_node(TYPE data)
{
Node* node = malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
typedef struct List
{
Node* head;
Node* tail;
size_t size;
}List;
双向链表:
typedef struct Node
{
struct Node* prev; // 前一个元素
TYPE data; // 数据
struct Node* next; // 后一个元素
}Node;
// 创建节点
Node* creat_node(TYPE data)
{
Node* node = malloc(sizeof(Node));
node->prev = NULL;
node->data = data;
node->next = NULL;
return node;
}
typedef struct List
{
Node* head;
Node* tail;
size_t size;
}List;