sort函数:
/*
* function: 选择排序
* @param [ in] 顺序表 flag
* @param [out]
* @return 无返回
*/void sort(seqlist *list,int flag)
{
int min,max;
for(int i=0;i<list->len-1;i++){
max=i;
min=i;
for(int j=i+1;j<list->len;j++)
{
if(list->data[min] > list->data[j])
{
min=j;
}
else if(list->data[min] < list->data[j])
{
max=j;
}
}
if(min!=i && flag==1)
{
datatype t=list->data[min];
list->data[min]=list->data[i];
list->data[i]=t;
}
else if(max!=i && flag==0)
{
datatype t=list->data[max];
list->data[max]=list->data[i];
list->data[i]=t;
}else{
printf("输入的条件有误");
}
}
}
最值函数:
/*
* function: 最值
* @param [ in] 顺序表 flag
* @param [out] 最大值/最小值* @return
* */void most(seqlist *list,int flag)
{
int max=list->data[0];
int min=list->data[0];
for(int i=0;i<list->len;i++){
if(max<list->data[i]){
max=list->data[i];
}
if(min>list->data[i]){
min=list->data[i];
}
}
if(flag==1){
printf("最大值是%d\n",max);
}
else if(flag==0){
printf("最小值是%d\n",min);
}
else{
printf("输入的条件有误");
}
}
按值进行查找:
/*
* function: 按元素查找
* @param [ in] 顺序表 查找的元素
* @param [out]
* @return 成功返回下标 失败返回-1
*/
int search_data(seqlist *list,datatype key)
{
for(int i=0;i<list->len;i++)
{
if(list->data[i]==key)
{
return i;
}
}
return -1;
}
逆置函数:
/*
* function: 逆置
* @param [ in] 顺序表
* @param [out]
* @return 无返回
*/void rev_seqlist(seqlist *list){
for(int i=0;i<list->len/2;i++){
datatype t=list->data[i];
list->data[i]=list->data[list->len-i-1];
list->data[list->len-i-1]=t;
}
}
思维导图:
模拟面试题:
1、static在C语言中的用法
Static,顾名思义是静态、静止的意思,个人理解的含义是私有、静态。
私有就是隐藏。
- static函数只能声明后的本文中调用
- static全局变量只能声明后的本文中调用
- static局部变量只能声明后的本函数调用
静态就是一直存在,相对于每次调用动态分配而言。
- static函数(未验证是否每次调用代码地址都是一致的)
- static全局变量生命周期到程序或进程结束;
- static局部变量生命周期到程序或进程结束。
2、const在C语言中的用法
const 在实际编程中用得并不多,const 是 constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。
说 const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可。
3、结构体中字节对齐原值
1、在结构体中的每个属性会根据自己所占内存大小,来设置起始存储位置,起始存储位置必须是自身类型的整数倍
2、在上面对齐的基础上,最后整体会进行一次对齐,整体的字节个数要是一个数据的整数倍,这个数据是系统字节对齐和结构体中最大成员所占字节的之间取最小值。min(系统对齐字节数,结构体中所占内存最大的字节数)
4、数据存储的逻辑结构有哪些,什么逻辑结构
逻辑结构:表示数据元素之间的关联情况,根据元素间的关联情况,分为以下四种
1、集合结构:任意两个数据元素之间没有任何关系,只是单纯存储在同一个集合中(例如:公交车上的每个乘客)
2、线型结构:数据元素之间存在一对一的关系,在该结构中,除了第一个元素没有前驱,最后一个元素没有后继,其余所有数据都有且只有一个前驱和一个后继,(例如:排队做核酸) 3、树形结构:数据元素之间存在一对多的关系。(例如:族谱、公司组织架构)
4、图形结构:数据元素之间存在多对多的关系。(例如:朋友关系)
5、数据结构的存储结构是什么,分别由哪些
存储结构:数据的逻辑结构在计算机中的映射存储
1、顺序存储:将逻辑上连续的数据元素,存储在物理内存也连续的空间内;(例如:一根藤上七个娃)
2、链式存储:将逻辑上相邻的数据元素,存储在物理内存上随机位置;(例如:银行柜台等待办理业务的用户)
3、索引存储:在存储数据元素时,单独创建一个索引表记录数据元素所在位置;(例如:课本的目录)
4、散列存储:也叫哈希存储,数据元素存储的位置跟数据元素的关键字有关。
6、宏函数与函数的区别
1、宏做的是简单的字符串替换,不受类型限制;而函数是参数的传递,受到参数类型的限制。
2、宏体替换宏名是在编译之前就完成的,函数参数的调用是在函数执行时将实参传给形参的。
3、宏参数的替换是不经过计算的,有可能会带有副作用,所以我们在写宏体的时候一般在能加括号的地方都不要吝啬括号,但有时候这也不能解决副作用的问题。函数在传参时传的是值,不会产生副作用。
4、因为函数是在执行期间调用的,所以可以进行调试;宏在编译前完成的,所以不可以进行调试。
5、函数支持递归,宏不支持。
6、函数在调用时会产生时间和空间上的开销;宏在调用时则没有,因为宏进行的只是简单的字符串替换。
7、如果使用宏比较多,宏体在展开时会产生大量的代码,大大降低运行时间。
7、宏定义与typedef的区别
typedef是用来定义新的数据类型的关键字,它可以为已有的数据类型起一个新的名字。它的语法为:typedef 已有数据类型 新数据类型名。
1. typedef是在编译阶段生效的,而宏定义是在预处理阶段生效的,不消耗编译时间。
2. typedef可以定义结构体、联合体、枚举等复杂的数据类型,而宏定义只能进行简单的文本替换
3. typedef定义的新类型会增加代码的可读性和可维护性,而宏定义可能会导致代码可读性下降,并且容易出现错误。
4. 在使用typedef定义的新类型时,编译器会进行类型检查,而宏定义不会进行类型检查。