2016-03-29 12 views
-5

このコードは、配列の最初の要素がどれだけ最初の要素の後ろにあるかを示すポインタの配列をソートするために作成したものです。今私はコードを並べ替える(並べ替えソートまたは他の並べ替え)すべての行を自分で、最初の要素を保持する(彼は私たちに配列のサイズを教えているので)。大規模な配列の配列でfisrt配列をソートするコードですが、最後の配列(4,5,6,2,1)では機能しません。いずれかを助ける?関数の!(いない[と])でポインタのみを使用:)ポインタを使った2次元配列のソートコード

#include <stdio.h> 
#include <stdlib.h> 

#define LENGTH 5 

void sortArrayAfterFirstPlace(int* pointersArray[], int len); 
void printsMatrix(int* pointersArray[], int len); 
int main(void) 
{ 
    int firstArr[4] = { 3,9,6,7 }; 
    int secondArr[3] = { 2, 5, 5 }; 
    int thirdArr[1] = {0}; 
    int forthArr[2] = {1,6}; 
    int fifthArr[5] = {4,5,6,2,1}; 
    int* arrOfPointers[LENGTH] = { firstArr, secondArr,thirdArr,forthArr,fifthArr }; 
    sortArrayAfterFirstPlace(arrOfPointers,LENGTH); 
    printsMatrix(arrOfPointers,LENGTH); 
    system("PAUSE"); 
    return 0; 
} 

/* 
*/ 
void sortArrayAfterFirstPlace(int* pointersArray[], int len) 
{ 
    int i = 0,j=0,temp=0; 
    int min = 0; 
    int lengthOfFirstElement = 0; 
    for (i = 0; i < len; i++) 
    { 
     lengthOfFirstElement = *(*(pointersArray + i)); 
     for (j = i+1; j < lengthOfFirstElement; j++) 
     { 
      if (*(*(pointersArray + i) + j) > *(*(pointersArray + i) + j + 1)) 
      { 
       temp = *(*(pointersArray + i) + j); 
       *(*(pointersArray + i) + j) = *(*(pointersArray + i) + j + 1); 
       *(*(pointersArray + i) + j + 1) = temp; 
      } 
     } 

    } 
} 

/* 
*/ 
void printsMatrix(int* pointersArray[],int len) 
{ 
    int i = 0,j=0; 
    int lengthOfFirstElement = 0; 
    for (i = 0; i < len; i++) 
    { 
     lengthOfFirstElement = *(*(pointersArray+i)); 
     for (j = 0; j <lengthOfFirstElement+1; j++) 
     { 
      printf("%d ", *(*(pointersArray + i) + j)); 
     } 
     printf("\n"); 
    } 
} 
+1

は、あなたがこれまでのデバッグについて何かを聞いたことがあります... – LPs

+0

各アレイは、正しく並べ替えるために、2つの 'for'ループ(または類似した構造)を必要とします。束の配列をソートするには、3つの 'for'ループが必要です(配列をソートするために外側を選択し、内側を配列をソートします)。 *良いオプションは、関数内の内部ループを「隠す」ことです。 – pmg

答えて

0

あなたはこれらの配列へのポインタの配列をループでソートする各アレイにアクセスできるようにする必要があります。

ソートする配列ごとに、最初の要素[0]へのポインタを作成し、ソートする要素の数を取得する必要があります。 これで、数値の各配列をループし、ソートを行うために必要な情報が得られました。配列のアドレス&はソートする要素の数です。

単純なバブルソートを行う場合、2つのループは必要ありません - あなたのi & j - 配列内の1つの要素とそれに続く要素を比較するだけなので、すべての要素配列が最後に実行されたときにスワップされた要素がないことを示す場合、whileループで要素がスワップされていないことを示すフラグを使用できます。

外側のループがあります。各アレイ内でソートを行い、同じ外部ループアプローチを使用して印刷を行う必要があります。

void sortArrayAfterFirstPlace(int *aofptrs[], int len); 
void printout(int *aofptrs[], int len); 
int main(void) 
{ 
    int firstArr[4] = { 3,9,6,7 }; 
    int secondArr[3] = { 2, 5, 5 }; 
    int thirdArr[1] = {0}; 
    int forthArr[2] = {1,6}; 
    int fifthArr[5] = {4,5,6,2,1}; 
    int *arrOfPointers[LENGTH] = { firstArr, secondArr,thirdArr,forthArr,fifthArr }; 

    printout(arrOfPointers,LENGTH); 
    sortArrayAfterFirstPlace(arrOfPointers,LENGTH); 
    printout(arrOfPointers,LENGTH); 
} 

ソート配列の外側のループ:

void sortArrayAfterFirstPlace(int *aofptrs[], int len) 
{ 
    int arypt, *ptr, numberOfElements, i, sorted, temp; 

    /* loop through array of pointers to arrays) */ 
    for (arypt = 0; arypt < len; arypt++) { 
     /* get pointer to array to be sorted */ 
     ptr = *(aofptrs + arypt); 
     /* get number of elements to be sorted from element 0 */ 
     numberOfElements = *ptr; 
     /* sort array */ 
     while (1) { 
      sorted = 1; 
      for (i = 1; i < numberOfElements ; i++) { 

       // your sort goes here 
       // (*(ptr + i) accesses elements in the array 
       // (*(ptr + i + 1) access following element in array 
       // sorted = 0; if two elements were swapped 

      } 
      if(sorted == 1) break; // elements were all in order 
     } 
    } 
}