
数据结构
leoufung
Linux Kernel,Virtualization
展开
-
判别二叉树是否为二叉排序树 -- C语言
算法使用中序遍历的结果就是排序二叉树的排序输出(从小到大), 因此可以使用中序遍历 来实现判定二叉树是否为二叉排序树。注意,不能用递归比较root和left,right的大小关系,因为left,right无法判断和root,root->parent,root->parent->parent等的大小关系代码实现bool isBSTree(st_trNode * ...原创 2020-02-23 23:27:22 · 1987 阅读 · 1 评论 -
二叉树层次遍历 -- C语言
原理这个问题很难 直接 用 节点 的 指针( left、 right、 parent) 来 实现, 但是 借助 一个 队列 就可以 轻松 地 实现, 例如 图 8. 7 所示 的 二 叉 树 结构。 可以 按照 下面 的 方式 执行。(1) A 入队 CX。(2) A 出 队, 同时 A 的 子 节点 B、 C 入队( 此时 队列 有 B、 C)。(3) B 出 队, 同时 B 的...原创 2020-02-23 21:59:36 · 650 阅读 · 0 评论 -
二叉排序树非递归遍历 -- C语言
原理1. 前序遍历对于 先 序 遍历 非 递归 算法, 这里 我们 使用 一个 栈( stack) 来临 时 存储 节点, 方法 如下。(1) 打印 根 节点 数据。(2) 把 根 节点 的 right 入栈, 遍历 左 子 树。(3) 遍历 完 左 子 树 返回 时, 栈 顶 元素 应为 right, 出 栈, 遍历 以该 指针 为 根 的 子 树。2. 中序遍历对...原创 2020-02-23 20:33:45 · 820 阅读 · 1 评论 -
二叉排序树 -- C语言
数据结构二 叉 排序 树( Binary Sort Tree) 又称 二 叉 查找 树( Binary Search Tree)。 其 定义 为: 二 叉 排序 树 或者是 空 树, 或者是 满足 如下 性 质的 二 叉 树。(1) 若 它的 左 子 树 非 空, 则 左 子 树上 所有 节点 的 值 均 小于 根 节点 的 值。(2) 若 它的 右 子 树 非 空, 则 右 子 树上...原创 2020-02-23 20:27:37 · 549 阅读 · 0 评论 -
用链表实现栈 -- C语言
算法草稿top 为链表的tail,botton 为链表的 head代码实现#include <stdio.h>#include <stdlib.h>#include "list.h"#include "stack.h"int dumpStack(st_stack * stack){ if(NULL == stack){ return SUCC...原创 2020-02-20 22:14:22 · 424 阅读 · 1 评论 -
队列和栈的区别
队列 与 栈 是 两种 不同 的 数据 结构。 它们 有 以下 区别。(1) 操作 的 名称 不同。 队列 的 插入 称为 入队, 队列 的 删除 称为 出 队。 栈 的 插入 称为 进 栈, 栈 的 删除 称为 出 栈。(2) 可操作 的 方向 不同。 队列 是在 队 尾 入队, 队 头 出 队, 即 两边 都可 操作。 而 栈 的 进 栈 和 出 栈 都 是在 栈 顶 进行 的, 无法...原创 2020-02-20 19:40:29 · 12689 阅读 · 0 评论 -
队列的入队、出队、测长、打印 -- C语言
队列的特点是先进先出 FIFO代码实现#include <stdio.h>#include <stdlib.h>#include "list.h"#include "queue.h"int dumpQueue(st_queue * queue){ if(NULL == queue){ return SUCCESS; } st_dataNod...原创 2020-02-20 19:36:03 · 676 阅读 · 0 评论 -
删除两个双向循环链表中相同数值节点 -- C语言
代码实现int removeDoubLoopListNodeByData(st_doubNode ** phead, int data){ if(NULL == phead ){ printf("%s: param error\n",__func__); return PARAM_ERR; } if(NULL == phead){ return SUCCESS; }...原创 2020-02-20 17:12:44 · 618 阅读 · 0 评论 -
双向循环链表的插入 -- C语言
代码实现int insertDoubLoopSortedListNode(st_doubNode** phead, int data){ if(NULL == phead){ printf("%s: param error\n",__func__); return PARAM_ERR; } st_doubNode * head = NULL; st_doubNode * ...原创 2020-02-19 16:14:05 · 2061 阅读 · 0 评论 -
双向链表的快速排序 -- C语言
算法草稿代码实现/* head 和 tail 的指针的排序的时候,都有可能发生变化,所以这里使用二级指针 */int quickSortDoubList(st_doubNode** phead, st_doubNode ** ptail){ if(NULL == phead || NULL == *phead || NULL == ptail || NULL == *ptail)...原创 2020-02-18 23:24:37 · 1471 阅读 · 0 评论 -
双向链表节点的删除 -- C语言
代码实现st_doubNode * removeDoubListNode(st_doubNode** phead, int pos){ if(NULL == phead || pos < 0){ printf("%s: param error\n",__func__); return NULL; } st_doubNode * head = *phead; st_do...原创 2020-02-18 19:03:56 · 1407 阅读 · 0 评论 -
双向链表按照指定位置插入 -- C语言
代码实现void dumpDoubListReverse(st_doubNode * head){ if(NULL == head){ return; } st_doubNode * p = NULL; st_doubNode * tail = NULL; tail = head; while (NULL != tail->next){ tail = tail...原创 2020-02-18 17:02:44 · 1719 阅读 · 0 评论 -
双向链表按位置查找 -- C语言
代码实现st_doubNode * findDoubListPos(st_doubNode * head, int pos){ if(NULL == head || pos < 0){ return NULL; } if(0 == pos) { return head; } st_doubNode * p = NULL; st_doubNode * q = NU...原创 2020-02-18 16:06:33 · 257 阅读 · 0 评论 -
双向链表的查找 -- C语言
代码实现st_doubNode* searchDoubListNode(st_doubNode* head, int num){ if(NULL == head){ return NULL; } st_doubNode* p = NULL; st_doubNode* q = NULL; p = head; while(NULL != p){ if(p->data...原创 2020-02-18 14:20:00 · 1092 阅读 · 0 评论 -
打印双向链表 -- C语言
代码实现void dumpDoubList(st_doubNode * head){ if(NULL == head){ return; } st_doubNode * p = NULL; printf("========= Dump Double List %p ===========\n\t", head); p = head; while (NULL != p){...原创 2020-02-18 14:03:47 · 960 阅读 · 0 评论 -
取得双向链表长度 -- C语言
代码实现int getDoubListLen(st_doubNode * head){ int len = 0; st_doubNode * p = NULL; if(NULL == head){ goto out; } p = head; while(NULL != p){ len++; p = p->next; } out: return le...原创 2020-02-18 13:17:30 · 1230 阅读 · 0 评论 -
双向链表的建立 -- C语言
代码实现void dumpDoubList(st_doubNode * head){ if(NULL == head){ return; } st_doubNode * p = NULL; printf("========= Dump Double List %p ===========\n\t", head); p = head; while (NULL != p){...原创 2020-02-18 13:06:02 · 239 阅读 · 0 评论 -
约瑟夫问题 -- C语言
问题描述据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k...原创 2020-02-17 20:30:45 · 766 阅读 · 0 评论 -
合并有序链表 -- C语言
算法草稿代码实现int MergeSortedList(st_dataNode ** phead, st_dataNode * head2){ if(NULL == phead || NULL == *phead || NULL == head2){ printf("%s: param error\n",__func__); return PARAM_ERR; } ...原创 2020-02-17 16:55:21 · 339 阅读 · 0 评论 -
测试链表是否打环 -- C语言
原理这里 有一个 比较 简单 的 解法。 设置 两个 指针 p1、 p2。 每次 循环 p1 向前 走 一步, p2 向前 走两步。 直到 p2 碰到 NULL 指针 或者 两个 指针 相等 时 结束 循环。 如果 两个 指针 相等, 则 说明 存在 环。代码实现bool whetherListLoop(st_dataNode * head){ if(NULL == head){ ...原创 2020-02-16 22:52:18 · 162 阅读 · 0 评论 -
链表插入排序 -- C语言
这里使用插入排序法,因为插入排序法涉及有序区域的后移,所以比较适合使用链表进行做。因为单链表没有prev的默认指针,所以不方便使用快速排序法。综合选择了插入排序算法草稿代码实现int insertSortList(st_dataNode** phead){ if(NULL == phead || NULL == *phead){ printf("%s: param erro...原创 2020-02-16 22:03:19 · 474 阅读 · 0 评论 -
查找链表中间节点 -- C语言
算法思路1. 求链表总长度,取得一半数,遍历链表一半的数量,取得中间节点2. 用两个指针,一个每次都移动一回,一个每两次移动一回,当第一个指针遍历完链表,后一个指针就正好指向中间代码实现1st_dataNode * getListMidNode(st_dataNode * head){ if(NULL == head){ printf("%s: param error\n"...原创 2020-02-16 17:06:02 · 1056 阅读 · 0 评论 -
链表的逆置 -- C语言
这里有一点主意的,操作接口传递的是头指针的指针,因为逆置后,链表头会发生改变,所以需要传递双重指针,以便接收新的链表头地址代表实现int reverseList(st_dataNode** phead){ if(NULL == phead || NULL == *phead){ printf("%s: param error\n",__func__); return PARAM...原创 2020-02-16 16:25:58 · 257 阅读 · 0 评论 -
链表删除指定位置节点 -- C语言
这里有个小技巧,容易错误。传入的是个双重指针st_dataNode** phead,因为删除在首节点的位置时候,链表头的位置会发生改变,指向新的节点,所以需要传入双重指针,以便接收修改的新的链表头的位置代码实现st_dataNode * removeListNode(st_dataNode** phead, int pos){ if(NULL == phead || pos <...原创 2020-02-15 23:44:43 · 1391 阅读 · 0 评论 -
在链表的指定位置插入节点 -- C语言
这里有个小技巧,容易错误。传入的是个双重指针st_dataNode** phead,因为插入在首节点的位置时候,链表头的位置会发生改变,指向新的节点,所以需要传入双重指针,以便接收修改的新的链表头的位置代码实现/* * 传入head是二重指针,是因为插入头结点的时候,会改变head的指向到新的节点 */st_dataNode * insertListNode(st_dataNod...原创 2020-02-15 22:06:47 · 3521 阅读 · 0 评论 -
查找链表指定位置的节点 -- C语言
代码实现st_dataNode* findListPos(st_dataNode* head, int pos){ if(NULL == head || pos < 0){ return NULL; } if(0 == pos) { return head; } st_dataNode * p = NULL; st_dataNode * q = NULL; i...原创 2020-02-15 21:19:12 · 2574 阅读 · 0 评论 -
单链表数值查找 -- C语言
代码实现st_dataNode* searchListNode(st_dataNode* head, int num){ if(NULL == head){ return NULL; } st_dataNode* p = NULL; st_dataNode* q = NULL; p = head; while(NULL != p){ if(p->data == ...原创 2020-02-15 20:47:48 · 448 阅读 · 0 评论 -
单链表打印
代码实现void dumpList(st_dataNode * head){ if(NULL == head){ return; } st_dataNode * p = NULL; printf("========= Dump List %p ===========\n\t", head); p = head; while (NULL != p){ printf("...原创 2020-02-15 19:59:02 · 941 阅读 · 0 评论 -
单链表的测长 -- C语言
代码实现int getListLen(st_dataNode* head){ int len = 0; st_dataNode * p = NULL; if(NULL == head){ goto out; } p = head; while(NULL != p){ len++; p = p->next; } out: return len;}...原创 2020-02-15 19:52:43 · 195 阅读 · 0 评论 -
创建链表 -- C语言
这个问题很简单,只有一个地方处理需要很注意:首节点的处理和尾结点处理假设:head 为链表头,p 指向链表当前处理的节点。这个时候,如果只有一个节点,那么特征是: head->next = NULL,我们可以通过这个条件判断是否是头结点处理,处理完 p=head,但是下一个循环会发现的时候 head->next 依然是空;所以这里需要一点小技巧来进行处理了,我们让 p->ne...原创 2020-02-15 19:35:03 · 116 阅读 · 0 评论