1、栈和队列的区别?
栈:先进后出,队列:先进先出栈:只允许在一端进行插入和删除队列:允许在队尾插入,队头删除的线性结构都是操作受限的线性表,插入和删除都只能在端点处进行,对于栈,只允许在一端进行插入和删除,该端称为栈顶,导致栈的特点为先进后出对于队列,允许在队尾插入队头删除,导致队列的特点为先进先出
2、数组和链表的区别?
两者都属于线性结构存储结构:数组顺序存储(使用一段连续的存储空间),逻辑相邻物理也相邻;链表链式存储(任意一段空间),逻辑相邻物理不一定相邻时间复杂度:数组插入删除O(n),修改查找O(1),所以数组适合查找修改;链表插入删除为O(1),修改查找O(n),链表更适合插入和删除访问:数组支持随机访问,可以通过下标进行;链表不支持随机访问,必须从头结点开始遍历数组静态分配内存,链表动态分配内存数组的存储密度>链表的存储密度
3、快速排序的思想
在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
4、头结点和头指针的区别
相同点:在链表中都可以找到第一个节点,头结点的指针域就是头指针头指针是虚设的节点,可以使用数据域表示链表长度,也可以不使用数据域,指针域指向第一个节点,第一个节点是实际存储数据元素的节点。头指针本质上是一个指针,用于记录第一个节点的地址。头节点本质上是个节点,是指链表指向第一个结点的指针头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针,头指针具有标识作用,无论链表是否为空,头指针均不为空,头指针是链表的必要元素头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前
5、static 关键字的作用
作用:延长生命周期
static 修饰全局变量默认结果是 0,内存在静态区
static 修饰局部变量,延长生命周期,效果类似全局变量注意: static 延长的是生命周期,不是作用域,依旧是局部变量,生命周期延长至整个文件
static 修饰函数,把函数的生命周期延长至整个文件,不能跨文件使用iv> static 和指针结合注意: 不可以使用 static 类型的指针,指向 auto 的变量地址,static 先分配内存auto 后分配内存
6、二叉树的遍历方式有哪些?如何销毁一个二叉树?
前序:左根右;中序:根左右;后序:左右根
可以通过后序完全销毁二叉树
7、队列的特点,什么是循环队列?
特点:先进先出,尾进头出,线性表循环队列是为了解决假溢出问题,能更充分的利用所分配的空间
8、如何使用C语言实现单向链表
单向链表是链式存储数据的容器,由数据域和指针域组成定义一个包含数据域和指针域的链表结构体再定义一个头结点,指针域指向NULL,数据域可以为链表长度需要插入新结点时令新节点指针域指向头结点的下一个结点,头结点指针域指向新结点。
9、C语言中宏定义的作用
宏定义是一种预处理技术,可以在程序中定义一些常量、函数、代码块等宏定义可以简化代码,提高代码的可维护性,可以通过宏定义实现条件编译。
10、什么是野指针?
指针没有初始化也没有指向null 该指针就是野指针
11、什么是指针
指针是用于存放内存地址的变量,这意味着指针可以用来定位到其他变量的位置,从而间接地控制这些变量。
12、const的作用
const修饰的变量不可以改变
const修饰的全局变量内存在静态区的只读段
const修饰的局部变量内存在栈区
const修饰指针
const int *p 值不可以改变,指向可以改变
int * const p 值可以改变,指向不可以改变
const int * const p 指向和值都不可以改变
13、C语言中的递归函数有什么优缺点
优点:
代码更简洁
可读性好
可以将问题划分为更小的子问题,使复杂的问题简单化
缺点:
时间和空间消耗比较大
调用栈可能会溢出
难以调试
14、如何用宏写一个二者大小判断
#define max(a,b) (a>b)?a:b
15、值传递和地址传递的区别
值传递:
值传递的是值
形参的改变不会影响实参
形参和实参分别占用存储空间
地址传递
传递的地址
形参的改变会影响实参
形参和实参公用同一片内存
16、while do...while 的区别
while 先判断后执行,至少执行0次,适用循环次数不明确的条件循环
do...while 先执行后判断,至少执行1次,适用于循环次数不明确的条件循环
17、在一个不知道头结点的单向链表中,删除一个指定节点(非尾节点)
将当前节点的后一个节点的数据域赋值到该节点的数据域中,然后删除下一个节点
18、指针与引用的区别
指针:存储地址的变量
引用:引用就是个别名
指针可以先定义后指向,而引用必须定义的同时初始化
2、指针定义需要申请空间,而引用不需要
3、指针可以改变(目标)指向,而引用一旦指定目标就不能被改变
4、有指针数组但是没有引用数组(主要原因:引用不是数据类型)
5、有二级指针(有指针的指针),而引用没有二级引用(没有引用的引用)
19、C语言中的结构体和C++中的结构体的区别
1> C语言中的结构体在C++依然适用
2> C++中的结构体可以有函数,C语言不可以
3> C++中的结构体在定义类型时可以给变量来个初始值,而C语言不可以
4> C++中的结构体在用结构体类型定义变量时,可以省略关键字struct不写,而C语言不可以
5> C++中的结构体的成员有访问权限,而c语言没有访问权限
6> C++中的结构体可以继承,而c语言没有
7> C++中的结构体中有特殊的成员函数,而c语言没有
20、谈谈C++中的const
const修饰表示不能被更改的值,在C++中有着常对象和常成员函数,常对象表示该对象内的所有数据不能被修改,常成员函数表示该成员函数不能对数据成员进行修改操作。非常对象可以调用非常成员函数和常成员函数,优先调用非常成员函数,常对象只能调用常成员函数。如果想修改常成员函数中的数据成员,可以使用multable修饰该数据成员