c语言
瑞-板凳精神
星光不问赶路人-你可以不平凡
展开
-
最优路径
#include <stdio.h>#include<unistd.h>#include<time.h>#include<stdlib.h>int main(int argc, char** argv){ int sum_step = 0; int n; int p = 0; printf("系统正在随机产生路径!\n"); sleep(1); srand(time(NULL));原创 2021-03-28 15:32:28 · 177 阅读 · 0 评论 -
中序遍历——非递归算法
中序遍历先走到的后访问,后走到的先访问,采用栈结构。步骤:1.如果节点有左子树,该节点入栈,否则访问该节点。2.如果节点有右子树,重复步骤1。3.如果节点没有右子树,访问完毕,根据栈顶指示退回,访问栈顶元素,并访问右子树,重复步骤1。4.如果栈为空,遍历结束。例子(c++版):#include<iostream>#include<stack>using namespace std;typedef struct Binary_tree{ int u原创 2021-03-16 21:34:30 · 3327 阅读 · 0 评论 -
数据结构——树
树节点的分类:节点拥有的子树数称为:节点的度(degree),度为0的节点称为叶节点(leaf)或终端节点,度不为0的节点称为非终端节点或分支节点。树的度是树内各节点度的最大值。二叉树的性质每个节点最多有两个子树。第i层有2^(i-1)个节点,深度为k的二叉树最多有2 ^(k)-1.度为2的节点数比叶子数多1。例如下图2中的数量关系为:1号+2号+3号+4号 = 8号+9号+10号。满二叉树:每个节点的度为2。完全二叉树:第k-1层和满二叉树一样,最后一层的叶子节原创 2021-03-16 09:08:31 · 102 阅读 · 0 评论 -
数据结构——队列(c语言版)
队列基本概念队列是一种先进先出(FIFO)特殊的线性表,仅在线性表的两端操作,不允许在中间操作。对头(front):取出元素的一端队尾(rear):插入元素的一端线性队列例子:依据单链表改造即可。#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#include<windows.h>typedef struct Node{原创 2021-03-14 21:45:16 · 107 阅读 · 0 评论 -
栈的应用——后缀表达式
后缀表达式的定义实例(中缀转后缀):5+4=>5 4 +1+23 => 1 2 3 * +8+(3-1) 5 => 8 3 1-5 *+ +中缀表达式符合人类的阅读和思维习惯。后缀表达式符合计算机的“运算习惯”中缀转后缀算法:。遍历中缀表达式中的数字和符号:对于数字:直接输出4对于符号:。左括号:进栈运算符号:与栈顶符号进行优先级比较+若栈顶符号优先级低:此符合进栈(默认栈顶若是左括号, 左括号优先级最低)+若栈顶符号优先级不低:将栈顶符号弹出并输出,之原创 2021-03-14 17:17:38 · 194 阅读 · 0 评论 -
数据结构之——栈(c语言版)
栈的介绍栈是一种特殊的线性表,仅在线性表的一端操作(栈顶top)。插入操作:进栈、压栈、入栈。删除操作:出栈、弹栈。用线性表的顺序存储模拟栈时,在尾部添加或删除元素,不会涉及到元素的大量移动。用线性表的链式存储模拟栈,在头部插入或删除元素,不会涉及到元素的大量移动。栈的链式存储利用单链表结构创建栈(头插法):例子:#include<stdio.h>#include<malloc.h>#include<string.h>#include<原创 2021-03-14 16:46:22 · 93 阅读 · 0 评论 -
双向链表(c语言版)
双链表#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>typedef struct Node{ Node* pre; Node* next;}node;typedef struct Common_list{ node head; int length;}common_list;common_list*creat_double_li原创 2021-03-13 22:00:40 · 68 阅读 · 0 评论 -
循环链表(c语言版)
#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#include<windows.h>typedef struct Node{ //定义连接链表的节点: Node* next;}node;typedef struct Common_list{ //定义一个空间域 node head; int length;}common_原创 2021-03-13 22:00:13 · 322 阅读 · 0 评论 -
单链表(c语言版)
模拟手机类型管理#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>typedef struct Phone{ int price; char brand[8]; //int price2; struct Phone *next;}phone;phone *insert(phone *old,phone *new_){ if (old ==原创 2021-03-10 20:27:50 · 294 阅读 · 0 评论 -
c和c++混合编程
编译器类型:1.c中:gcc2.c++中:g++格式:1.包含必要的头文件2.使用宏定义(在头文件中):# if _ _cplusplusextern "C" {#endif 函数的一些声明......;#if _ _cplusplus}#endifubuntu下混合编程:gcc -c fun.c -o fun.og++ main.cpp fun.o -o main例子:...原创 2021-01-28 11:42:49 · 187 阅读 · 0 评论 -
c++递归调用
递归调用如果recurse()进行了n次递归调用,则statement1顺序执行n次,然后statement2与函数调用相反的方向顺序执行n次,进入n层递归调用后,程序沿原路径返回。void recurs(argumentlist){ statements1 if (test) recurs(arguments) statements2}...原创 2021-01-19 20:46:56 · 207 阅读 · 0 评论 -
C++简单的文件输入输出
写入到文本文件1.包含头文件:#include < fstream >2.头文件中定义了一个用于处理输出的ofstream类,所以要声明一个或多个ofstream变量并命名xxx。3.指明命名空间std:using std::xxx,或直接std::xxx4.将该ofstream对象同一个文件关联起来,即:xxx.open(文件名);要检查是否文件open成功5.就像使用cout那样使用xxx6.使用完后关闭:xxx.close();cout.precision(val)其实就是原创 2021-01-19 09:51:13 · 191 阅读 · 0 评论 -
基于多进程服务器的在线购物
服务器#include<stdio.h>#include<pthread.h>#include<signal.h>#include<unistd.h>#include<sys/socket.h>#include<stdlib.h>#include<arpa/inet.h>#include<ctype.h>#include<string.h>#include<sys/types原创 2021-01-16 09:55:51 · 83 阅读 · 0 评论 -
冒泡排序bubble_sort
步骤手动输入要排序的序列从小到大排序代码如下:#include<stdio.h>#include<string>int main(){ int input[5]; int input_len = sizeof(input) / 4; printf("数组长度input_len = %d\n",input_len); printf("请输入数组:\n"); for (int i = 0; i < input_len; i++) { scan原创 2021-01-16 09:49:49 · 93 阅读 · 0 评论 -
售卖机c语言
步骤输入商品总价格输入你有几张1元,2元,5元,10元,20元,50元,100元买完后显示你的消费情况显示剩余现金代码如下:#include <stdio.h>#include<string.h>void consume(){ while (1) { int num = 0; int money[] = { 1,2,5,10,20,50,100 }; int my_money_num[7]; int size = sizeof(mone原创 2021-01-16 16:47:05 · 796 阅读 · 0 评论 -
最优路径optimal_path
步骤:建立一个10*10的矩阵随机产生100个0~9的数填入矩阵每一行利用冒泡法从小到大排序显示出每一行的首元素为最佳路径最后将最佳路径相加代码如下:#include <stdio.h>#include<windows.h>#include<time.h>#include<stdlib.h>int main(int argc, char** argv){ int sum_step = 0; const int n = 10原创 2021-01-16 09:56:48 · 636 阅读 · 0 评论 -
产生随机数rand
在C语言中可以通过使用rand函数来生成随机数。rand函数是按指定的顺序来产生整数。但是C语言中产生的随机并不是真正意义上的随机有时候可以称为伪随机数。使用 rand() 生成随机数之前需要用随机发生器的初始化函数 srand(unsigned seed)进行伪随机数序列初始化,seed 又叫随机种子,意思就是如果每次提供的 seed 是一样的,那么每一轮生成的几个随机值也都是一样的,因此叫伪随机数,所以需要每次提供不同的 seed 值来达到完全的随机.通常在C语言中我们使用时间函数time(null)原创 2020-12-23 18:37:17 · 541 阅读 · 3 评论 -
基于多进程服务器&客户端的大小写转换
多进程服务器原理:1.fork()出一个子进程。子进程完成与父进程数据交互,父进程等待客户端连接(只处理accept函数的返回值)2.对于子进程来说:close(建立连接的lfd),客户端关闭时子进程关闭,用read读客户端发送的数据为0时。3.对于父进程来说:close(int cfd = accept())...原创 2021-01-16 09:52:57 · 178 阅读 · 0 评论 -
函数中传出/传入参数
函数中的传出参数要通过地址进行传出例子:#include<stdio.h>#include<stdlib.h>int func(int n1,int *n2,int **n3){ n1 = 1; //变量不能作为传出参数,传出参数只能是指针类型的(通过地址传出) //此时可以有多个返回值 *n2 = 2; **n3 = 3; printf("in func---> .原创 2020-11-27 20:01:47 · 229 阅读 · 0 评论 -
链表(单向/双向)
链表#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct phone//定义类型phones{ int price; char brand[16]; struct phone *next;}phones;int n = 1;//创建列表struct phones *cteate_list(phones **old_out原创 2020-11-27 16:54:21 · 61 阅读 · 0 评论 -
结构体
结构体的应用#include<stdio.h>#include<stdlib.h>#include<string.h>struct school{ int num_school; char type_school[32]; struct department { char depart1[32]; char depart2[16];原创 2020-11-15 10:18:29 · 66 阅读 · 0 评论 -
线程间通信(互斥量、信号量、条件变量)
线程同步同步即协同步调,按预定的先后次序运行。线程同步:指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回,同时其他线程为保证数据一致性,不能调用该功能。“同步”的目的:为了避免数据混乱,解决与时间有关的错误,实际上,进程间,信号间都要同步机制。关键字restrict:只用于限制指针,所有对这个指针指向内存的操作只能通过本指针完成,不能通过版指针以外的的其他变量或指针修改。互斥量mutex(取值:0,1)Linux 中提供一把互斥锁mutex(也称之为互斥量)。每个线程在对资原创 2020-11-13 11:38:30 · 637 阅读 · 1 评论 -
线程
线程进程可以蜕变成线程线程可以看做寄存器和栈的集合进程是分配资源最小的单位,而线程是调度的最小单位,线程共用进程资源线程有时候被称为轻量级进程(light weight process LWP)线程共享资源1.文件描述符表2.每种信号的处理方式3.当前工作目录4.用户ID和组ID5.内存地址空间(.text/.data/.bss/heap/共享库)线程非共享资源1.线程id2.处理器现场和栈指针(内核栈)3.独立的栈空间(用户空间栈)4.errno变量原创 2020-11-10 10:15:04 · 93 阅读 · 0 评论 -
守护进程
守护进程原创 2020-11-09 09:33:13 · 106 阅读 · 0 评论 -
进程组
getpgrp函数pid_t getpgrp(void);获取当前进程组的idgetpgid获取指定进程的进程组idpid_t getpgid(pid_t pid);成功:返回0,失败:返回-1,设置errno如果pid = 0,该函数作用和getpgrp一样setpgid改变进程默认所属的的进程组,通常加入一个现有的或创建一个新的进程组int setpgid(pid_t pid,pid_t pgid);成功:返回0,失败:返回-1,设置errno如果改变子进程为新的组,应该原创 2020-11-07 11:09:10 · 117 阅读 · 0 评论 -
信号
信号(p161)每个进程收到的所有信号,都是由内核负责发送,内核处理。信号的响应方式:1.忽略信号:信号处理完成后忽略/丢弃。2.执行系统默认动作:1.终止进程,2.终止进程且core文件,3.忽略,4.暂停stop,5.继续。3.捕捉信号:不让信号执行默认动作,按自己规定的方式执行。信号屏蔽字(阻塞信号集set):将某些信号加入集合,对他们设置屏蔽,当屏蔽该信号后,再接收到该信号,该信号的处理将推后。未决信号集(信号未处理,产生的抵达之间的状态):1.信号产生,未决信号集中描述该信号的位原创 2020-11-06 19:52:31 · 171 阅读 · 0 评论 -
文件基本I/O操作
文件基本I/O操作1.打开/创建文件(p71)#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int open(const char*pathname,int flags);int open(const char*pathname,int flags,mode_t mode);int creat(const char*pathname,mode_t mode);flags:打开方式mod原创 2020-10-31 17:09:36 · 268 阅读 · 0 评论 -
c语言笔记
宏定义和全局变量的区别宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不支持extern。宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的(不占用内存)。而变量在运行时要为其分配内存。...原创 2020-10-31 16:17:27 · 491 阅读 · 0 评论 -
mmap函数
mmap函数1.创建映射区void *mmap(void *adrr,size_t length,int prot,int flags,int fp,off_t offset);addr:建立映射区的首地址,直接传NULLlength:映射区的大小prot:映射区权限PROT_READ,PROT_WRITE,PROT_READ|PROT_WRITEflags:标志位参数,MAP_SHARED将映射区所做的操作反映到物流设备(磁盘)上(父子进程可以共享映射区)MAP_PRIVATE不反映(父子进原创 2020-10-26 21:13:02 · 947 阅读 · 2 评论 -
管道
无名管道pipe(有血缘关系进程间的通信,fork创建)(179)本质:1.内核创建的缓冲区(大小:4k),它是一个伪文件。2.由两个文件描述符int pfp[2]引用,一个表示读端pfp[0],一个表示写端pfp[1]。3.数据从写端流入管道,。从读端流出,它使用环形队列机制。进程之间是不能相互访问的,,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据取走,内核提供的这种机制称为:进程间通信(IPC,interprocess co原创 2020-10-26 11:54:42 · 86 阅读 · 2 评论 -
等待进程结束wait
等待进程结束孤儿进程父进程先于子进程结束,此时子进程成为孤儿进程,但操作系统会将子进程的父进程设为init进程僵尸(死)进程(zombie)子进程终止,父进程没有回收子进程,子进程残留资源pcb存放于内核中,变成僵死进程。僵死进程不能用kill命令清除,因为kill命令是用来终止进程的。wati函数一个进程在终止时会关闭所有文件描述符,释放在用户空间分配的内存,但它的PCB还保留着,内核在其中保存了一些信息:如果是正常终止则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是原创 2020-10-24 17:10:46 · 431 阅读 · 0 评论 -
exec*系列函数
exec*系列函数(p129)本质:用新的程序代替新的进程系统调用fork创建子进程时,子,父进程有相同的代码段,如果希望运行另外一个新的程序,则需要调用exec*系列函数。调用fork之后,子进程调用exec*系列函数运行一个新的程序,它不会创建新的进程,而是用新的程序替换子进程的地址空间,代码段,数据,堆,栈,所以,新的pid不变,新进程从main函数开始。execlp调用失败时才会继续向下执行,所以可以直接在函数下一行写perror,exit,不需要if语句。l(list):命令行参数列表原创 2020-10-24 11:18:59 · 207 阅读 · 0 评论 -
输入输出重定项dup/dup2
makefile中的规则源文件.c经过编译之后生成目标文件.o原创 2020-10-24 09:59:06 · 102 阅读 · 0 评论 -
环境变量
环境变量(p49)在操作系统中用来指定操作系统运行环境的一些参数本质:字符串格式:名=值[:值],多个值用:号隔开值用来描述进程环境信息存储形式:char*[]数组,数组名:environ,内部存储字符串,NULL结尾引入环境变量表:声明环境变量:extern char**environ;PATH变量中保存了可执行文件的搜索路径,使用“:”隔开解释当前所使用的命令解释器:echo $SHELL查看家目录:echo $HOME查看所使用的语言:echo $LANG在命令终端访问原创 2020-10-22 11:18:14 · 117 阅读 · 0 评论 -
目录文件操作
1.打开目录(p106)访问一个目录之前,应该先打开目录。#include<sys/types.h>#include<dirent.h>DIR *opendir(目录名字);成功时,返回一个指向目录文件的指针,失败时,返回NULL读目录#同上struct dirent *readdir(DIR *dir);成功时,返回一个dirent结构体类型的指针,如果读到末尾或失败,返回NULL。dirent结构体如下:关闭目录int closedir(DI原创 2020-10-19 19:54:59 · 100 阅读 · 0 评论 -
软/硬链接
硬链接(p91)通过索引节点链接,一个文件有多个有效路径名,多个文件名指向同一索引节点。#include<unistd.h>int link("已存在文件","硬链接文件"); 创建int unlink("文件名"); 如果该文件对应的inode有多个文件名,删除一个代表硬链接数减一,减为0才删除该文件。软链接类似win的快捷方式,文件中包含被链接文件的路径。int symlink("已存在文件","软连接文件"); 创建int readlink("软连接文件",buf原创 2020-10-19 08:30:18 · 532 阅读 · 7 评论 -
修改文件属性chmod,chown,utime,truncate
1.改变文件的访问权限chmod(p98)/*头文件:*/#include<sys/types.h>#include<stat.h>/*函数:*/int chmod(const char *path , mode_t mode);int fchmod(int fp , mode_t mode);2.改变文件的访问时间和修改时间/*头文件 */#include<stdio.h>#include<utime.h>int utime(cons原创 2020-10-18 16:33:04 · 231 阅读 · 0 评论 -
c语言中获取文件属性
c语言中获取文件属性(p87)函数格式:int stat(const char *filename , struct stat *buf); //对于软连接,穿透读取文件。int fstat(int fp , struct stat buf);int lstat(const char *filename , struct stat *buf); //对于软连接,不穿透读取文件,直接读取软链接文件。功能:获取指定文件的属性放入结构体buf中代码如下:#include<stdio.原创 2020-10-18 15:57:52 · 1682 阅读 · 0 评论 -
文件中lseek的应用
lseek的应用格式:int lseek(int fp, off_t offset, int whence);whence: 移动读写指针的方式:SEEK_SET, SEEK_END, SEEK_CUR失败,返回-1,成功时返回新的读写指针位置。指针只能向末尾偏,不能向前端偏。代码如下:1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<原创 2020-10-18 10:46:39 · 169 阅读 · 2 评论 -
c语言中实现文件内容的复制
c语言中实现文件内容的复制思路:1.先创建一个新文件2.打开有内容的已存在文件3.创建一个buf,将旧文件的内容写入buf中4.再将buf中的内容写入新文件中,写入新文件的过程中,最好使用循环,否则如果buf不够会复制不全。#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include <stdlib.h>#include&原创 2020-10-18 09:50:01 · 2433 阅读 · 0 评论