
C语言
悲伤的程序员
这个作者很懒,什么都没留下…
展开
-
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 · 728 阅读 · 0 评论 -
关于库函数中的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 · 406 阅读 · 0 评论 -
为指针的指针分配内存
前言:本人在学习数据结构的过程中,遇到了散列这种数据结构,在使用分离链表发构建散列的过程中,需要用到为指针的指针动态分配内存空间,所以本人写了一个C语言的Demo程序来先测试这一行为 问题如图 #include "stdafx.h"//输出数组测试void PrinT(i...转载 2021-06-08 10:18:05 · 686 阅读 · 0 评论 -
memset()函数
文章目录 一、前言二、函数作用三、效率对比四、误区总结1、按字节设置2、设置的值只有最低字节有效3、堆内存不可直接 sizeof 取首地址4、传参数组不可直接 sizeof 取首地址 一、前言 memset 作为对内存初始化的函数,还是有不少坑和误区的,今天...转载 2021-06-07 12:55:52 · 469 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 · 127 阅读 · 0 评论 -
冒泡排序优化
冒泡排序的思想是:相邻两个数进行比较,如果反序则进行交换(注意:是从数组的尾部进比较,冒泡冒泡,从底下往上冒),但是会有这种情况出现:需要排序的数组为:{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 阅读 · 0 评论 -
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 · 118 阅读 · 0 评论 -
直接插入排序
举例:{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 · 131 阅读 · 0 评论 -
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 阅读 · 0 评论 -
C语言实现双向链表
双向链表与单链表基本上类似,只是在删除和插入时有所不同因为其一个节点中多了一个指向其前驱的头指针,注意在插入和删除一个元素时,通用的插入和删除操作对最后一个元素不起作用,即不能在最后一个元素的后面继续插入元素(能通过尾插法插入),不能删除最后一个元素(能通过查找到最后一个元素,直接将其释放),在双向链表的创建时,若用头插法,需要注意第一个节点元素的插入与后续的节点插入的方法不一样,因为第一个节点元素在插入时并没有后继元素。#include <stdio.h>#include <stdl原创 2021-05-31 17:34:55 · 377 阅读 · 0 评论 -
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 · 1964 阅读 · 0 评论