指針的異或運算可用於交換兩個變量的值

指針是不能直接進行異或運算的,須要將指針轉換成整型int或long,在Linux系統下只能是long,由於指針在win系統佔4個字節,在Linux系統佔6個字節。node

如下爲兩個指針的異或運算實現指針的交換:ios

    #include <stdio.h>
    
    int main()
    {
        int *a,*b;
        unsigned long aa,bb;
    
        printf("a:%p\n", a);
        printf("b:%p\n", b);
    
        aa = (unsigned long)a;    //a變量指針轉換成整型
        bb = (unsigned long)b;    //b變量指針轉換成整型
  
        printf("\n");
    
        aa ^= bb;
        bb ^= aa;    //此時bb=aa
        aa ^= bb;    //此時aa=bb
    
        a = (int *)aa;        //aa變量指針轉換成指針類型
        b = (int *)bb;        //bb變量指針轉換成指針類型
    
        printf("a:%p\n", a);
        printf("b:%p\n", b);
       
        return 0;
    }

在Linux 64系統中的運行結果爲:c++

    a:0x7ffc70da4cf0
    b:0x4004e0
    
    a:0x4004e0
    b:0x7ffc70da4cf0

所以咱們能夠看到,交換兩個值也不必定只能藉助臨時變量,異或運算也是一種選擇。數組

以上代碼來源於:https://blog.csdn.net/weixin_39666151/article/details/90731384函數

下面附上對線性表的置逆操做,使用單鏈表實現:spa

#include<iostream>
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef struct
{
    int len;
    int *next;
    //int listsize;//該項爲順序表的大小,本題不要求 
}node;

//置逆函數 
void Inverse(node *list)
{
    for(int i = 0;i < list->len / 2;i++)//第一個元素與最後一個元素交換,第二個元素與倒數第二個元素交換,以此類推,只要進行到表的一半便可,也能夠用臨時變量來交換數值,這樣作須要增長額外的存儲空間,^表示異或運算 
    {
        list->next[i] = list->next[i]^list->next[list->len - i - 1];
        list->next[list->len - i - 1] = list->next[i]^list->next[list->len - i - 1];
        list->next[i] = list->next[i]^list->next[list->len - i - 1];
    }

}

void Print(node *list)
{
    for(int i = 0;i < list->len;i++)//遍歷 
        cout << list->next[i] << " ";
    cout << endl;
}


signed main()//主函數,順序表的初始化及銷燬直接在主函數中實現了 
{
    int i = 0;
    node *list;//定義一個結構體node指針 
    list = (node *)malloc(sizeof(node));//爲該指針動態申請存儲空間 
    
    cout << "請輸入元素個數:";
    cin >> list->len;//輸入順序表的長度 
    list->next = (int *)malloc(sizeof(int)*list->len);//爲固定好長度的順序表動態申請存儲空間 ,強制轉換爲int型,以後再置逆的過程當中可以使用異或運算符,指針自己不能使用異或運算 
    
    cout << "請輸入元素:";
    for(i = 0;i < list->len;i++)//循環輸入元素,用指針數組存儲 
        cin >> list->next[i];
    
    cout << "置逆前的表爲:";
    Print(list);//自定義函數輸出 
    Inverse(list);//置逆操做 
    cout << "置逆後的表爲:";
    Print(list);//輸出置逆後的 
    
    free(list->next);//釋放開闢的空間,不要忘記結構體中的指針 
    free(list);
    
    return 0;
}

下面附上線性表的置逆,用順序表實現.net

#include<iostream>
#define int long long
#include<map>
using namespace std;

signed main()
{
    int n;
    int vis[100];
    cin >> n;
    for(int i = 1;i <= n;i++)
        cin >> vis[i];
    int i = 1;
    int j = n;
    while(i < j)
    {
        int temp;
        temp = vis[i];
        vis[i] = vis[j];
        vis[j] = temp;
        i++;
        j--;
    }
    for(int i = 1;i <= n;i++)
        cout << vis[i] << " ";
    cout << endl;    
    return 0;
}

對上述單鏈表的操做好好參悟參悟指針

相關文章
相關標籤/搜索