-
c语言关键字有37个,c语言标识符以字母开头,下划线算字母
-
ASCII a 97 A 35 toupper(int c) tolower(int c)
-
输出格式 %8.1f 8指的是所占宽度,1指的是小数点后的位数
-
数组声明的最外层一维可以不指定本维元素个数
-
C语言字符串结束标志是\0(ASCII码是0)
-
#define语句没有分号
-
strcmp是按照字典顺序比较两个字符串
strcpy是将一个字符串赋值给另一个字符数组(一个字符串变量)
-
运算符优先级从右往左结合
-
数组不能整体赋值,数组名是指针常量,总是指向数组首地址
-
结构体类型引用
struct date{ int year; int month; int day; } struct date d; typedef struct date Date; Date dd;
-
直接成员引用:p.w
间接成员引用:p->w
-
c不允许对结构体变量进行其他操作,如各种整体运算,整体输入输出等。
-
指针做参数可以改变实参的具体值
-
文件:
- 任意时刻,一个顺序文件只能处于两种模式之一,读模式或者写模式
- 顺序文件只能顺序操作,对于读只能从文件第一成分开始顺序的读,对于写只能在文件尾一个成分接着一个的写
- C文件一律看成字节流,以字节为单位进行处理,这种文件称为流式文件
- C文件操作全部通过系统定义的库函数来实现
- 尖括号只在默认目录中查找指定文件,双引号现在当前源文件所在文件目录中进行查找,未找到则在默认目录中查找
- EOF:-1,习惯上表示文件结束或者文件操作失败
- NULL:0,习惯上表示打开文件失败等
-
字符读写
int fgetc(FILE * fp);//读字符 ASCII码,EOF失败 int fputc(int ch,FILE *fp);//写字符,EOF失败
-
字符串读写
char *fgets(char *str,int num,FILE *fpointer);//读取字符串放入str字符数组中,遇到换行或者文件结束符结束,或读到n-1还未结束,读入结束后需要加入字符串结束符“\0”,返回值str所致字符数组首地址,NULL则失败 int *puts(char *str,FILE *fpointer);//将str所指字符串不包含字符串结束符写入所指的文件中,返回值非负则成功,EOF则失败
-
格式化读写
int fscanf(FILE *fp,char *format,arg_list);//将fp所指向的文件按format规定的格式进行转换,读取arg_list对应的数据 int fprintf(FILE *fp,char *format,arg_list);//返回值实际输出的参数个数,一个负数则失败
-
数据快读写
int fread(void *buf,int size,int count,FILE *fp);//读取到buf中,读取后,将读写指针移动size*count个字节,返回值实际读取的字段个数则成功,EOF则错误 int fwrite(void *buf,int size,int count,FILE *fp);//将buf所指向的数据写到fp所指的文件中
-
文件定位
void rewind(FILE *fp);//是fp所指向的文件的位置指针重新指向文件开始 int fseek(FILE *fp,long offset,int origin);//fp指向origin+offset的位置上,返回值0成功,非零失败 long int ftell(FILE *fp);//给出fp所指向文件的位置指针当前所处的位置,返回值为-1(EOF)是失败
- SEEK_SET 0 文件开始
- SEEK_CUR 1 文件当前位置
- SEEK_END 2 文件结尾
-
break语句和continue语句都是受限制的goto语句
-
break语句是包含他的最内层的while,do,for,switch语句终止执行,立即转移到所终止语句之外的程序点
continue语句是终止他所在的最内层while,do,for语句循环体的执行,跳过循环体于下代码,然后继续循环的执行,简单理解就是终止这次循环,剩下的循环需要继续执行
-
指向数组的指针变量所指向的数组的长度必须与二维数组a的列数相同
-
结构体和共用体的区别
-
结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间
-
共用体不能赋初值而结构体可以
-
结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)
-
共用体不能作为函数的参数类型和函数的结果类型
-
struct Book{ char title; int i; } book; int main (){ struct Book book; printf("%zu",sizeof(book)); } //8
-
union Book{ char title; int i; } book; int main (){ union Book book; printf("%zu",sizeof(book)); } //4
-
-
- 自动存储类别和寄存器存储类别属于自动存储方式
- 外部存储类别和静态存储类别属于静态存储方式
- 类型定义符则是用来定义类型名的,不分配存储空间
-
用户区:堆区,栈区,库程序代码区,静态存储区,用户程序代码区
系统区:系统程序和数据
-
局部变量可以声明为寄存器,自动(默认),静态
-
静态局部变量初始化只在程序开始执行时进行一次,作用域与自动变量相同
-
外部变量,在声明的文件中 int x,不用加extern,在使用的文件中添加 extern int x,即可使用同一变量
-
在一个源程序文件中调用在气态源程序文件中定义的外部函数时候,必须在本源程序文件中用函数原型说明他,并在前面加上前缀extern
-
#undef 终止宏定义的范围
-
#define MAX(x,y) x>y?x:y
-
" "首先在当前源码文件目录查找,未找到则取缺省目录中查找
< >旨在缺省目录中查找指定文件,缺省目录由用户配置编程环境时候决定
-
条件编译会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,可根据条件只编译其中的某段程序,生成的目标程序较短。
-
卡特兰数。即一共有:h(n)=c(2n,n)/(n+1) 种合法的出栈顺序
常见问答题
AOV和AOE的关系与区别
常见算法题目
求树的高度
采用递归的方法,如果为空,则返回0,否则,计算左子树的高度,计算右子树的高度,返回左右子树高度最大值+1;
求树的节点数量
采用树的层次遍历算法,出队的时候对节点数目进行加1操作
判断一个无向图是不是一棵树
条件:连通,无环,
判断一个无向图有环
无向图可使用深度优先搜索来寻找有无环,当搜索的当前节点的下一个邻接点(当前顶点的父顶点不算)已被访问过时,便有环。可通过简单修改递归DFS的代码来实现判断当前图有无环。增加一个father数组
判断有向图有环
利用拓扑序列判断是否有环,可以输出一个包含全部顶点的拓扑序列则证明没有环,否则就有环
最大生成树,最小生成树
删除先跟序列的最后一个节点,不适用栈和递归
一直往右下走,如果为空,则往左下角走,如果都为空,则返回p这个节点,他就是最后一个节点
二叉树求指定某一层节点的叶子节点数目
判断无向图中给定的任意两个顶点之间是否存在一条长度为k的路径,以及所有满足的点
int visited[MAXSIZE]
//出发点为i,终点为j,长度为k
int exist_path_len(ALGraph G,int i,int j,int k)
{
if(i==j&&k==0)
return 1;
else if(k>0)
{
visited[i]=1;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{
int temp=p->adjvex;
if(!visited[temp]&&exist_path_len(temp,j,k-1))
return 1;
}
visited[i]=0;
//这里需要把已经访问的点重新置为0,因为如果当前不存在长度为k
//到达j点,那么这个点还是可以使用的,因为有可能从其他点出发
//可以到达j点并且长度为k
}
return 0;
}
判断什么是完全二叉树
求一个节点x在二叉树的双亲节点算法
求节点在二叉树的层次
int getNodeLevel(BTNODE *bt, BTNODE *p)
{
if (bt == NULL)
return 0;
else
{
if (bt == p)
return 1;
int L = getNodeLevel(bt->lchild, p);
int R = getNodeLevel(bt->rchild, p);
if (L || R)
return 1 + (L > R ? L : R);
else
return 0;
}
}
加新边,求新的最小生成树
求无向图的连通分量
统计二叉树的层数
private int countLevel(TreeNode root){
if(root == null){
return 0;
}
return Math.max(countLevel(root.left),countLevel(root.right)) + 1;
}
利用队列和hashmap,类似层次遍历,只不过入队的时候是如hashmap
public static int getMaxWidth2(Node head) {
if (head == null) {
return 0;
}
//当前层最后一个结点
Node curEnd = head;
//下一层最后一个结点
Node nextEnd = null;
//当前层结点数
int curLevelNodes = 0;
//结点数最多的层的结点数
int max = Integer.MIN_VALUE;
Queue<Node> queue = new LinkedList<>();
queue.add(head);
while (!queue.isEmpty()) {
head = queue.poll();
curLevelNodes++;
if (head.left != null) {
queue.add(head.left);
nextEnd = head.left;
}
if (head.right != null) {
queue.add(head.right);
nextEnd = head.right;
}
if (head == curEnd) {
max = Math.max(max, curLevelNodes);
curLevelNodes = 0;
curEnd = nextEnd;
nextEnd = null;
}
}
return max;
}
两个链表相交求交点
递归判断一个二叉树是否对称
public static boolean isSymmetrical(BinaryTree root1, BinaryTree root2) {
if (root1 == null && root2 == null) {
return true;
}
if (root1 == null || root2 == null) {
return false;
}
if (root1.val != root2.val) {
return false;
}
//判断A的左边和B的右边是否相等,判断A的右边和B的左边是否相等,都相等就满足
return isSymmetrical(root1.left, root2.right) && isSymmetrical(root1.right, root2.left);