高级语言+数据结构整理

  1. c语言关键字有37个,c语言标识符以字母开头,下划线算字母

  2. ASCII a 97 A 35 toupper(int c) tolower(int c)

  3. 输出格式 %8.1f 8指的是所占宽度,1指的是小数点后的位数

  4. 数组声明的最外层一维可以不指定本维元素个数

  5. C语言字符串结束标志是\0(ASCII码是0)

  6. #define语句没有分号

  7. strcmp是按照字典顺序比较两个字符串

    strcpy是将一个字符串赋值给另一个字符数组(一个字符串变量)

  8. 运算符优先级从右往左结合

  9. 数组不能整体赋值,数组名是指针常量,总是指向数组首地址

  10. 结构体类型引用

    struct date{
        int year;
        int month;
        int day;
    }
    struct date d;
    typedef struct date Date;
    Date dd;
    
  11. 直接成员引用:p.w

    间接成员引用:p->w

  12. c不允许对结构体变量进行其他操作,如各种整体运算,整体输入输出等。

  13. 指针做参数可以改变实参的具体值

  14. 文件:

    • 任意时刻,一个顺序文件只能处于两种模式之一,读模式或者写模式
    • 顺序文件只能顺序操作,对于读只能从文件第一成分开始顺序的读,对于写只能在文件尾一个成分接着一个的写
    • C文件一律看成字节流,以字节为单位进行处理,这种文件称为流式文件
    • C文件操作全部通过系统定义的库函数来实现
    • 尖括号只在默认目录中查找指定文件,双引号现在当前源文件所在文件目录中进行查找,未找到则在默认目录中查找
    • EOF:-1,习惯上表示文件结束或者文件操作失败
    • NULL:0,习惯上表示打开文件失败等
  15. 字符读写

    int fgetc(FILE * fp);//读字符 ASCII码,EOF失败
    int fputc(int ch,FILE *fp);//写字符,EOF失败
    
  16. 字符串读写

    char *fgets(char *str,int num,FILE *fpointer);//读取字符串放入str字符数组中,遇到换行或者文件结束符结束,或读到n-1还未结束,读入结束后需要加入字符串结束符“\0”,返回值str所致字符数组首地址,NULL则失败
    int *puts(char *str,FILE *fpointer);//将str所指字符串不包含字符串结束符写入所指的文件中,返回值非负则成功,EOF则失败
    
  17. 格式化读写

    int fscanf(FILE *fp,char *format,arg_list);//将fp所指向的文件按format规定的格式进行转换,读取arg_list对应的数据
    int fprintf(FILE *fp,char *format,arg_list);//返回值实际输出的参数个数,一个负数则失败
    
  18. 数据快读写

    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所指的文件中
    
  19. 文件定位

    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 文件结尾
  20. break语句和continue语句都是受限制的goto语句

  21. break语句是包含他的最内层的while,do,for,switch语句终止执行,立即转移到所终止语句之外的程序点

    continue语句是终止他所在的最内层while,do,for语句循环体的执行,跳过循环体于下代码,然后继续循环的执行,简单理解就是终止这次循环,剩下的循环需要继续执行

  22. 指向数组的指针变量所指向的数组的长度必须与二维数组a的列数相同

  23. 结构体和共用体的区别

    • 结构体总空间大小,等于各成员总长度,共用体空间等于最大成员占据的空间

    • 共用体不能赋初值而结构体可以

    • 结构体每一位成员都用来表示一种具体事务的属性,共用体成员可以表示多种属性(同一存储空间可以存储不同类型的数据)

    • 共用体不能作为函数的参数类型和函数的结果类型

    • 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
      
    • 自动存储类别和寄存器存储类别属于自动存储方式
    • 外部存储类别和静态存储类别属于静态存储方式
    • 类型定义符则是用来定义类型名的,不分配存储空间
  24. 用户区:堆区,栈区,库程序代码区,静态存储区,用户程序代码区

    系统区:系统程序和数据

  25. 局部变量可以声明为寄存器,自动(默认),静态

  26. 静态局部变量初始化只在程序开始执行时进行一次,作用域与自动变量相同

  27. 外部变量,在声明的文件中 int x,不用加extern,在使用的文件中添加 extern int x,即可使用同一变量

  28. 在一个源程序文件中调用在气态源程序文件中定义的外部函数时候,必须在本源程序文件中用函数原型说明他,并在前面加上前缀extern

  29. #undef 终止宏定义的范围

  30. #define MAX(x,y) x>y?x:y

  31. " "首先在当前源码文件目录查找,未找到则取缺省目录中查找

    < >旨在缺省目录中查找指定文件,缺省目录由用户配置编程环境时候决定

  32. 条件编译会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,可根据条件只编译其中的某段程序,生成的目标程序较短。

  33. 卡特兰数。即一共有: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);

输出所有路径

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值