数据结构
文章平均质量分 53
描述常见的数据结构,并使用C语言实现。
每天进步一点丶
这个作者很懒,什么都没留下…
展开
-
【数据结构】编写函数,使用非递归算法,求二叉链表表示的二叉树的高度
【数据结构】编写函数,使用非递归算法,求二叉链表表示的二叉树的高度原创 2023-02-18 10:06:28 · 106 阅读 · 0 评论 -
【数据结构】编写函数,使用非递归算法,求二叉链表表示的二叉树的高度
1.算法思想使用层序遍历+队列实现求二叉树的高度。2.定义结构体typedef struct BiNode { int data; struct BiNode* lchild; struct BiNode* rchild;} BiNode,*BiTree;3.函数实现int getLevel(BiTree T) { if(!T) { return 0; } //level表示层数,front,rear表示队头队尾,last表示每层原创 2023-03-02 20:56:30 · 368 阅读 · 1 评论 -
【数据结构】选择排序-堆排序
1.算法思想首先从最后一个非叶子结点进行调整,将该结点及其左右子结点的最大值存入该结点中。然后交换堆顶和最后一个数据,再从堆顶开始进行调整,直到全部完成。2.测试结果3.完整代码#include <malloc.h>#include <stdio.h>#define MAXSIZE 20//大顶堆void adjustHeap(int a[], int k, int len) { int left = 2*k+1, right = 2*k+2;//左右结点原创 2023-05-04 17:20:43 · 384 阅读 · 0 评论 -
【数据结构】选择排序-简单选择排序
【数据结构】选择排序-简单选择排序原创 2023-05-01 10:58:11 · 272 阅读 · 1 评论 -
【数据结构】选择排序-快速排序
【数据结构】选择排序-快速排序原创 2023-04-20 18:56:47 · 156 阅读 · 0 评论 -
【数据结构】选择排序-冒泡排序
【数据结构】选择排序-冒泡排序原创 2023-04-15 11:10:43 · 268 阅读 · 0 评论 -
【数据结构】插入排序-希尔排序
1.算法思想希尔排序类似于直接插入排序,不同之处在于其排序使用到了增量。使用增量能够以增量为步长的数据进行排序。最后在进行一次增量为1的排序,即为直接插入排序,该趟排序时数据已经基本有序。希尔排序的关键是选取每趟排序的增量大小。2.测试结果//测试数据int a[]= {49,38,65,97,76,13,27,49};//增量int delta[] = {5,3,1};结果如下:3.完整代码#include <stdio.h>#include <malloc.h原创 2023-03-30 15:43:04 · 307 阅读 · 0 评论 -
【数据结构】插入排序-直接插入排序
【数据结构】插入排序-直接插入排序原创 2023-03-22 09:51:17 · 272 阅读 · 0 评论 -
【数据结构】图的广度优先遍历
文章目录1.算法思想2.定义结构体3.函数实现4.测试结果5.完整代码1.算法思想广度优先遍历,类似于树的层次遍历,又是熟悉的队列实现。首先将第一个顶点添加到队列中,然后讲该顶点的所有邻接顶点都加入队列中,再将该顶点输出。如此重复直到遍历完整个图。2.定义结构体typedef struct { char vertex[VERTEXNUM]; int edge[VERTEXNUM][VERTEXNUM]; int n,e;} MGraph;3.函数实现Q:队列,用于存原创 2023-03-20 15:30:42 · 1703 阅读 · 1 评论 -
【数据结构】图的深度优先遍历
【数据结构】图的深度优先遍历原创 2023-03-18 09:15:08 · 902 阅读 · 0 评论 -
【数据结构】设一棵树T,用二叉链表表示。编写函数,给定树中结点p,求p的双亲结点
1.算法思想使用层序遍历+队列实现该功能。孩子兄弟表示法能够有效的知道某个结点的所有孩子,因此使用层序遍历时:获取队头结点,将该结点的所有孩子都入队。入队时判断是否为目标结点,如果是则返回该队头结点,否则将该队头结点处理完后继续处理该队头结点的兄弟结点,方法与前面一致。2.定义结构体使用二叉链表(孩子兄弟表示法)存储树的结构。typedef struct BiNode { char data; struct BiNode *firstChild; struct BiNod原创 2023-03-15 10:59:42 · 803 阅读 · 0 评论 -
【数据结构】设二叉树T使用二叉链表表示,编写函数,求二叉树的最大宽度
1.算法思想使用层序遍历+队列实现。首先将根结点入队,之后将队头元素出队,然后判断其左右孩子是否存在,如果存在则入队。当访问到最后一个结点时,已经将下一层的结点都入队。判断当前最大宽度与下一层的宽度,取较大值作为新的宽度。循环上述步骤,直到将该二叉树遍历完成。2.定义结构体typedef struct BiNode { int data; struct BiNode* lchild; struct BiNode* rchild;} BiNode,*BiTree;3.函数原创 2023-03-09 08:45:32 · 389 阅读 · 0 评论 -
【数据结构】设有n个学生成绩(0-100的整数)的顺序结构线性表L,编写函数,将该线性表调整为成绩及格(>=60)在不及格之前,要求T(n)=O(n),S(n)=O(1)
1.算法思想使用头尾指针。头指针从头遍历,当遇到及格的数据时继续遍历,否则与当前尾指针进行数据交换。有如下几种情况:a[i] >= 60:直接i++,查看下一个数据。a[i] < 60 && a[j] >= 60:a[i]与a[j]交换数据,此时a[j]<60,然后j–;a[i]>=60,下次判断时i++。a[i] < 60 && a[j] < 60:a[i]与a[j]交换数据,此时a[j]<60,然后j–;a[i]&原创 2023-03-11 14:33:26 · 492 阅读 · 0 评论 -
【数据结构】已知一棵二叉链表表示的二叉树T,编写函数,判断T是否为完全二叉树
1.算法思想根据完全二叉树定义,将队头元素出队并判断其左右孩子情况。根据不同情况来分析起是否为完全二叉树。2.定义结构体typedef struct BiNode { int data; struct BiNode* lchild; struct BiNode* rchild;} BiNode,*BiTree;3.函数实现使用层序遍历+队列实现。首先根据队头结点判断其左右孩子是否存在,有如下情况:左右孩子都存在: 将左右孩子入队。左孩子不存在,右孩子存在:很明显不原创 2023-03-06 08:44:38 · 429 阅读 · 0 评论 -
【数据结构】设二叉树T用二叉链表结构存储,元素值为整数且互不相同,对给定的2个整数,若2个都不是T的元素,输出-2;若一个不是T的元素,输出-1;若2个都是T的元素,输出两者所在的层数的间隔数。
1.算法思想使用层序遍历+队列实现该功能。每次都将队列的队头元素出队,将其左右孩子入队。同时判断出队元素是否等于要求的整数a,b。如果等于某个值,则将当前层数的值赋值给该元素所在层数。每次将该层的最后一个结点出队处理后将当前层数+1。最后判断a,b的层数是否修改过,然后返回相应结果。2.定义结构体typedef struct BiNode { int data; struct BiNode* lchild; struct BiNode* rchild;} BiNode,*Bi原创 2023-03-03 14:47:04 · 468 阅读 · 0 评论 -
【数据结构】设二叉树T,用二叉链表结构存储。编写函数,输出最长一支(根到叶子)上的所有结点值
1.算法思想使用非递归后序遍历+栈实现。设置当前工作指针p和上一次访问结点visitedNode,使用栈s保存当前正在遍历的结点,栈l保存最长分支。先移动至最左下结点,然后判断是否还有右子树。如果有则继续访问,否则输出当前栈顶元素,如果是叶子结点则判断是否为最长分支,最后修改visitedNode和p,继续对其余元素进行同样的操作。2.定义结构体typedef struct BiNode { int data; struct BiNode* lchild; struct BiN原创 2023-03-01 09:38:38 · 851 阅读 · 0 评论 -
【数据结构】设有一家谱树,使用孩子兄弟(二叉链表)表示,编写函数,输出家谱中有多少代以及最后一代人数和成员名字
【数据结构】设有一家谱树,使用孩子兄弟(二叉链表)表示,编写函数,输出家谱中有多少代以及最后一代人数和成员名字原创 2023-02-28 19:14:06 · 1322 阅读 · 1 评论 -
【数据结构】非递归实现二叉树的后序遍历
【数据结构】非递归实现二叉树的后序遍历原创 2022-07-30 16:08:18 · 2371 阅读 · 1 评论 -
【数据结构】非递归实现二叉树的中序遍历
【数据结构】非递归实现二叉树的中序遍历原创 2022-07-29 15:37:10 · 3578 阅读 · 2 评论 -
【数据结构】非递归实现二叉树的先序遍历
非递归实现二叉树的先序遍历原创 2022-07-28 17:26:01 · 4357 阅读 · 2 评论 -
【数据结构】设一个带头结点的单链表L,大部分元素为正数,少数为负数,编写函数,采用高效的算法调整链表,实现将负数结点移到链表尾部,并返回调整后链表中第一个负数结点的位置。
1. 算法思路使用尾插法实现该要求。实现按步骤为:定义工作指针tail和minus,分别指向正数的最后一个结点以及负数的头结点。循环遍历链表,将结点使用尾插法插入正结点的末尾。如果插入的是正结点,则移动tail;如果是负结点,则移动minus。2.定义结构体typedef struct LNode { int data; struct LNode *next;} LNode, *LinkList;3.函数实现定义工作指针:p: 用于遍历单链表tail: 指向正数原创 2023-02-27 15:07:52 · 1167 阅读 · 0 评论 -
【数据结构】设L为带头结点的单链表,数据为整型。编写函数,删除重复结点(具有多个相同值的结点只保留一个)
文章目录1.算法思想2.定义结构体3.函数实现4.测试结果5.完整代码1.算法思想对于删除单链表重复结点的问题,最简单的方法就是设置一个前驱指针:遍历链表和当前值进行比较判断是删除结点还是跳过该结点,比较下一个结点由于设置了前驱结点,因此进行结点的删除将比较简单2.定义结构体定义链表结构体typedef struct LNode { int data; struct LNode *next;} LNode, *LinkList;3.函数实现设置三个工作指针即可实现原创 2023-02-23 19:12:16 · 2948 阅读 · 0 评论 -
【数据结构】A、B为递减有序的单链表,编写函数,将它们合并成递增有序的单链表,相同元素值只保留一个结点
文章目录1.算法思路2.定义结构体3.定义函数3.1 创建单链表3.2 合并单链表4.测试结果5.完整代码1.算法思路将两单链表合并,常用的方法是归并排序。每次比较两个链表的当前结点值,选择较大的结点值进行插入操作。由于是将递减有序的链表变为递增有序的链表,那么可以考虑使用头插法,每次归并排序比较完成后将更大值的结点插入到已排序链表中,然后移动排序链表的头指针指向该结点。2.定义结构体typedef struct LNode { int data; struct LNode *原创 2023-02-25 15:58:30 · 1487 阅读 · 0 评论 -
【数据结构】调整数据元素为(a1,a2,...,an)的单链表,使得数据元素次序为(a1,a3,...an,...,a4,a2),要求T(n)=O(n)
【数据结构】调整数据元素为(a1,a2,...,an)的单链表,使得数据元素次序为(a1,a3,...an,...,a4,a2),要求T(n)=O(n)原创 2023-02-22 14:19:04 · 347 阅读 · 0 评论 -
【数据结构】对单链表进行简单选择排序,使结点元素递增
文章目录1.算法思想2.定义结构体3.函数实现4.测试用例5.完整代码1.算法思想循环创建单链表使用简单选择排序找到当前最小的结点的值交换最小值与当前值重复2,3两步,直到排序完成2.定义结构体只使用到单链表的数据结构:data: 存放数据元素next: 用于指向下一个结点的指针typedef struct LNode { int data; struct LNode *next;} LNode, *LinkList;3.函数实现工作指针:min: 指原创 2023-02-20 09:29:31 · 3540 阅读 · 0 评论 -
【数据结构】已知A和B两个带头结点的递增链表,将A删减使其成为A与B的交集,并递减有序
【数据结构】已知A和B两个带头结点的递增链表,将A删减使其成为A与B的交集,并递减有序原创 2023-02-19 10:43:49 · 450 阅读 · 0 评论 -
【数据结构】先序遍历+中序遍历创建二叉树(C++实现)
创建如图所示的二叉树。先序遍历为:ABDGECF中序遍历为:DGBEAFC创建结构体定义二叉树中每个结点的数据,以及左右孩子。typedef struct BiNode { char data; //结点数据 struct BiNode *lchild, *rchild; //左右子树指针} BiNode, *BiTree;先序遍历按照根->左->右的顺序递归遍历二叉树,并打印输出。//先序遍历void Pre原创 2022-05-25 19:37:28 · 4054 阅读 · 0 评论 -
【数据结构】先序遍历使用#号法创建二叉树(C++实现)
定义树的结构//定义树的结构typedef struct BiNode { char data; //结点数据 struct BiNode *lchild, *rchild; //左右子树指针} BiNode, *BiTree;先序遍历创建二叉树void InCreateTree(BiTree &T) { char ch; cin >> ch; //判断是否为# if (ch !=.原创 2022-05-16 09:48:31 · 1828 阅读 · 1 评论 -
【数据结构】C语言实现单链表
C语言实现单链表结构体定义typedef struct LNode { int data; struct LNode *next;} LNode, *LinkList; // LNode表示节点,LinkList表示单链表函数声明LinkList headInsertList(LinkList L);LinkList tailInsertList(LinkList L);bool insertNextNode(LNode *p, int e);bool insertPrio原创 2022-04-17 20:48:06 · 789 阅读 · 0 评论 -
【数据结构】使用C语言实现顺序表
定义结构体//结构体typedef struct { int *data; //动态分配的指针 int maxsize; //顺序表的最大容量 int length; //静态顺序表的当前长度} SeqList;此处声明函数//声明基本操作void initList(SeqList *L);void increaseSize(SeqList *L);int getLength(SeqList L);int locateElem(SeqList L, int原创 2022-04-14 18:24:59 · 2318 阅读 · 0 评论