算法筆記基礎(指針使用)

指針使用練習swap
經典例子
兩個數的交換
1)值交換

#include<stdio.h>
void swap1(int a,int b){
    int tmp = a;
    a = b;
    b = tmp;
    //副本內部交換 無效
    printf("here a:%d,b:%d\n",a,b);
}
int main(){
    int a = 12;
    int b = 13;
    swap1(a,b);//
    printf("a:%d b:%d",a,b);
    return 0;
}

使用指針實現真正的交換

#include<stdio.h>
//兩個數的交換
void change(int *x,int *y){
//x,y 得到地址,分別指向a,b進行操作
    int tmp = *x;//tmp存儲值
    *x = *y;//*運算 取到值 之後正常交換 
    *y = tmp;
}
int main(){
    int a,b;
    scanf("%d%d",&a,&b);
    change(&a,&b);//傳入地址
    printf("%d %d\n",a,b);
    return 0;
}

在函數中交換兩者的地址??地址本質上也是無符號整數,因此可看作數值,我們知道傳入數值時相當於在函數內對副本進行交換,不會在主函數實際地交換值,那麼交換地址也是無效的。
代碼如下:

void swap2(int *a ,int *b){
    int *tmp = a;
    a = b;
    b = tmp;
  
}

引用的使用:引用直接指向調用它的對象

#include<stdio.h>
void change(int &x){//引用  指向原變量的修改
    x = 11;
}
int main(){
    int a = 10;
    change(a);//a的值改變
    printf("%d",a);
    return 0;
}

#include<stdio.h>
void swap2(int* &a ,int* &b){
  //這裏引用指向p,q指針,使用引用對指針真正的修改
    int *tmp = a;//交換指針變量,加引用
    a = b;
    b = tmp;
    //交換地址  只是副本
}
int main(){
    int a = 12;
    int b = 13;
    int *p = &a;
    int *q = &b;
    swap2(p,q);//利用指針交換,交換兩個值
    printf("a:%d b:%d",*p,*q);
    return 0;
}

三個數由大到小的排序

#include<stdio.h>
void line(int *x,int *y,int *z){
    //兩兩比較,若前面的數比後面的數小 則交換到後面去
    if(*x < *y){
        int tmp1 = *x;
        *x = *y;
        *y = tmp1;
    }
    if(*y < *z){
        int tmp2 = *y;
        *y = *z;
        *z = tmp2;
    }//最大的交換到最後一個位置
     if(*x < *y){
        int tmp3 = *x;
        *x = *y;
        *y = tmp3;
    }
    //前面兩個的最終比較
}
int main(){
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    line(&a,&b,&c);
    printf("%d %d %d\n",a,b,c);
    return 0;
}

三個字符串由小到大排序 類似於三個數的思想

#include<stdio.h>
#include<string.h>
void swap3(char *x,char *y){
    //兩兩交換
    char tmp[20];
    strcpy(tmp,x);
    strcpy(x,y);
    strcpy(y,tmp);

}
int main(){
    char a[20];
    char b[20];
    char c[20];
    gets(a);
    gets(b);
    gets(c);
    if(strcmp(a,c)>0){
        swap3(a,c);
    }
    if(strcmp(b,c)>0){
        swap3(b,c);
    }//保證最大的放在最後,對前兩個進行排序
    if(strcmp(a,b)>0){
        swap3(a,b);
    }
    puts(a);
    puts(b);
    puts(c);
    return 0;
}

將數組中的最小值與第一個數交換,將數組中的最大值與最後一個數交換

#include<stdio.h>
void funcin(int *a){
    for(int i=0;i<10;i++){
        scanf("%d",a+i);
    }
}
void change(int *a){
    int minx = a[0];
    int maxx = a[0];
    for(int i = 1;i<10;i++){
        //**找最小值的方法:先找最小值,再遍歷最小值所在位置,互換**
        if(a[i] < minx){
            minx = a[i];
        }

    }
    for(int j=1;j<10;j++){
        if(*(a+j)==minx){
                //交換
            int tmp = *a;
            *a = *(a+j);
            *(a+j) = tmp;
        }
    }
  //對於最大值
    for(int i = 1;i<=9;i++){
        if(a[i] > maxx){
            maxx = a[i];
        }

    }
    for(int j=1;j<=9;j++){
        if(*(a+j)==maxx){
            int tmp = *(a+9);
            *(a+9) = *(a+j);
            *(a+j) = tmp;
        }
    }
}
void funcout(int *a){
    for(int i=0;i<10;i++){
            if(i==9){
                printf("%d\n",*(a+i));
            }
            else{
                printf("%d ",*(a+i));
            }
    }
}
int main(){
    int a[10];
    funcin(a);
    change(a);
    funcout(a);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章