C语言数据结构
有关数据结构的一些知识的总结
_Saoke
曾以为走不出去的日子
现在都回不去了
展开
-
图的存储结构-邻接矩阵
邻接矩阵图的存储结构分为 邻接矩阵 和 邻接表, 本篇文章是有关通过邻接矩阵来实现图的存储, 邻接矩阵, 顾名思义, 即顶点之间的关系通过矩阵的形式表现出来, 矩阵的行坐标代表起始顶点的位置, 列坐标代表到达顶点的位置(无向图和无向网始末位置不讨论), 对于不带权的图或网而言, 矩阵中的值存放邻接标志, 如果起始顶点与到达顶点邻接, 则为 1, 否则为 0; 而对于带权图或网而言, 如果起始顶点...原创 2019-01-04 18:24:41 · 2899 阅读 · 0 评论 -
哈夫曼编码算法--我只想简单点
哈夫曼树哈夫曼树, 即带权路径最小的树, 权值最小的结点远离根结点, 权值越大的结点越靠近根结点图解图(3)即为哈夫曼树哈夫曼编码左孩子路径编码为 0, 右孩子路径编码为 1图解即A 的编码: 0D 的编码: 10B 的编码: 110C 的编码: 111哈夫曼编码算法的实现定义一个哈夫曼树//定义一个哈夫曼树typedef struct { //定义权值 un...原创 2019-01-02 13:12:38 · 62826 阅读 · 12 评论 -
线索二叉树-C语言实现
线索二叉树的定义在二叉链表中, 具有 n 个结点的二叉链表有 n + 1 个空指针域. 由此, 可以利用这些空指针域来存放结点的直接前驱和直接后继的信息结点的存储结构 lchildltagdatartagrchild左孩子结点前驱结点标志域数据域后继结点标志域右孩子结点含义 当 ltag = 0 时, lchild 指向结点的左孩子;当 ltag ...原创 2019-01-01 16:31:19 · 5401 阅读 · 10 评论 -
二叉树叶子结点,非叶子节点以及深度的计算
二叉树叶子结点的计算//统计叶子结点的数目int LeafNum(BiTree T) { if (!T) { return 0; } else if (!T->lchild && !T->rchild) { return 1; } else { return LeafNum(T->lchild) + LeafNum(T->rchild)...原创 2018-12-30 12:34:36 · 11605 阅读 · 0 评论 -
二叉树的遍历操作-递归和非递归
二叉树的遍历二叉树的遍历是很常见的一种问题, 往常我们可以通过递归来实现二叉树的先序,中序以及后序的遍历操作, 但是将递归转化成非递归是件值得去思考的一件事, 接下来是具体实现具体实现二叉树的定义//定义一个二叉链表typedef struct Node { char data; struct Node* lchild; struct Node* rchild;}BitNode,...原创 2018-12-30 12:27:42 · 356 阅读 · 0 评论 -
二叉树的基本操作-C语言
二叉树的基本操作在了解了二叉树的概念之后, 大家会发现二叉树的其实是一个递归的思维, 因此它的创建, 遍历以及销毁等操作可以用递归来实现具体实现定义一个二叉树//定义一个二叉链表typedef struct Node { char data; struct Node* lchild; struct Node* rchild;}BitNode, *BiTree;递归创建一个二...原创 2018-12-29 15:12:39 · 605 阅读 · 1 评论 -
链队列的基本操作-C语言
链队列用链表实现队列的基本操作, 定义两个指针, 分别指向链表的头结点和尾节点, 即作为队列的头和尾, 在队尾进行插入操作, 在对头进行出队操作具体实现定义一个链队列//定义一个队列typedef int ElemType;//链表的定义typedef struct QNode { ElemType data; struct QNode* next;}QNode, *Queue...原创 2018-12-29 14:52:56 · 2859 阅读 · 0 评论 -
顺序队列的基本操作-C语言
顺序队列的基本操作顺序队列即用顺序表实现的队列, 其操作简便, 但是会出现"假溢出"的现象, 这是由于顺序表的定义以及队列的特点所共同决定的具体实现顺序队列的定义//定义一个顺序队列#define QUEUESIZE 100typedef struct Squeue { int queue[QUEUESIZE]; int front; int rear;}SeQueue;...原创 2018-12-22 19:14:48 · 4656 阅读 · 0 评论 -
链栈的基本操作-C语言
链栈的基本操作用链表实现一个栈具体实现定义一个链栈//定义一个链栈typedef struct LNode { int data; struct LNode* next;}LNode, *LinkStack;初始化//初始化链栈void InitStack(LinkStack* S) { //创建头结点 *S = (LinkStack)malloc(sizeof(LN...原创 2018-12-22 18:09:23 · 2989 阅读 · 0 评论 -
共享栈的基本操作-C语言
共享栈的基本操作共享栈是用顺序表实现, 在两端分别设置为栈底, 并且分别初始化栈顶, 实现可以在两端进行入栈和出栈操作, 并且互不干扰, 模拟分工成两个栈, 当两个栈顶索引重合时, 这代表该共享栈已满.具体实现定义一个共享栈//定义一个共享栈typedef struct { int stack[100]; int top[2];}SqStack;初始化//对共享栈进行初始化...原创 2018-12-22 17:54:51 · 2563 阅读 · 4 评论 -
顺序栈的基本操作-C语言
顺序栈的基本操作具体实现顺序栈的定义//定义一个顺序栈#define STACK_INIT_SIZE 100#define INCREMENT 10typedef int ElemType;typedef struct { ElemType* base; ElemType* top; int stacksize;}SqStack;创建一个顺序表//创建一个顺序表vo...原创 2018-12-21 21:06:45 · 3076 阅读 · 0 评论 -
双向链表的基本操作-C语言
双向链表的实现本质: 其实就是定义两个指针域, 分别存放直接前驱结点的指针和直接后继结点的指针.具体实现定义一个双向链表//定义一个双向链表typedef struct LNode { int data; struct LNode* next; struct LNode* prior;}LNode, *LinkList;创建一个指定大小的双向链表//创建一个指定大小的双向...原创 2018-12-21 09:00:38 · 959 阅读 · 0 评论 -
循环单链表的创建,遍历和销毁
循环单链表的简单操作因为循环单链表和单链表的插入,删除等操作大同小异 ,因此我只总结了循环链表的创建,遍历以及销毁操作循环链表的定义//定义一个单链表typedef struct LNode { int data; struct LNode* next;}LNode, *LinkList;虚幻链表的创建//创建一个指定大小的循环链表void CreateLoopList(Li...原创 2018-12-12 12:15:20 · 4237 阅读 · 1 评论 -
线性表:动态链表
在数据结构中我们经常会用到链表来处理一些问题, 链表同顺序表一样, 包括静态链表和动态链表, 静态链表并不是很常用, 但动态链表的重要性是不言而喻的.接下来我们看一下动态链表的基本操作, 以书上的资料为参考, 同时自己对动态链表增加了新的认识和总结动态链表的基本操作动态链表的定义//定义一个动态链表typedef int ElemType;typedef struct LNode ...原创 2018-12-07 18:11:32 · 603 阅读 · 0 评论 -
数据结构之静态顺序表和动态顺序表
@Sock对静态顺序表和动态顺序表的总结简单概括他们的异同点相同点:内存空间连续, 数据顺序存储不同点:它们所占内存空间的位置不同, 静态定义一个顺序表, 顺序表所占的内存空间开辟在内存的静态区, 即所谓的函数栈上, 随着函数调用的结束, 这块内存区域会被系统自动回收; 而动态生成一个顺序表, 顺序表所占的内存空间开辟在内存的动态区, 即所谓的堆内存上, 这块区域不会随着函数调用的结束被...原创 2018-12-02 12:58:26 · 1372 阅读 · 0 评论