期中内容:绪论——线性表
第一篇:绪论:复杂数据程序设计
本章的内容有:
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所指对象内容进行运算,然后指针px加1,其等价于*(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