数据结构定义
静态链表
#define MaxSize 10
typedef struct {
ElemType data;
int next;
} SlinkList[MaxSize];
单链表
typedef struct LNode{
ElemType data;
struct DNode *next;
} LNode,*LinkList;
双链表
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
} DNode,*DLinklist;
顺序栈
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int top;
} SqStack;
链栈(头插法)
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
} *LiStack;
队列(顺序实现)
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
int front,rear;
} SqQueue;
队列(链式实现)
typedef struct LinkNode{
ElemType data;
struct LinkNode *next;
} LinkNode;
typedef struct{
LinkNode *front,*rear;
} LinkQueue;
串(顺序存储)
#define MAXLEN 255
typedef struct{
char ch[MAXLEN];
int length;
} SString;
串(链式存储)
typedef struct StringNode{
char ch[4];
struct StringNode *next;
} StringNode,*String;
二叉树(顺序存储)
#define MAXSIZE 10
struct TreeNode{
ElemType data;
bool isEmpty;
};
TreeNode t[10];
二叉树(链式存储)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
线索二叉树(方便寻找中序遍历中的前趋后继)
typedef struct ThreadNode{
ElemType data;
struct ThreadNode*lchild,*rchild;
int ltag,rtag; //tag==0 表示child为孩子,否则为线索
} ThreadNode,*ThreadTree;
树(孩子兄弟表示法(链式存储))
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild,*nextsibling;//firstchild为左孩,nextsibling为右边的兄弟;
} CSNode,*CSTree;
二叉排序树
左子树结点<根结点值<右子树结点值
typedef struct BSTNode{
ElemType data;
struct BSTNode *lchild,*rchild;
} BSTNode,*BSTree;
十字链表
图
寻找最小生成树
- 迪杰斯特拉( Dijkstra )算法
基于已经求出的最短路径的基础上,求得更远顶点的最短路径。注:每次都从路径最小值开始遍历,直到到达终点。 - 弗洛伊德( Floyd )算法
区别于迪杰斯特拉算法,需要计算每个点之间的最短距离,思想是循环将每个点加入路径,判断经过这个点是否路径会更短。注:需注意经过的点的记录方式。
寻找最短路径
- 普里姆(Prim)算法
选择最小边开始,然后不断尝试将别的边加入,使得不形成回路,且达到整体最小,不断重复直到加入所有点。 - 克鲁斯卡尔(Kruskal)算法
不断选取当前未被选取过且权值最小的边,若该边依附的顶点落在T中不同的连通分量上,不形成回环,则将此边加入,否则舍弃此边而选择下一条权值最小的边。以此类推,直至所有顶点都在一个连通分量上。