数据结构之malloc,选择排序,条件运算符,折半查找,


———————————————————————————————————————————————————

所有的指针所占的空间大小都是4字节,只是声明的类型不同,对于机器实质本质上没有什么区别,指正之间可以进行强制性转换

int a = 1;

int *p = &a;

float *p1 = (float*)p;


pi= malloc (sizeof ( int  )  );

pf= (float *)pi;

很多系统中,指针类型的大小和int大小相同,所以有时会省去返还类型

——————————————————————————————————————————————————


检验是否为空指针   if(pi==NULL)

为什么需要检验:因为系统存在空间时,malloc函数会指向这块空闲空间。如果没有,就会返还NULL

free把空间还给系统

————————————————————————————————————————————————————

系统堆 heap(程序运行的时候分配储存空间)

______________________________________________________________________________________________________________________________


#include <math.h>

SWAP (x,y,t) ( (x)=( t )  ,  ( x )=( y )   ,  ( y ) = ( t )  ) ;

注意SWAP是大写

————————————————————————————————————————————————————

stdlib.h

rand ()%100


for(a-1,b-1 ;   ;  )

______________________________________________________________________________________________________________________________

C语言写  选择排序  

思路是: 

末尾设为min,前面的数中最小值和末尾进行替换


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAXSIZE 101
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))

void sort( int * List, int n )
{     
 int i,j,temp,min;
 
 min= List[n-1];
 

 for ( i= n-2 ;i > 0 ;i-- )
  {     if( List[i] < min  )  
        {   min =  List[i] ; 
           
		    j=i;
		}
         
      	
	 }   
	 	SWAP(List[j], List [n-1] ,temp );  
	 
}

  

int main(void)
{
   int List [MAXSIZE];  // []中常数,所以已经在开头定义过这个数 
   int import_n;
   int count;
   int count_2;
   int count_3;
   scanf("%d",&import_n) ;
   
   if(  import_n > MAXSIZE || import_n < 1 )
   {
       exit (0);   	
   }

    else 
    {
          for( count=0; count < import_n ;count ++ )
             {  List[count] =  rand () % 100;
			    printf ("%d ",List[count] );
			 } 
		       	
	}
	
	for(count_2=import_n ; count_2>0;count_2--)
	{
	sort ( List, count_2  ) ;
}
     printf("\n" );
	
    for ( count_2 = 0 ;  count_2  <  import_n ; count_2 ++   )
	 printf("%d ", List[count_2] );
	
	
}

————————————————————————————————————————————————————

C语言条件运算符使用                  http://c.biancheng.net/cpp/html/2912.html

  条件? a: b  

//条件成立返回 a,不成立返回b ,顺序从右向左,不清楚可以加上()   

————————————————————————————————————————————————————

用宏实现来比较 x,y 大小

#define CPMPARE(x,y) (    (  (x)<(y) )  -1  :  (   ( (x)==(y))  0 ? 1 )     ) 

______________________________________________________________________________________________________________________________

折半查找

如果是,返还这个数;否则返还 -1

  

#include<stdio.h>
#define COMPARE(x,y)   (       (x)<(y) ? -1: ( (x)==(y) ? 0 : 1 ))


int  binarysearch ( int *List ,int left ,int right ,int searchnumber )
{  int middle;  
    
	
while ( left < right )	
	
{
	middle = ( left + right )/2 ;
    switch ( COMPARE( searchnumber ,  List [middle]  )  )
        	{
        		case 1 :   left  = middle+1;
        		break;
        		
        		case 0 :   {
        			 left = right ;
					return List[middle];
				} 
        			
        		case -1 :	right = middle-1;
        		
			}
        	
        	
	}
}

int main (void)
{
	int arry_test[10]={1,2,3,4,5,6,7,8,9,10};
	
	//test  
	
	printf("%d" ,  binarysearch ( arry_test ,0 ,9,7)   );
	
	
}

————————————————————————————————————————————————————



    与If不同:(当做if使用,需要每一句后面加上break)

    当表达式的值与某个常量表达式的值相等时, 即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句

// default :          如case都不满足 ,执行此条件 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

☆递归算法

调用自身(直接递归)   调用其他函数(间接递归)

任何可以用赋值语句,if—else ,while 语句实现的函数,都是可以用 递归实现的,且通常实现比循环更易理解

工作:①建立递归停止条件  ② 实现递归调用,每次调用都应该向解决问题更近一步

#include<stdio.h>
#define COMPARE(x,y)   (       (x)<(y) ? -1: ( (x)==(y) ? 0 : 1 ))


int  binarysearch ( int *List ,int left ,int right ,int searchnumber )
{  int middle;  
    int q;
    
    
	middle = ( left + right )/2 ;
	
	
	if (  right <left )  //如果没有搜索到,返回 -2 
	        return -2;
   	
    switch ( COMPARE( searchnumber ,  List [middle]  )  )
        	{
        		case 1 :   {
				left  = middle+1;  /注意+1,如果不加1 ,没有找到的终止条件需要改变
				
				return binarysearch (List ,left ,right ,searchnumber) ;  }
        		
        		case 0 :   {
        			 
					return List[middle];
				} 
        			
        		case -1 :{
					
					right = middle-1;  //注意 -1
					return binarysearch (List ,left ,right ,searchnumber) ;  }
					 }  
        		    	
	}   

int main (void)
{
	int arry_test[10]={1,2,3,4,5,6,7,8,9,10};
	
	//test  
	
	printf("%d" ,  binarysearch ( arry_test ,0 ,9,0)   );
	
	
}


————————————————————————————————————————————————————


    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值