我正在學習結構體,聽說結構體允許您通過使用來復制所有內容=,因此我嘗試使用此屬性與指標組合對結構體進行排序,但是代碼顯然有問題,我不明白,應該怎么做我這樣做是因為這只是復制第 0 個索引處的指標所指向的結構,并將其放入結構陣列的每個元素。
列印排序的陣列只會拋出垃圾值,我一直無法完全掌握指向陣列的指標,如果有人能提供指向某些資源的鏈接,那就太好了。
結構體:
struct bankacc{
char name[20];
int accno;
float balance;
};
交換函式:
void bsortDesc(struct bankacc arr[], int n)
{
//int i, j;
//struct bankacc *temp=NULL;
//struct bankacc *ptr=arr;
struct bankacc *temp=NULL;
struct bankacc *ptr=arr;
for(int i=0;i<n;i =1){
for(;ptr<(arr n);ptr =1)
{
temp=ptr;
(ptr)=(ptr 1);
(ptr 1)=temp;
printf("temp name %s \n",temp->name);
printf("temp accno %d \n",temp->accno);
printf("temp name %f \n",temp->balance);
printf("\n_____________\n");
}
}
}
我也嘗試制作一個臨時變數并執行值交換,但它也不起作用,即
temp=*ptr;
ptr=(ptr 1);
*(ptr 1)=temp;
請幫助我
uj5u.com熱心網友回復:
要使用指向物件的指標交換結構型別的兩個物件,您可以撰寫如下內容
struct bankacc temp = *ptr;
*ptr = *( ptr 1 );
*( ptr 1 ) = temp;
注意這個 for 回圈
for(;ptr<(arr n);ptr =1)
由于運算式 ,可以在ptr等于時訪問陣列之外??的記憶體。arr n - 1ptr 1
uj5u.com熱心網友回復:
我看到你在談論排序,但實際上并不是排序。如果您需要對結構陣列進行排序,您可以使用qsort它將為您處理所有交換。
您應該首先撰寫一個排序函式(或多個),例如:
int compare_name(const void *p1, const void *p2)
{
const struct bankacc *acc1 = p1;
const struct bankacc *acc2 = p2;
return strcmp(acc1->name, acc2->name);
}
int compare_accno(const void *p1, const void *p2)
{
const struct bankacc *acc1 = p1;
const struct bankacc *acc2 = p2;
return acc1->accno - acc2->accno;
}
然后你可以使用排序qsort:
qsort(arr, n, sizeof *arr, compare_accno);
自己進行兩個索引的交換是一個很好的練習。為此,您可以使用:
void swap(struct bankacc *acc1, struct bankacc *acc2)
{
struct bankacc tmp;
tmp = *acc1;
*acc1 = *acc2;
*acc2 = tmp;
}
然后根據需要呼叫該函式,例如:
swap(&arr[3], &arr[8]);
uj5u.com熱心網友回復:
在您的代碼中, ptr 是一個指標。*ptr 是一個結構體。
所以這是您的示例代碼實際執行的操作:
- 它將 struct *ptr 復制到 temp。
- 它將指標 ptr 增加 1。
- 它將結構從 tmp 復制到 *(ptr 1)。
由于您在第 3 步之前將 ptr 增加了 1,因此 *ptr 中的內容已移至 *(原始 ptr 2)。第 2 步應該是 *ptr = *(ptr 1)。
根本不使用指標可能會更好。使用索引 size_t j 代替指標 ptr,并分配例如 tmp = arr[j]; arr[j]= arr[j 1]; arr[j 1] = tmp; 少了很多困惑。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/360386.html
