数据结构描述:
#define MAX 50
typedef int ElemType;
//线性表:顺序
typedef struct
{
//表中数据个数
int count;
ElemType data[MAX];
}ArrayList;
//线性表:链式,带头节点
typedef struct Node
{
ElemType data;
struct Node* next;
}LinkList;
//栈:顺序
typedef struct
{
//int count; //栈中元素的个数
int top; //栈顶的index,栈空时为-1
ElemType data[MAX];
}SqStack;
//栈:链式,不要头节点,直接在链表头部进行操作
typedef struct Node
{
ElemType data;
struct Node* next;
}LiStack;
//队列:顺序,采用循环数组,空出一个不放元素/设置一个flag表示是否队满/记录队列中元素个数
typedef struct
{
//int count; //队列中元素的个数
int front,rear; //头指针和尾指针
ElemType data[MAX];
}SqQueue;
//队列:链式,最好使用循环链表
typedef struct
{
LinkNode* first,* last;
}LiQueue;
//二叉树:孩子兄弟表示法
typedef struct Node
{
struct Node* lchild;
struct Node* rchild;
ElemType data;
}BTree;
//图:
/*
邻接矩阵:
1.无向图的邻接矩阵是对称矩阵,可以只存三角矩阵
2.不带权的有向图的邻接矩阵是稀疏矩阵,可以用三元组标识
3.无向图:邻接矩阵的第i行非0元素的个数是第i个顶点的度(对于有向图,是出度)
4.易于确定顶点间是否有边,但是确定总边数时,要按行和列进行扫描,复杂。
*/
typedef struct
{
int no; //定点编号
char* info; //顶点其他信息
} VertexType; //顶点类型
typedef struct
{
int edges[MAX][MAX]; //邻接矩阵的边数组
int n,e; //顶点数,边数
VertexType vxs[MAX]; //存放顶点信息
} MGraph;
//顺序分配与链式分配的结合,邻接表
/*
邻接表:
1.表示不唯一
2.n,e的无向图需要存储n个顶点和2*e个边,对于稀疏图,邻接表更省空间
3.第i个链表的长度是顶点i的度。
4.有向图中只存储了以顶点为起点的边,不宜找到指向该顶点的边,可以设计逆邻接表,保存指向该顶点的边。
*/
typedef struct ANode
{
int adjvex; ///该边的终点位置
struct ANode* nextarc; //指向下一条边的指针
char* info; //边的信息
} ArcNode;
typedef struct VNode
{
char* data; //顶点信息
ArcNode* firstarc; //指向第一条边
}VNode;
typedef VNode AdjList[MAX];
typedef struct
{
AdjList adjlist; //邻接表
int n,e; //顶点数,边数
} ALGraph;
//并查集
typedef struct node
{
int data; //对应此人的编号
int rank; //节点对应的秩
int parent; //节点对应的双亲节点
} UFSTree;
//哈夫曼树:其实是一种贪心思想,每次选最小的两个构成一个根
typedef struct{
char data;
double weight;
int parent;
int lchild;
int rchild;
}HTNode;