vlambda博客
学习文章列表

数据结构之C语言重要知识点复习

1,自加自减运算(单目运算)

说明:

(1)运算对象只能是一个变量

2++; /*Error*/

(2)前置是先运算,后引用,而后置是先引用后运算

int i,x;i = 5;x = i++; /*x=i;i=i+1*/i=5;x = ++i; /*i=i+1;x=i;*/

2,运算的优先级

(1)

第一原则:单目运算的优先级高于双目运算

x=*p++ <-> x=*(p++) <-> x=*p,p=p+1x=*++p <-> x=*(++p) <-> p=p+1,x=*p

第二原则:算术运算->关系运算->逻辑运算->赋值运算

a+b>c&&c!=0 <-> ((a+b>c)&&(c!=0))

(2)优先级总表

级别 运算符 结合顺序
1 () [] -> 从左向右
2 ! - ++ -- (type) sizeof * & 从右向左
3 * / % 从左向右
4 + - 从左向右
5 << >> 从左向右
6 < <= > >= 从左向右
7 == != 从左向右
8 & 从左向右
9 ^ 从左向右
10 | 从左向右
11 && 从左向右
12 || 从左向右
13 ? : 从右向左
14 = op= 从右向左
15 , 从左向右

3,三种循环

(1)while循环(当型循环)

**格式:

while(条件表达式)

语句;

表达式:值非0,表示满足条件;值为0,代表不满足条件

语句(复合语句):重复执行部分(循环体)

**流程图:

1557411418551

**举例:

//求s=1+2+3+4+...+100
#include<stdio.h>void main(void){int s=0,i=1;while(i<=100){ s=s+i;//s+=i; i++;}printf("s=%d\n",s);}

(2)do-while循环(直到型循环)

**格式:

do{

语句;}

while(条件表达式);

**流程图:

1557411792125

**while循环与do-while循环的区别:

while循环先判断条件,后执行循环体;

do-while循环先执行循环体,后判断条件

**举例:

//求30!
#include<stdio.h>void main(void){ float s=1.0; int i=1; do{ s*=i; i++; }while(i<=30); printf("301=%f",s);}

(3),for循环

**格式:

for(e1;e2;e3)

statement;

e1:初值表达式

e2:测试表达式

e3:增值表达式

**流程:

1557412308338

**举例:

//求:s=1+2+3+...+100
#include<stdio.h>void main(void){ int s,i; for(s=0,i=1;i<=100;i++) { s=s+i; } printf("s=%d",s);}

**注意:在for循环中,e1,e2,e3都可以省略。

(4),无限循环和空循环

**条件为恒真的循环-无限循环

while(1){...}


do{
...}while(1);//靠条件控制的break语句退出循环


for( ; ; ){...}
//例:程序等待直到输入字母A
for(;;){ ch=getchar(); if(ch=='A')break;}

**循环体为空语句的循环-空循环

for(i=1;i<=MAX;t++);//作用:程序延时

4,字符串的比较strcmp(str1,str2)

作用:对str1和str2进行逐位无符号字符比较,直到对应位字符能够确定关系或到串尾为止。返回整型比较结果。

字符的数值关系及是字符的ASCII码值的数值关系。

比较结果 strcmp的值
str1<str2 <0
str1==str2 ==0
str1>str2 >0
char str1[]={"abcd"};char str2[]={"abcd"};int iRe1,iRe2,iRe3;iRe1=strcmp(str1,"abdc");iRe2=strcmp(str1,str2);iRe3=strcmp("abcde",str2);

5,数组的常用算法

数组是同类型数据的集合。便于整体处理数据,数组操作的主要算法有:

(1)求极值;

(2)排序;

(3)查找;

6,指针

C语言的指针支持:

#include <stdio.h>void main (void ){  int x ,*p; x=55; p=&x; printf ( “ %d, %u ”, x, *p) ; *p=65; printf ( “ %d, %u”, x, *p) ;}
//int *p; *p=2; /* Error!*/

(1)指针必须指向对象后,才能引用。(2)&和*为互补运算。

7,指针与数组

数组是同类型的变量的集合,各元素按下标的特定顺序占据一

(1)指针与一维数组

通过指针引用数组元素可以分以下三个步骤:

**说明指针和数组

int *p,a[10];

**指针指向数组

p=a; /*指向数组的首地址*/p=&a[0]; /*指向数组的首地址*/

**通过指针引用数组元素

(2)引用数组元素

**三种方法:

下标法:   a[ i ]

指针法:   *(p+i)

数组名法:*(a+i)

a=p; /*Error!*/

8,动态分配函数 (<stdlib.h>)

sizeof(x):计算变量x的长度

free(p):释放指针p所指变量的存储空间,即彻底删除一个变量

9,参数传递

(1)函数调用时传送给形参表的实参必须与形参在类型、个数、顺序上保持一致

10,结构体

(1)struct   结构名{

type   成员1 ;

type   成员2 ;

type   成员n ;

};

struct:结构标志

结构名:用标识符命名的结构类型名

(2)结构的定义确定了如下两点:

定义结构类型,确定结构中的成员项的名称及类型。

指明该结构类型的变量在内存中的组织形式。

struct Book { char no[15];  char name[50];  float price; }; struct Book b[10]; //正确
struct { char no[15];  char name[50];  float price; } Book; struct Book b[10]; //错误
typedef struct { char no[15];  char name[50];  float price; }Book; Book b[10]; //正确

11,结构指针

方式一:(*p).成员项名

方式二:p->成员项名

typedef struct LNode{ ElemType data; //数据域 struct LNode *next; //指针域}LNode,*LinkList;  // *LinkList为Lnode类型的指针
LNode *p <-> LinkList p

12,总结

(1)从编译器的角度理解C语言的语法规则和处理数据的方式

•int x,y,*p;(符号表,变量先定义后使用,定义后有内存单元)

•语句的语法,如赋值语句:x=a+b;(正确)   a+b=x;(错误)

•#define N 5; (后面有分号错误,因为N会被定义为“5;”)

•函数调用通过栈,函数内的局部变量作用域,函数参数传递

•在不同的函数中试图改变一个数据,可以通过:

函数return

指针

全局变量

(2)从机器执行的角度理解算法,将算法描述逐句变为程序

•依次: 循环(for,while),注意循环变量的初值和终值

•比较或分情况:分支(if,switch)

•移动:赋值(后移a[i+1]=a[i]; 前移:a[i-1]=a[i];)

•交换:三条赋值

•记录或保存变量的值:一条赋值

•对于链表,常用的三条语句如下:

p=L->next; //p指向首元结点
while(p!=NULL) //p未到表尾
p=p->next; //p指向下一个结点

另外,指针保留技术:

q=p;p=p->next;