数据结构之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+1
x=*++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,代表不满足条件
语句(复合语句):重复执行部分(循环体)
**流程图:
**举例:
//求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(条件表达式);
**流程图:
**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:增值表达式
**流程:
**举例:
//求: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;