假設我有兩個陣列 intdataArray[10] = {61 34 46 114 73 29 13 93} 和 int *pointerDataArray[10] ,它們的 dataArray 的指標位于相同的相應索引中。我如何能夠通過指標對陣列進行排序并獲得排序后的陣列,同時仍然能夠列印原始陣列。
我的冒泡排序正在作業,但它也在改變 dataArray。
這是想要的輸出(正確)
排序前的資料陣列:61 34 46 114 73 29 13 93
排序前的指標陣列:61 34 46 114 73 29 13 93
排序后的資料陣列:61 34 46 114 73 29 13 93
排序后的指標陣列:13 29 34 46 61 73 93 114
這是我得到的輸出(錯誤)
排序前的資料陣列:61 34 46 114 73 29 13 93
排序前的指標陣列:61 34 46 114 73 29 13 93
排序后的資料陣列:13 29 34 46 61 73 93 114
排序后的指標陣列:13 29 34 46 61 73 93 114
這是我的代碼
#include <iostream>
#include <fstream>
using namespace std;
int readFile(string filename, int dataArray[10], int *pointerDataArray[10]);
void pointerSort(int dataArray[],int *pointerDataArray[] , int length);
void swapIntPtr(int *p1, int *p2);
void displayDataArray(int dataArray[], int length);
void displayPointerArray(int *pointerDataArray[], int length);
int main() {
int dataArray[10] = {};
int *pointerDataArray[10];
int length = readFile("arrayData.txt", dataArray, pointerDataArray);
cout << "dataArray before sort: ";
displayDataArray(dataArray, length);
cout << "pointerArray before sort: ";
displayPointerArray(pointerDataArray, length);
cout << endl;
pointerSort(dataArray, pointerDataArray, length);
cout << "dataArray after sort: ";
displayDataArray(dataArray, length);
cout << "pointerArray after sort: ";
displayPointerArray(pointerDataArray, length);
}
int readFile(string filename, int dataArray[10], int *pointerDataArray[10]) {
ifstream inputFile(filename);
if (inputFile.is_open()) {
int length;
inputFile >> length;
for (int i = 0; i < length; i ) {
inputFile >> dataArray[i];
pointerDataArray[i] = &dataArray[i];
}
return length;
}
return -1;
}
void pointerSort(int dataArray[],int *pointerDataArray[] , int length){
int i, j;
for (i = 0; i < length-1; i )
for (j = 0; j < length-i-1; j )
if (dataArray[j] > dataArray[j 1]) {
swapIntPtr(&dataArray[j], &dataArray[j 1]);
}
}
void swapIntPtr(int *pointer1, int *pointer2) {
int pSwap = *pointer1;
*pointer1 = *pointer2;
*pointer2 = pSwap;
}
void displayDataArray(int dataArray[], int length){
for (int i = 0; i < length; i ) {
cout << dataArray[i] << " ";
}
cout << endl;
}
void displayPointerArray(int *pointerDataArray[], int length){
for (int i = 0; i < length; i ) {
cout << *pointerDataArray[i] << " ";
}
}
uj5u.com熱心網友回復:
在您的pointerSort函式中,您在swapIntPtr兩個整數的地址中呼叫該函式。它實際上改變了指標后面的內容,即交換整數。相反,您想使用指標的地址呼叫 swapIntPtr,并且函式需要更改指標。
void swapIntPtr(int **pointer1, int **pointer2) {
int* pSwap = *pointer1;
*pointer1 = *pointer2;
*pointer2 = pSwap;
}
Aso,請務必更改頂部的宣告。
然后,您需要更改排序函式以在 pointerDataArray 上運行
void pointerSort(int dataArray[],int *pointerDataArray[] , int length){
int i, j;
for (i = 0; i < length-1; i )
for (j = 0; j < length-i-1; j )
if (*pointerDataArray[j] > *pointerDataArray[j 1]) {
swapIntPtr(&pointerDataArray[j], &pointerDataArray[j 1]);
}
}
完整的代碼如下所示:
#include <iostream>
#include <fstream>
using namespace std;
int readFile(string filename, int dataArray[10], int *pointerDataArray[10]);
void pointerSort(int dataArray[],int *pointerDataArray[] , int length);
void swapIntPtr(int **p1, int **p2);
void displayDataArray(int dataArray[], int length);
void displayPointerArray(int *pointerDataArray[], int length);
int main() {
int dataArray[10] = {};
int *pointerDataArray[10];
int length = readFile("arrayData.txt", dataArray, pointerDataArray);
cout << "dataArray before sort: ";
displayDataArray(dataArray, length);
cout << "pointerArray before sort: ";
displayPointerArray(pointerDataArray, length);
cout << endl;
pointerSort(dataArray, pointerDataArray, length);
cout << "dataArray after sort: ";
displayDataArray(dataArray, length);
cout << "pointerArray after sort: ";
displayPointerArray(pointerDataArray, length);
}
int readFile(string filename, int dataArray[10], int *pointerDataArray[10]) {
ifstream inputFile(filename);
if (inputFile.is_open()) {
int length;
inputFile >> length;
for (int i = 0; i < length; i ) {
inputFile >> dataArray[i];
pointerDataArray[i] = &dataArray[i];
}
return length;
}
return -1;
}
void pointerSort(int dataArray[],int *pointerDataArray[] , int length){
int i, j;
for (i = 0; i < length-1; i )
for (j = 0; j < length-i-1; j )
if (*pointerDataArray[j] > *pointerDataArray[j 1]) {
swapIntPtr(&pointerDataArray[j], &pointerDataArray[j 1]);
}
}
void swapIntPtr(int **pointer1, int **pointer2) {
int* pSwap = *pointer1;
*pointer1 = *pointer2;
*pointer2 = pSwap;
}
void displayDataArray(int dataArray[], int length){
for (int i = 0; i < length; i ) {
cout << dataArray[i] << " ";
}
cout << endl;
}
void displayPointerArray(int *pointerDataArray[], int length){
for (int i = 0; i < length; i ) {
cout << *pointerDataArray[i] << " ";
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/431674.html
