数据结构和C程序设计知识点

001:数的结点总数和度的关系

任一棵树中,结点总数=度数*该度数对应的结点数+1

002:解决哈希表的冲突的开放地址法

H i ( key ) = ( H ( key )+ d i ) mod m ( i = 1,2,…… , k ( k ≤ m – 1))

  • H ( key ) 为关键字 key 的直接哈希地址,
  • m 为哈希表的长度,
  • di 为每次再探测时的地址增量。

增量 d 可以有不同的取法,并根据其取法有不同的称呼:

  • ( 1 ) 线性探测再散列:d i = 1 , 2 , 3 , … ,m-1;
  • ( 2 ) 二次探测再散列:d i = 12 ,22 , 32 ,… ,[m/2]2
  • ( 3 ) 伪随机再散列:d i = 伪随机序列;

003:二叉树计算公式总结:

  1. n 个节点的二叉树一共有 ( (2n)! ) / ( n! * ( n+1 ) ! ) 种;

  2. n 层二叉树的第n层最多为 2 (n-1) 个,n 层二叉树做多有 2n - 1个;

  3. 对任何一棵二叉树T,如果其终端节点数为 n0,度为2的节点数为 n2,则 n0 = n2 + 1

  4. 二叉树节点计算公式 N = n0 + n1 + n2,度为0的叶子节点比度为2的节点数多一个。 N= 1 * n1 + 2 * n2 + 1

  5. 具有n个节点的完全二叉树的深度为 log2n + 1

004:完全二叉树699个节点,则叶子节点有多少个

  • 解答:
    n = n0 + n1 +n2,
    n0 = n2 + 1,
    则有:n = 2 * n0 + n1 - 1,
    因为是完全二叉树,所以 n1 只能等于0或1,
    所以 n = 2 * n0 - 1 或 n = 2 * n0,699是奇数,
    则 n0 = (n + 1) / 2,即350。

005:C语言指针

P 是普通的整型变量;

int p;

P 是指向整型数据的指针变量(从 p 开始, 先与 * 结合,说明 p 是一个指针,然后再与 int 结合);

int *p; 

P 是整型数据组成的数组(从 p 处开始,先与 [ ] 结合,然后与int 结合);

int p[3]; 

P 是指向整型数据的指针变量所组成的数组(从 p 处开始,先与[ ]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型);

int *p[3]; 

P 是指向由整型数据组成的数组的指针(从P 处开始,先与 * 结合,说明 p 是一个指针然后再与[ ]结合,说明指针所指向的内容是一个数组,然后再与int 结合);

int (*p)[3]; 

P 是指向整型指针变量的指针变量(先与*结合,说是P 是一个指针变量,然后再与*结合,指针所指向的元素是指针变量,然后再与int 结合);

int **p; 

P 是参数为一个int类型返回值为一个int类型的函数;

int p(int); 

P 是一个指向有一个整型参数且返回类型为整型的函数的指针 (从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型);

int (*p)(int);

可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数;

int *(*p(int))[3]; 

006:C语言中的字符数组和字符串之间的关系

char cArr[] = {'I','L','O','V','E','C'};
char str[]="ILOVEC";//sizeof长度为7个,因为末尾会自动加‘\0’,即null来做字符串的结尾
char sArr[10]="ILOVEC";

/*用sizeof()求长度*/
printf("cArr 的 sizeof:%lu\n", sizeof(cArr));//6
printf("str 的 sizeof:%lu\n", sizeof(str));//7
printf("sArr 的 sizeof:%lu\n", sizeof(sArr));//10
/*用strlen()求长度*/
printf("cArr 的 strlen:%lu\n", strlen(cArr));
printf("str 的 strlen:%lu\n", strlen(str));//6
printf("sArr 的 strlen:%lu\n", strlen(sArr));//6
```c

C语言有两种表示字符串的方法,
一种是字符数组,如:
```c
char str[] = "I Love C";//

另一种是字符串常量,如:

char *str = "I Love C";

它们在内存中的存储位置不同:
字符数组存储在全局数据区或栈区,第二种形式的字符串存储在常量区,使得字符数组可以读取和修改,
而字符串常量只能读取不能修改。

char *str = "Hello World!";
str = "I love C!";  //正确
str[3] = 'P';  //错误 会出现段错误(Segment Fault)或者写入位置错误

如果只涉及到对字符串的读取,那么字符数组和字符串常量都能够满足要求;如果有写入(修改)操作,那么只能使用字符数组,不能使用字符串常量

007:sizeof操作符

单目操作符,以字节形式给出了其操作数的存储大小。

sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。sizeof(void)都不是正确形式。

union操作数的sizeof是其最大字节成员的字节数。struct操作数的sizeof是这种类型对象的总字节数,包括任何填充在内。

struct {char b; double x;} a;

在某些机器上sizeof(a)=16,而一般sizeof(char)+ sizeof(double)=9。
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被8整除的地址。
如下:

struct
{
    char a;
    double b;
    int c;
    char d;
} s1;

struct s2
{
    char a;
    char b;
    int c;
    double d;
} s2 ;

printf("s1 的 sizeof:%lu\n", sizeof(s1)); //24
printf("s2 的 sizeof:%lu\n", sizeof(s2)); //16

详细参见 https://blog.csdn.net/u013728021/article/details/100920141

007:sizeof操作符

发布了206 篇原创文章 · 获赞 68 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u013728021/article/details/100885974