数据结构学习
数据解构学系总结
Flying`
这个作者很懒,什么都没留下…
展开
-
排序——归并排序的非递归算法
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<malloc.h>void MergeSortNonR(int* a, int n){ int* tmp = (int*)malloc(sizeof(int)*n); int gap = 1; // 每组数据个数 while (gap < n) { for (int i = 0; i < n; i += 2 * gap) {原创 2021-11-22 18:25:51 · 889 阅读 · 0 评论 -
排序——快排的非递归算法
代码一览:stack.h#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdbool.h>#include<stdlib.h>#include<assert.h>typedef int STDataType;typedef struct Stack{ STDataType *a; int top; int capacity;}ST;void StackIn原创 2021-11-22 17:14:07 · 1075 阅读 · 1 评论 -
排序——归并排序
1.归并思路:2.代码实现#include<stdio.h>#include<malloc.h>void _MergeSort(int *a,int* tmp, int left, int right){ if (left >= right) { return;//递到区间只有一个元素时,即left=right时,即可返回; } int mid = (left + right) >> 1; _MergeSort(a, tmp, left,原创 2021-11-16 17:15:03 · 830 阅读 · 2 评论 -
排序——冒泡排序
1.思路:2.代码实现#include<stdio.h>void Swap(int* p1, int* p2){ int tmp = *p1; *p1 = *p2; *p2 = tmp;}void BubbleSort(int* a, int n){ int i = 0; int j = 0; for (j = 0; j < n; j++) { int exchange = 0; for (i = 1; i < n - j; i++) {原创 2021-11-15 12:28:35 · 853 阅读 · 0 评论 -
排序——直接选择排序
1.思路:<1> 整体分析:<2> 特殊情况:begin = maxi2.代码实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void Swap(int *a, int *b){ int tmp = *a; *a = *b; *b = tmp;}void SelectSort(int*a, int n){ int begin = 0; int end = n - 1; int i原创 2021-11-15 11:43:40 · 378 阅读 · 3 评论 -
排序——快速排序
1.挖坑思路:2.整体思路:分治思想——while(begin>=end)返回3.代码实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void PrintArray(int* a, int n){ for (int i = 0; i < n; ++i) { printf("%d ", a[i]); } printf("\n");}void QuickSort_1(int *a, int lef原创 2021-11-14 23:26:11 · 395 阅读 · 2 评论 -
排序——堆排序
1.基础知识2.过程分析<1> void AdjustDwon(int* a, int n, int root)向下调整算法分析:<2> void HeapSort(int* a, int n)排序部分分析:3.代码实现#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void Swap(int* p1, int* p2){ int tmp = *p1; *p1 = *p2; *p2 =原创 2021-11-14 22:05:54 · 559 阅读 · 1 评论 -
排序——希尔排序
**希尔排序的思路:先让数组先进行预排序,使数组接近有序然后直接插入排序**#include<stdio.h>void ShellSort(int* a, int n){ int gap = n; while (gap > 1) { gap = gap / 2; //gap=gap/3+1 int i = 0; for (i = 0; i < n - gap; i++)//注意:i<n-gap,但是i++ { int end =原创 2021-11-10 19:32:37 · 218 阅读 · 0 评论 -
排序——直接插入排序
思路一览代码实现#include <stdio.h>// 假设都用升序来讲,降序就是反过来void PrintArray(int* a, int n){ for (int i = 0; i < n; ++i) { printf("%d ", a[i]); } printf("\n");}// 插入排序// 时间复杂度是多少?O(N^2)// 什么情况下最坏?逆序 1+2+3+...+n-1// 什么情况下最好?顺序有序 O(N)void Ins原创 2021-11-10 12:44:45 · 211 阅读 · 0 评论 -
队列的基本操作(C语言)
一 . 队列的含义 以及 应用:1.含义:队列(queue)是在表的一端进行插入操作,另一端进行删除操作的线性表2.数据进出顺序为:先进先出,和日常排队打饭一样,先排队的先打饭离开。二. 队列的存储结构的选择:1.数组:选用数组来做栈的存储结构,因为要在两端都进行操作,所以避免不了挪动数据的这个弊端;2.单链表:使用单链表时,先来考虑下,是头插尾删,还是头删尾插 ,使用头插尾删时,每次入队时都得改变头指针的指向,比较麻烦,因此采用头删尾插;3.因此:综合分析采用 单链表的头删尾插 比较合适。三原创 2021-11-03 00:14:07 · 6358 阅读 · 7 评论 -
栈的基本操作(C语言)
一 . 栈的含义 以及 应用:1.含义:栈(stack)是限定仅在表的一段进行插入删除操作的线性表2.数据进出顺序为:先进后出,和弹夹压入的子弹一样,先压进去的最后才能射出;3.应用场景:网页浏览时的后退 编辑软件中的“撤销”;二. 栈的存储结构的选择:1.数组:选用数组来做栈的存储结构,只需要在数组末尾进行操作即可,完美的避开了数组操作中挪动数据的缺陷,显然可以选择数组来做栈的存储结构2.单链表:因为栈是在线性表的一段进行操作,所以得想想实在链表头操作,还是在链表尾操作。如果选用链表尾,原创 2021-11-02 10:57:44 · 4093 阅读 · 2 评论 -
串的基本概念和基本操作(C语言版)
串:即字符串;字串:串中任意个连续字符组成的子序列;1.串的顺序存储(1)静态数组实现(定长顺序存储):#define MAXLEN 255Typedef struct{char ch[MAXLEN];int length;}SString;(2)动态数组实现(堆分配存储):Typedef struct{char *ch;//按串长分配存储区,ch指向串的基地址int length;}HString;HString S;S.ch=(char*)malloc(MAXLEN*siz原创 2021-10-06 13:58:50 · 1825 阅读 · 0 评论 -
队列(循环队列)的基本操作 (C语言实现)
说明:这里循环队列的实现方式是 少用一个元素空间注意:队列时尾插头删1.入队分析:void EnQueue(SqQueue *Q, QElemType e)//循环队列入队{ if ((Q->rear+1) % MAXQSIZE == Q->front)//判断队满,当rear与front差一个空间的时候即为队满 { printf("队列已满,无法插入\n"); exit(-1); } printf("入队元素为:%d\n", e); Q->base[Q->原创 2021-08-30 23:03:36 · 2314 阅读 · 0 评论 -
顺序栈的基本操作(C语言实现)
一 .栈的含义 以及 应用:1.含义:栈(stack)是限定仅在表位进行插入删除操作的线性表2.数据进出顺序为:先进后出,和弹夹压入的子弹一样,先压进去的最后才能射出;3.应用场景:网页浏览时的后退 编辑软件中的“撤销”;二.代码展示:1.接口一览void InitStack(SqStack *s);//顺序栈的初始化void StackEmpty(SqStack S);//顺序栈判断栈是否为空void StackLength(SqStack S);//求顺序栈长度void Clea原创 2021-08-25 14:17:13 · 892 阅读 · 0 评论 -
顺序表(数组)和单链表的区别
1.存储形式上的区别:顺序表在物理上和逻辑上都是连续的单链表在物理上时不连续的,逻辑上是连续的2.空间上的区别:(1)顺序表一般有固定的空间大小,当空间不够时需要进行扩容,扩容时往往不能准确知道需要扩容的空间大小,很容易造成会造成空间浪费(2)单链表用一个空间申请一个空间,相比顺序表不那么浪费空间(并不是完全不浪费)总结:在存储数据时,如果知道具体空间大小,就用顺序表进行存储不知道具体空间大小,就用单链表3.时间上的区别:(1)随机插入元素,删除元素的时间复杂度:顺序表:时间复杂度为O(原创 2021-08-24 12:59:11 · 5367 阅读 · 0 评论 -
单链表基本操作
看:#include<stdio.h>#include<stdlib.h>typedef int SListDataType;//结点typedef struct SListNode{ SListDataType data; struct SListNode* next;}SListNode;SListNode* BuySListNode(SListDataType x){ SListNode* newNode = (SListNode*)malloc(si原创 2021-08-24 12:26:00 · 90 阅读 · 0 评论 -
双链表 实现查找,任意位置插入删除,链表的清理与销毁
看:#include<stdio.h>#include<stdlib.h>typedef int LTDataType;typedef struct ListNode{ struct ListNode* prev; struct ListNode* next; LTDataType data;}ListNode;ListNode* BuyListNode(LTDataType x)//申请一个结点{ ListNode* NewNode = (ListNode原创 2021-08-24 12:18:54 · 78 阅读 · 0 评论 -
数据结构 顺序表 实现增添删减
数据结构 顺序表 实现增添删减#include<stdio.h>#include<malloc.h>#include<stdlib.h>typedef int SLDateType;typedef struct SeqList{ SLDateType* a; int size;//有效数据个数· int capacity;//容量}SeqList;void SeqListInit(SeqList* ps)//初始化{ p原创 2021-08-06 19:52:44 · 97 阅读 · 0 评论 -
链表中进行“插入”,“删除”以及“初始化”时一级指针和二级指针的合理应用
1.首先,得明白指针的含义一个链表的 头指针 就是指向链表头节点的指针(即存储链表第一个结点的地址)指针变量就是存储地址的变量;如: int * p; 它的含义就是:p是指向一个数据类型为int型的指针(即p存储一个int型数据的地址)同理:ListNode *phead就表示phead是一个指向数据类型为 ListintNode (即phead存储一个ListNode 型数据的地址)型的指针;2.具体分析:(1)当链表为空时,对其进行插入或者初始化操作时,传入函数的变量应该为头指针的原创 2021-08-18 00:35:08 · 438 阅读 · 1 评论 -
数据结构 双链表 实现插入删除(C语言版)
看:#include<stdio.h>#include<stdlib.h>typedef int LTDataType;typedef struct ListNode{ struct ListNode* prev; struct ListNode* next; LTDataType data;}ListNode;ListNode* BuyListNode(LTDataType x)//申请一个新的结点{ ListNode* NewNode = (ListNo原创 2021-08-23 22:09:38 · 383 阅读 · 0 评论