
C语言
⁽⁽ଘ晴空万里ଓ⁾⁾
工作啦故不能及时解答大家的问题,希望大家可以在博客里互帮互助。
展开
-
数据结构系列6-队列
实现功能:创建队入队出队遍历队代码实现://队列:先进先出,使用单链表实现#include <stdio.h>#include <stdlib.h>//定义链表节点的结构体typedef struct node_st{ int data; struct node_st *next;}queue;/*函数声明部分*/queue *qu_create(); //创建队列void qu_enqueue原创 2021-11-30 21:27:01 · 202 阅读 · 0 评论 -
数据结构系列5-栈
实现功能:创建栈入栈出栈遍历栈代码实现://栈:先进后出,使用单链表实现栈#include <stdio.h>#include <stdlib.h>//定义栈的结构体typedef struct node_st{ int data; //数据域 struct node_st *next;//指针域}stack;/*函数声明部分*/stack *stack_create(); //栈的创建void原创 2021-11-30 20:31:31 · 311 阅读 · 0 评论 -
数据结构系列4-双循环链表
实现功能:双循环链表的创建双循环链表的插入(头插法、尾插法)双循环链表的删除双循环链表的遍历代码实现://双循环链表#include <stdio.h>#include <stdlib.h>//定义链表节点的结构体typedef struct node_st{ int data; //数据域 struct node_st *prev; //前驱指针 struct node_st *next; //后继指针}list;/*原创 2021-11-17 22:40:28 · 582 阅读 · 0 评论 -
数据结构系列3-双链表
实现功能:双链表的创建双链表的插入(头插法、尾插法)双链表的删除双链表的遍历代码实现://双链表#include <stdio.h>#include <stdlib.h>//定义链表节点的结构体typedef struct node_st{ int data; //数据域 struct node_st *prev; //前驱指针 struct node_st *next; //后继指针}list;/*函数声明部分*/li原创 2021-11-17 15:46:55 · 605 阅读 · 0 评论 -
数据结构系列2-单循环链表
实现功能:单循环链表的创建单循环链表的插入(头插法、尾插法)单循环链表的删除单循换链表的遍历代码实现://单循环链表#include <stdio.h>#include <stdlib.h>//定义链表节点的结构体typedef struct node_st{ int data; //数据域 struct node_st *next; //指针域}list;/*函数声明部分*/list *list_create();原创 2021-11-16 18:56:32 · 295 阅读 · 0 评论 -
数据结构系列1-单链表
实现功能:单链表的创建单链表的插入(头插法、尾插法)单链表的删除单链表的遍历代码实现:/*有头节点的单链表*/#include <stdio.h>#include <stdlib.h>//定义链表节点的结构体typedef struct node_st{ int data; struct node_st *next;}list;/*函数声明部分*/list *list_create(); //链原创 2021-11-16 17:05:40 · 306 阅读 · 0 评论 -
计算一个字节里有多少位为1
代码实现如下:#include <stdio.h>int func(unsigned char byte);int main(){ int ret,byte; printf("输入1个字节大小以内的数:"); scanf("%d",&byte); ret = func(byte); printf("%p中1的个数是:%d\n",byte,ret); return 0;}int func(unsigned char byt原创 2021-11-10 16:06:07 · 1458 阅读 · 0 评论 -
求解素数问题
前言素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数示例代码1判断一个数是否是素数。#include <stdio.h>int main(){ int i,num; printf("请输入1个整数:"); scanf("%d",&num);//循环判断num能否被2~num-1的数整除 for(i=2;i<num||num<2;i++) { if(num%i==0||num原创 2021-10-31 19:53:26 · 501 阅读 · 0 评论 -
双向循环链表
前言适用性较广的双向环链。实现比较困难,主要看看怎么使用。代码的使用方法:移植llist.h和llist.c文件定义适合自己的结构体类型,比如struct score_st //用户的数据{ int id; char name[NAMESIZE]; int math; int chinese;};自定义一个打印函数,如:printf()括号里面根据实际情况修改。static void print_s(const void *record){原创 2021-10-31 15:42:23 · 200 阅读 · 0 评论 -
变长结构体
1、什么叫变长结构体?如下所示:struct var_st{ int len; char data[0]; //c99支持};sizeof(struct var_st)=4;注意:可能有的编译器不支持char data[0];需要用char data[1]代替,这样上面结构体大小是sizeof(struct var_st)=8(字节对齐);那结构体是怎么实现可变长的呢?如上所示,结构体中的最后一个元素是一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让原创 2021-10-31 10:29:47 · 1072 阅读 · 0 评论 -
结构体字节对齐
下面结构体变量data占多少字节?代码示例1# include <stdio.h>struct STUDENT{ char a; int b;}data;int main(void){ printf("%p, %p\n", &data.a, &data.b); //%p是取地址输出控制符 printf("%d\n", sizeof(data)); return 0;}输出结果结果分析输出并不是我们想象中的1+4原创 2021-10-31 09:25:33 · 169 阅读 · 0 评论 -
有头节点的单链表
程序源码/*带头节点的单链表*/#include <stdio.h>#include <stdlib.h>typedef int datatype; //类型重定义,方便以后修改变量类型typedef struct node_st{ datatype data; //数据域 struct node_st *next; //指针域}list;/*函数声明*/list *list_create(); //创建链表原创 2021-10-03 17:51:39 · 298 阅读 · 0 评论 -
指针的一些汇总
程序源码#include <stdio.h>#if 1int add(int x,int y){ return (x+y);}int main(){ //字符指针--指向字符的指针 char ch1 = 'w'; char *p = &ch1; const char *p2 = "abcdef";//p2存放字符a的地址 //指针数组-存放指针的数组 int *arr[10]; char *ch2[5];原创 2021-10-03 00:42:42 · 127 阅读 · 0 评论 -
字符数组和字符指针
程序源码#include <stdio.h>#include <string.h>int main(){#if 1 char *str = "hello";//字符指针指向一个字符串常量 printf("%d %d\n",sizeof(str),strlen(str));//8 5// strcpy(str,"world");//F,字符串常量"hello"不能被改变 str = "world"; //T,改变指针变量的指向原创 2021-09-26 18:21:06 · 141 阅读 · 0 评论 -
常见笔试题3
程序源码#if 1//说明了使用free释放掉一个指针内容后,//指针变量的值并不会改变,即不会改为NULL#include <stdio.h>#include <stdlib.h>int main(){ //申请空间 int *p = (int *)malloc(10*sizeof(int)); printf("申请空间p=%p\n",p);//申请空间p=0x1866010 //使用空间 /*.....*/ //释放空原创 2021-09-26 16:42:55 · 205 阅读 · 0 评论 -
常见笔试题2
程序源码#if 1/*题目名称:喝汽水问题题目内容:喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以喝多少瓶汽水(编程实现)*//* 钱 汽水 * 0 0+0=0 * 1 1+0=1 * 2 2+1=3 * 3 3+1+1=5 * 4 4+2+1=7 * 5 5+2+1+1=9 * m 2*m-1; * */#include <stdio.h>int main(){ int money = 0原创 2021-09-26 16:11:31 · 151 阅读 · 0 评论 -
常见笔试题1
程序源码#include <stdio.h>#if 1int main(){ int a[5] = {1,2,3,4,5}; int *ptr = (int *)(&a+1); //&a是整个数组的地址,(&a+1) 跳过整个数组的地址,指向5后面的那个地址 printf("%d,%d\n",*(a+1),*(ptr-1)); //2,5 return 0;}#endif#if 0#include <st原创 2021-09-26 15:48:04 · 146 阅读 · 0 评论 -
关于数组名
前言数组名的意义:sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。程序源码/*经典面试题*/#if 0#include <stdio.h>int main(){ //一维数组 int a[]={1,2,3,4}; printf("%d\n",sizeof(a)); //4*4 = 16 printf("%原创 2021-09-26 11:13:38 · 627 阅读 · 0 评论 -
函数指针的用法
前言什么是函数指针:函数指针的定义形象点来说,就是用一个指针变量代替原函数中的函数名位置。在定义函数指针时请注意:函数指针和它指向的函数的参数个数和类型都应该是—致的;函数指针的类型和函数的返回值类型也必须是一致的。函数指针的赋值:函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名就行了例如:函数指针:int (*p)(int);指针指向的是一个函数,这个函数的返回值是int,形参是int。程序源码/* 函数指针 int (*p) (int ,..);原创 2021-09-26 10:24:25 · 265 阅读 · 0 评论 -
函数指针数组
前言函数指针数组:int (*arr[N])(int);本质是数组,元素是指针,指针指向函数程序源码/*函数指针数组: 本质是数组,数组的元素是指针,指针指向函数 */#include <stdio.h>/*函数声明*/int add(int a,int b);int sub(int a,int b);int main(){ int i = 0; int a = 3,b = 5; int ret; //定义函数指针数组,该数组有两个元素,元素原创 2021-09-26 10:08:30 · 161 阅读 · 0 评论 -
main()函数的完整形式
前言初学C语言都觉得main作为整个程序的入口函数是不需要传递参数的,但事实上,我们完全可以给main()传入参数进而控制整个程序的执行。首先,主函数不能被其他函数调用,所以形参argc与argv的实际值就不能从其他函数传入,而是从操作系统命令行上获得的。因此这两个参数也被称为命令行参数。argc为命令行参数的个数,argv为字符串命令行参数的首地址。程序源码/*int main()函数的完整形式*/#include <stdio.h>//argc:参数个数,*argv:参数原创 2021-09-26 09:45:46 · 1166 阅读 · 0 评论 -
递归求阶乘
前言递归就是函数调用自身递归必须有结束条件,否则会栈溢出。原因:在一个函数中调用另一个函数,会将当前状态入栈,等执行完下一个后出栈,恢复状态继续往下执行。程序源码 /*递归求阶乘:n! = n*(n-1)! 压栈保存*/#include <stdio.h>/*函数声明*/int fact(int n);int main(){ int n; int res; printf("Input a number:"); scanf("%d",&a原创 2021-09-26 09:20:10 · 181 阅读 · 0 评论 -
拆分1个整数
要求用户输入一个整数,将这整数各个位拆开。代码实现/*拆分数字的各个位*/#include <stdio.h>/*函数声明*/void dig_split(int result[],int num); //数字拆分void my_printf(int result[],int count); //打印结果值/*全局变量*/static int count = 0; //输入数字的位数,方便打印int main(){ int num; int re原创 2021-09-26 08:19:27 · 236 阅读 · 0 评论 -
2维数组传参
前言2维数组形参设置:第一种形参为二维数组void my_printf(int arr[2][3],int row,int col);void my_printf(int arr[][3],int row,int col); 第二种形参为数组指针void my_printf(int (*arr)[3],int row,int col); 函数调用均为:my_printf(arr,row,col); 代码实现/*2维数组传参*/#include <stdio.h>原创 2021-09-25 11:14:56 · 376 阅读 · 0 评论 -
1维数组翻转
前言将一维数组作为形参除了传递地址外,还需传递数组的长度,因为仅由函数名无法确定数组有多大。代码实现/*函数声明*/void arr_invert(int arr[],int sz); //数组翻转函数void my_printf(int arr[],int sz); //数组打印函数int main(){ int arr[] = {1,3,5,7,9}; int sz = sizeof(arr)/sizeof(arr[0]); //数组元素个数 my_pri原创 2021-09-25 09:59:33 · 489 阅读 · 0 评论 -
字符处理函数-查找表
前言记住一些常用的字符处理函数,可以帮助你快速解决问题。 字符处理函数程序包含头文件#include <ctype.h> 函数原型 功能描述及其说明int isdigit(int c); 如果c是数字,则函数返回值为真,否则,返回值为假(0)int isalpha(int c); 如果c是字母,.....int i原创 2021-09-25 09:35:13 · 154 阅读 · 0 评论 -
数值溢出问题
前言对于有符号数来说,符号位溢出会导致数的正负发生改变。对于无符号数来说,最高位的溢出会导致最高位丢失。代码实现/*关于数值溢出*/#include <stdio.h>int main(){ char ch1; unsigned char ch2; ch1 = 0x7f + 2; //-127 ch2 = 0xff + 1; //0 printf("ch1 = %d,ch2 = %d\n",ch1,ch2); r原创 2021-09-25 09:12:01 · 442 阅读 · 0 评论 -
计算2维数组各行各列的值
前言求2维数组各行各列的值,就定义一个刚好多1行多1列的2维数组,这样可以方便存放各行各列的值。代码实现/*计算2维数组各行各列的值*/#include <stdio.h>/*宏定义*/#define M 5#define N 4/*函数声明*/void doub_sum(int arr[M][N]); //计算函数void my_printf(int arr[M][N]); //打印数组int main(){ int arr[M][N]原创 2021-09-25 08:22:24 · 323 阅读 · 0 评论 -
找出2维数组的最大值及其下标
前言这题比较简单,感觉唯一难点在于如何从函数中返回最大值的下标。要求找出2维数组的最大值及其下标代码实现/*找出2维数组的最大值,及其下标*/#include <stdio.h>/*宏定义*/#define M 2#define N 3/*函数声明*/int doub_max(int arr[M][N],int* x,int* y);void my_printf(int arr[M][N]);int main(){ int max;原创 2021-09-24 22:54:57 · 3762 阅读 · 3 评论 -
2维数组的行列交换
要求实现2维数组的行列交换,假设有两个2维数组a,b:即将a的行给b的列,a的列给b的行输出交换后的结果。代码实现#include <stdio.h>/*宏定义*/#define M 2#define N 3/*函数声明*/void change(int a[M][N],int b[N][M]); //行列交换a-->bvoid my_printf(int b[N][M]); //打印2维数组bint main(){ in原创 2021-09-24 20:33:29 · 339 阅读 · 0 评论 -
删除法求素数
简介删除法求素数(质数):素数:只能被1和本身整除的数删除:将1000以内是2的倍数的数去掉,是3的倍数的数去掉。。。。要求求1000以内的素数代码实现/*删除法求素数*/#include <stdio.h>/*函数声明*/void prime_del(int arr[]);void my_printf(int arr[]);/*全局变量*/static int n = 1001; //数组元素个数int main(){ int arr[原创 2021-09-24 19:01:26 · 588 阅读 · 0 评论 -
打印斐波那契数列的前n项
简介斐波那契数列:指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、…… 。这个数列从第3项开始,每一项都等于前两项之和。公式: fib[i] = fib[i-1]+fib[i-2]; i>=2功能实现用户从键盘键入数值n,打印前n项的斐波那契数列。代码实现/*打印斐波那契数列的前n项元素*/#include <stdio.h>/*函数声明部分*/void fibonacii(int fib[],int n);void my_printf(int fi原创 2021-09-24 17:34:59 · 2474 阅读 · 0 评论 -
实现简易的进制转换
前言10进制转换为其他进制:转换方法"除k取余法","除k"中这个k就是我们需要转换成的进制,比如要转换成2进制,这个K就是2,要转换成16进制,这个K就是16。"取余"中的余就是在这个除法过程中的余数(直到商为0)。以185转成2进制为例,转换过程见上图,所以转换结果是:185 = 10111001(2进制),注意余数是从下往上取,不要搞反了。代码实现/*进制转换 */#include <stdio.h>int main(void){ int num,base;原创 2021-09-24 12:15:21 · 999 阅读 · 0 评论 -
关于数组的查、插、删操作
前言在博客问答那见到这样的题,觉得挺不错的,所以就分享给大家,希望对大家有所帮助吧。题目1. 用C语言编写三个函数,分别对数组完成以下功能:(1)编写一个函数get_elem(int arr[ ],int i),返回数组arr中的第i个元素。.(2)编写一个函数insert_elem(int arr[ ],int i,int x),在数组arr中的第i个位置插入数值x。(3)编写一个函数de_elem(int arr[ ],int i),删除数组arr中的第i个元素。2. 编写主函数,进行数组原创 2021-09-24 11:33:04 · 421 阅读 · 0 评论 -
不稳定的排序-选择排序
前言选择排序是直观的排序,通过确定一个最大或最小值,再从待排序的的数中找出最大或最小的交换到对应位置。再选择次之。双重循环时间复杂度为 O(n^2)。简单选择排序是不稳定排序。算法性能时间复杂度: O(n^2),选择排序比冒泡排序快。稳定性: 不稳定代码实现/*选择排序 */#include <stdio.h>void select_sort(int arr[],int n); //选择排序函数声明int main(){ int i = 0; int a原创 2021-09-23 20:18:44 · 5069 阅读 · 2 评论 -
最简单的排序-冒泡排序
前言:名字的由来:因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。代码:/*冒泡排序 * */#include <stdio.h>void bubble_sort(int arr[],int n); //冒泡函数声明int main(){ int i = 0; int arr[10] = {1,3,5,7,9,2,4,6,8,0}; //需要排序的数组 int原创 2021-09-23 18:58:29 · 218 阅读 · 0 评论 -
找出单身狗
题目:给定一个非空整型数组,除了某个元素只出现一次以外,其余每个元素均出现两次。 找出那个只出现了一次的元素。样例:int a[]={1,2,3,4,5,1,2,3,4},该数组中只有5出现一次,其他数字都是成对,要找出5。程序源码:暴力求解法:统计每个元素出现的次数#include <stdio.h>//方法1:暴力求解,统计每个元素出现的次数int main(void){ int arr[] = {1,2,3,4,5,1,2,3,4}; int i原创 2021-09-22 22:39:16 · 308 阅读 · 3 评论 -
交换两变量的值,不使用中间变量
前言:一般情况下,我们交换两个变量的值都会使用一个中间变量,这样的程序也更容易理解。程序源码:使用中间变量时,交换两个变量的值:#include <stdio.h>int main(){ int a = 3; int b = 5; int tmp; //中间变量 printf("交换前:a = %d,b = %d\n",a,b); tmp = a; a = b; b = tmp; printf("交换后:a = %d,b = %原创 2021-09-22 21:04:47 · 737 阅读 · 0 评论 -
统计输入的单词个数
要求:从键盘中输入一段字符串,计算有多个单词。程序源码:#include <stdio.h>#include <ctype.h>int main(){ int i = 0,count = 0; char str[128]; printf("请输入字符串:"); gets(str); if(isalpha(str[0])) //由于for循环没有判断第一个单词的条件 { count = 1; }原创 2021-09-22 20:17:34 · 599 阅读 · 0 评论 -
有危险的gets()函数
gets函数介绍:函数原型:char *gets(char *s);需要的头文件:#include <stdio.h>函数功能:从标准输入读入字符,并保存到s指定的内存空间, 直到出现换行符或读到文件结尾为止。参数:s:字符串首地址返回值: 成功:读入的字符串 失败:NULLgets(str)与scanf("%s",str)的区别:gets(str)允许输入的字符串有空格,scanf("%s",str)不允许含有空格scanf碰到缓冲区里面的空字符(空格,tab,回原创 2021-09-22 12:03:53 · 653 阅读 · 0 评论