BUAA 2021春数据结构 期中复习 1绪论

期中内容:绪论——线性表

第一篇:绪论:复杂数据程序设计

本章的内容有:

1.递归:运用了栈

应用:树的遍历,二分查找,快速排序,全排列等

    汉诺塔(hanoi tower):有N个盘子在柱子1上,每次移动一个盘子,并且保证小的盘子在大的盘子上方,最终使得N个盘子都到了柱子3上面。

    程序及注释如下:

void hanoi(int n,int x,int y,int z){  //表示把n个盘子从x经过y移动到z
    if(n>0){
        hanoi(n-1,x,z,y);//先把上面的n-1个盘子挪到y,方便最下面盘子的移动
        printf("move %d form %d to %d",n,x,z);//然后把最下面的n号盘移到z
        hanoi(n-1,y,x,z);//y上面的n-1个盘子移动到z
    }
    return ;
}

2.数组定义和初始化:

初始化数组为0...0: int list[6]={0};

应用:字符串转化成数(stdlib.h 中的int atoi(char s[])),字符串颠倒,查找子串

3.指针说明与运算:

优先级()> [] > *

注意一:指针数组和数组指针的区分:[] 具有较高的优先级

A)
int *p1[10];
B)
int (*p2)[10];

“[]”的优先级比“*”要高。p1 先与“[]”结合,构成一个数组的定义,数组名为p1,int *修饰的是数组的内容,即数组的每个元素。那现在我们清楚,这是一个数组,其包含10 个指向int 类型数据的指针,即指针数组。

至于p2 ,在这里“()”的优先级比“[]”高,“*”号和p2 构成一个指针的定义,指针变量名为p2,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。

语文方面的理解:指针数组和数组指针是一个偏正短语。与谁先结合,该结构的中心语就是谁。

 

注意二:避免野指针,在本地由于window环境原因,可能可以运行,但是测评机可能返回SIGSEGV

如何解决:定义指针变量的时候就进行赋值,如果不赋值就使用(*ElemType)malloc赋值 malloc最后需要free

注意三:二维数组的指针运算

尝试运行如下代码

#include <stdio.h>
char a[4][5] = { “abcd”, “efgh”, “ijkl”, “mnop” };
main( )
{
    printf(“a=%x,  a[0]=%x,  &a[0][0]=%x\n”, a, a[0], &a[0][0]);
    printf(“a+1=%x,  a[0]+1=%x,  &a[0][1]=%x\n”, a+1, a[0]+1, &a[0][1]);
    printf(“**(a+1)=%c,  *(a[0]+1)=%c\n”, **(a+1), *(a[0]+1));
} 

一次运行结果:

a= 0x194,  a[0]= 0x194,  &a[0][0]= 0x194

a+1= 0x199,  a[0]+1= 0x195,  &a[0][1]= 0x195

**(a+1)= ‘e’,  *(a[0]+1) =‘b’

可以看出a和a[0]即使地址一样,但a指向的是第一行,a[0]指向的是第一行第一个元素

注意四:++与*的混合:左++ > * > 右++

(*px)++为先取px所指对象内容进行运算,然后对其加1;*px++为先取px所指对象内容进行运算,然后指针px1,其等价于*(px++)

(也可以笼统理解为++优先级大于*,*px++等价于*(px++) px加1,但是px++的值任然是原来的px,所以*px是原来的值;*++px等价于*(++px)px加1,++px的值是原来的px后面的一个地址,所以*px是后面一个的值

 

综合一四:优先级:[] > ++ > *

 

4.结构及其自引用:typedef 嵌套 初始化 自引用

    除了结构外,另一种复合数据类型:联合(union) union 联合名{分量表}联合变量名;

5.文件的基本操作 :

注意:每次执行freopen函数,都会重新打开文件从头读取,不要在循环和多次执行的函数中执行freopen函数,容易造成死循环。

6.预处理指令:#define

用法一:定义一个常量:#define PI 3.1415926lf

用法二:定义一个宏函数:

#define max(a,b) ((a)>(b)?(a):(b))  函数和参数之间没有空格   表达式中的参数需要使用括号括起来

 

第一次作业错题

下面程序段的运行结果是 
char c[]="\t\v\\\0will\n";
printf("%d",strlen(c));
(A)14
(B)3
(C)9
(D)字符串有非法字符,输出值不确定

 

正确答案: B】。

读到\0结尾 后面的不算在字符串中

下面能正确进行字符串赋值,并且能确保字符串以’\0’结尾的操作是  
(A)  char s[5] = {"ABCDE"};
(B)  char s[5] = {’A’, ’B’, ’C’, ’D’, ’E’};
(C)  char *s; s = "ABCDE";
(D)  char *s; scanf("%s", s);

 

正确答案: c】     

AB都会爆长度 D确实以\0结尾 但是s是一个野指针

 

第二次作业错题

以下与 int *q[5]; 等价的定义语句是    
(A)  int q[5] ;
(B)  int *q ;
(C)  int *(q[5]) ;
(D)  int (*q)[5] ;

 

正确答案: c        

由上文:*q[5]是一个指针数组 由于[] > * 于是等价于*(q[5])

 

若有以下定义,则数值不为3的表达式是    
int x[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, *p1;

(A)  x[3]
(B)  p1 = x + 3, *p1++
(C)  p1 = x + 2, *(p1++)
(D)  p1 = x + 2, *++p1

 

正确答案: c         

ABD易知正确 C 后++表达式总体值还没加 *(p1++)= *(p1)= 2 ≠ 3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值