i++; if(i < j)
num[j--] = num[i];//把大于基准值放在右边 }
num[i] = temp;
quick_sort(num,start_num,i-1); quick_sort(num,i+1,end_num); } }
3、//二分擦找
int binary_search(int array[],int value,int size) {
int low=0,high=size-1,mid;
while(low<=high) //只要高低不碰头就继续二分查找 {
mid=(low+high)/2;
if(value==array[mid]) //比较是不是与中间元素相等 return mid;
else if(value > array[mid]) //每查找一次,就判断一次所要查找变量所在范围,并继续二分 low=mid; //如果大小中间值,下限移到中间的后一个位,上限不变,往高方向二分 else
high=mid; //上限移到中间的前一个位,往低方向二分 } return -1; }
/*双向循环链表插入函数*/
TYPE *insert_link(TYPE *head,TYPE *p_in) {
TYPE *p_mov = head,p_front = head;
if(head == NULL) {
head = p_in; p_in->next = head;
p_perior = head; } else {
while((p_in->[] > p_mov->[]) && (p_mov->next != head)) {
p_front = p_mov; p_mov = p_mov->next; }
if(p_in->[] <= p_mov->[]) {
if(head == p_mov) {
p_in->prior = head->prior; head->prior->next = p_in; p_in->next = p_mov; p_mov->prior = p_in; head = p_in; } else {
pf->next = p_in; p_in->prior = p_front; p_in->next = p_mov; p_mov->prior = p_in; } } else {
p_mov->next = p_in; p_in->prior = p_mov; p_in->next = head; head->prior = p_in; }
}
return head; }
/*双向链表删除函数*/
TYPE *delete_link(TYPE *head,int num) {
TYPE *p_mov = head,p_front = head;
if(head == NULL) printf(\link\\n\
while((p_mov->num != num) && (p_mov->next != head)) {
p_front = p_mov; p_mov = p_mov->next; }
if(p_mov->num == num) {
if(p_mov == head) {
if(p_mov->next == head && p_mov->prior == head) { free(pb); head =NULL; return head; }
head->next->prior = head->prior; head->prior->next = head->next; head = head->next; } else {
p_front->next = p_mov->next; p_mov->next->prior = p_front; }
free(p_mov);
printf(\node is delete\\n\ } else {
printf(\node not been found\\n\ }
return head; }
1、sizeof与strlen的区别
(1)、sizeof是运算符,strlen是函数
(2)、strlen只能用char*做参数,且必须是以''\\0''结尾的,而sizeof可用类型做参数,还可用函数做参数,如: int sum();
printf(\输出的结果是sizeof(int),即4。 (3)、数组做sizeof的参数不退化,传递给strlen就退化为指针了。
(4)、大部分编译程序,sizeof在编译时确定,因此sizeof(x)可以用来定义数组维数;而strlen要在运行时才能计算出来,用来计算字符串的长度,而不是类型占内存的大小;
char str[20]=\ int len1=strlen(str); //len1=10; int len2=sizeof(str); //len2=20;
(5)、sizeof后,若为类型必须加括弧,若为变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
(6)、当适用于一个结构类型时或变量,sizeof 返回实际的大小;当适用一静态地空间数组,sizeof归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸;
(7)、数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如: fun(char [8]) fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小,如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1, int len) {
unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len);
}
常在用到 sizeof和 strlen的时候,通常是计算字符串数组的长度,如果是对指针,结果则会不一样的:
char* str = \
sizeof(str)//结果 4 --->str是指向字符串常量的字符指针,sizeof 获得的是一个指针所占的空间,应该是长整型的,所以是4;
sizeof(*str) //结果 1 --->*str是第一个字符,其实就是字符串的第一位'a' 所占的内存空间,是char类型的,占了 1 位;
strlen(str)= 5 //--->若要获得这个字符串的长度,则一定要使用strlen
2、使用C语言的宏定义
(1)、宏定义给某个数bit3置位和清零
#define SET(a,b) a|(0x1<
#define CLR(a,b) a&(~(0x1<
(2)、宏定义一个求两个数最小值的函数 #define MIN(A,B) ((A)>(B))?B:A
不能使用大于、小于、if语句
#definemax(a,b) (((a)-(b))&(1<<31))?(b):(a) #define max(a,b) (a-b)==abs(a-b)?a:b
#define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b):(a))
(3)、宏定义交换两个数:
#define SWAP (a,b) {a=a+b; b=a-b; a=a-b; }
3、程序编译的过程