- 博客(19)
- 收藏
- 关注
原创 strcat()和strncat()详解和实现原理
函数原型:char *strcat(char *dest, const char *src);char *strncat(char *dest, const char *src, size_t n)strcat 将src的内容追加到dest的尾部,将dest的’\0’覆盖并在结尾加上’\0’,需要满足dest能容下src,不然会产生越界strncat将src的n个字符追加到dest尾部,若追加的字符的最后一个字符是’\0’则不需要在后面追加’\0’,若最后一个字符不是’\0’则需要将后面一个字符变成
2021-06-22 17:02:46
723
原创 关于库函数中的memchr()和strchr()函数的区别
先看两个函数的申明:void *memchr(const void *s, int c, size_t n) ;库函数中对其的解释:The memchr() function scans the initial n bytes of the memory area pointed to by s for the first instance of c.Both c and the bytes of the memory area pointed to by s are interpreted a
2021-06-21 17:22:55
400
转载 为指针的指针分配内存
前言:本人在学习数据结构的过程中,遇到了散列这种数据结构,在使用分离链表发构建散列的过程中,需要用到为指针的指针动态分配内存空间,所以本人写了一个C语言的Demo程序来先测试这一行为 问题如图 #include "stdafx.h"//输出数组测试void PrinT(i...
2021-06-08 10:18:05
681
转载 memset()函数
文章目录 一、前言二、函数作用三、效率对比四、误区总结1、按字节设置2、设置的值只有最低字节有效3、堆内存不可直接 sizeof 取首地址4、传参数组不可直接 sizeof 取首地址 一、前言 memset 作为对内存初始化的函数,还是有不少坑和误区的,今天...
2021-06-07 12:55:52
463
原创 C语言实现链栈
链栈与单链表类似,区别在于其相关操作只能在栈顶操作#include <stdio.h>#include <stdlib.h>//栈的链存储//栈的一个节点typedef struct stackNode{ int data; struct stackNode *next;}LinkStackPtr;//构造一个栈:栈顶指针和栈底指针typedef struct{ LinkStackPtr *top; //指向栈顶的指针 Li
2021-06-04 17:15:35
115
原创 C语言希尔排序
希尔排序就是在插入排序的基础上将排序数列进行某个增量的分组然后在分组下进行插入排序,直到增量为1的时候,此时由于经过多次分组的插入排序,基本上顺序已经有序,可交换的数据很少,执行效率很高。#include <stdio.h>void shellsort(int *arr, int n){ int i; int j; int temp; int increment = n-1; do { increment = inc
2021-06-04 13:30:12
124
转载 快速排序实现
假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列。3 1 2 5 4 6 9 7 10 8 在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位置,假设这个位置是k。现在
2021-06-03 15:21:07
176
转载 C语言希尔排序
void shell_insert(int *a, int n){ int gap; int i; int temp; int k; int j; for (gap = gap / 2; gap > 0; gap /= 2) //划分步长 { for (i = 0; i < gap; i++) //每次分组的第一个元素 { for (j = i + gap; j < n; j
2021-06-03 13:28:32
117
原创 C语言实现二分查找
二分查找的前提是有序表,思路是若查找的数小于arr[mid],则继续在[low,mid-1]中查找,若大于则在[mid+1,high]中查找,依次类推#include <stdio.h>int Binary_Search(int *arr, int n, int data){ int low; int high; int mid; low = 0; high = n-1; while (low <= high) {
2021-06-01 15:04:11
194
原创 C语言实现双向循环链表
注意结束的判断条件是尾指针指向头,直接上代码,简单明了基本操作的函数都已给出,自己可以写个主函数进行测试。#include <stdio.h>#include <stdlib.h>#include <string.h>//节点类型typedef struct circular_list_node{ int data; struct circular_list_node *next; struct circular_list_node
2021-05-31 20:23:06
192
原创 C语言实现双向链表
双向链表与单链表基本上类似,只是在删除和插入时有所不同因为其一个节点中多了一个指向其前驱的头指针,注意在插入和删除一个元素时,通用的插入和删除操作对最后一个元素不起作用,即不能在最后一个元素的后面继续插入元素(能通过尾插法插入),不能删除最后一个元素(能通过查找到最后一个元素,直接将其释放),在双向链表的创建时,若用头插法,需要注意第一个节点元素的插入与后续的节点插入的方法不一样,因为第一个节点元素在插入时并没有后继元素。#include <stdio.h>#include <stdl
2021-05-31 17:34:55
374
原创 C语言实现循环链表
循环链表与单链表基本一样,就是最后的尾指针指向头就可以//节点类型typedef struct circular_list_node{ int data; struct circular_list_node *next;} LinkList;//初始化循环链表为空LinkList *InitCircularList(LinkList *CList){ CList = (LinkList *)malloc(sizeof(LinkList)); if (!CL
2021-05-31 10:47:47
729
原创 C语言实现单链表基本操作
单链表基本的操作有增删改查:基本操作代码如下:初始化:typedef struct list_node{ int data; struct list_node *next;} LinkList;//初始化单链表L为空--头结点,即创建头结点LinkList *ListInit(LinkList *L){ L = (LinkList *)malloc(sizeof(LinkList)); if (!L) { exit(-1);
2021-05-28 10:45:33
245
原创 C语言实现链队列
链队列和单链表相似,在单链表的基础上增加了两个头尾指针,且元素的删除和增加按照循环队列规则。//队列链表结构的节点typedef struct node{ int data; struct node *next;} Q_node;//链表结构(头尾指针)typedef struct List{ Q_node *front; Q_node *rear;} ListQueue;初始化操作:ListQueue *InitListQueue(ListQue
2021-05-28 09:22:43
752
原创 C语言实现循环队列
循环队列遵循的条件是先进先出,有两个标记指针,头和尾,规则是最开始空队列时头和尾指针都标记为0,有元素进入时,尾指针就向前移动,有元素出队时就将头指针向前移动。直到当前队列的最大位置时,此时数组存的元素最多只能有MAX_SIZE-1个,因为尾指针需要占一个位置。所以一个有十个位置的数组,作为循环队列时,队满时只能存9个数据#define MAX_SIZE 10typedef struct { int data[MAX_SIZE]; int front; int r
2021-05-28 09:05:09
1960
原创 直接插入排序
举例:{5,3,4,6,2} 从第二个数值开始比较第一次:{5},3 < 5,则将3插到5之前第二次:{3,5},4 < 5,则将4插入到3和5之间第三次:{3,4,5},6 > 5,不需要进行插入第四次:{3,4,5,6},2 < 6,依次将数据往后移,找到2 < 3的位置代码:/************************************************* 直接插入排序 书上的思路:将一个记录插入到已经排好序的有序表中,从而得到一个新
2021-05-22 15:44:08
130
原创 冒泡排序优化
冒泡排序的思想是:相邻两个数进行比较,如果反序则进行交换(注意:是从数组的尾部进比较,冒泡冒泡,从底下往上冒),但是会有这种情况出现:需要排序的数组为:{2,1,3,4,5,6,7},当从小到大排序时,当i = 0时,进行第一次循环比较,循环后的结果时:{1,2,3,4,5,6,7},可以看出,已经正序,顾后续的比较都没有意义,在代码中加一个标记的变量,当有数据交换时证明下一轮循环可能还需要进行比较,当没有数据交换时说明此次循环已经实现正序,后续循环并不需要,结束掉。代码如下:void BubbleS
2021-05-22 10:51:00
129
原创 数据结构中的选择排序实现
简单的选择排序工程选择排序的思路比较简单:从大到小排,将第一个数后面的数依次与其相比较,如果比它大就交换数值main.c#include "selection sort.h"#include <stdio.h>int main(){ int num; int i; int *p; int arr[1024]; //开个数组,存储要进行排序的数 p = arr; printf("请输入数的个数:"); scan
2021-05-21 16:39:08
139
原创 关于TODO注释的内容
TODO注释可以用于标记未完成的代码,当你的工程代码较多,遇到某处代码当前不能完成,可以用TODO注释,后续可以直接定位到此处。在VScode中用TODO注释需要下载两个插件:TODOHighLight和TODOTree,TODOHighLight可以实现TODO注释的高亮,TODOTree可以在左侧工具中快速定位到TODO注释。注意,下载插件完成后记得重启软件。...
2021-05-18 15:34:36
750
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人