指標是不能直接進行異或運算的,需要將指標轉換成整型int或long,在Linux系統下只能是long,因為指標在win系統占4個位元組,在Linux系統占6個位元組,
以下為兩個指標的異或運算實作指標的交換:
#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系統中的運行結果為:
a:0x7ffc70da4cf0 b:0x4004e0 a:0x4004e0 b:0x7ffc70da4cf0
因此我們可以看到,交換兩個值也不一定只能借助臨時變數,異或運算也是一種選擇,
以上代碼來源于:https://blog.csdn.net/weixin_39666151/article/details/90731384
下面附上對線性表的置逆操作,使用單鏈表實作:
#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; }
下面附上線性表的置逆,用順序表實作
#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; }
對上述單鏈表的操作好好參悟參悟
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80716.html
標籤:C++
