したがって、ユーザーから整数の行列を初期化し、さまざまな方法で配列をソートし、動的メモリを使用するこの単純なコードがあります。
#include <stdio.h>
#include <stdlib.h>
void initArrays();
void printArr(int** matrix, int rows);
void sortArr(int** matrix,int rows);
void printByOrder(int** matrix,int rows);
int main(void)
{
initArrays();
system("Pause");
return 0;
}
void initArrays()
{
int i = 0;
int j = 0;
int * arr = 0;
int len = 0;
int** matrix = 0;
int rows = 0;
printf("Enter number of rows: ");
scanf("%d", &rows);
matrix = (int**)malloc(rows * sizeof(int));
for (i = 0; i < rows; i++)
{
printf("Enter array length for row %d: ", i);
scanf("%d", &len);
arr = (int*)malloc(len * sizeof(int));
arr[0] = len;
for (j = 0; j < len; j++)
{
printf("Enter value for array: ");
scanf("%d",arr + j + 1);
}
matrix[i] = arr;
}
printArr(matrix, rows);
sortArr(matrix,rows);
printByOrder(matrix, rows);
free(matrix);
free(arr);
}
void printArr(int** matrix, int rows)
{
int i = 0;
int j = 0;
printf("Printing:\n");
for (i = 0; i < rows; i++)
{
for (j = 0; j <= matrix[i][0];j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
void sortArr(int ** matrix, int rows)
{
int i = 0;
int j = 0;
int k = 0;
int* arr = 0;
int pos = 0;
int swap = 0;
for (i = 0; i < rows; i++) //getting a single arr to work with.
{
arr = matrix[i];
for (j = 1; j < arr[0]; j++)
{
pos = j;
for (k = j + 1; k <= arr[0]; k++) //selection sort.
{
if (arr[pos] > arr[k])
{
pos = k;
}
}
if (pos != j)
{
swap = arr[j];
arr[j] = arr[pos];
arr[pos] = swap;
}
}
}
matrix[i] = arr;
printf("Sorted Rows: \n");
for (i = 0; i < rows; i++)
{
for (j = 1; j < matrix[i][0] + 1; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
void printByOrder(int** matrix, int rows)
{
int i = 0;
int j = 0;
int smallest = 0;
int pos = 0;
int* swap = 0;
for (j = 0; j < rows - 1; j++)
{
pos = j;
for (i = j + 1; i < rows; i++) //selection sort.
{
if (matrix[pos][0] > matrix[i][0])
{
pos = i;
}
}
if (pos != j)
{
swap = matrix[j];
matrix[j] = matrix[pos];
matrix[pos] = swap;
}
}
printf("Ordered Array: \n");
for(i = 0; i < rows; i++)
{
for (j = 1; j < matrix[i][0] + 1; j++)
{
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
私の唯一の問題は、free
関数が実行されると、プログラムが「通常のブロック #63 の後にヒープ破損が検出されました」というエラーでクラッシュするfree
ことです。いろいろと検索してみましたが、なぜこのエラーが発生するのかわかりませんでした。誰かが私にそれを説明できますか?ありがとう!
Valgrind ( http://valgrind.org/ を参照) は、次の問題を示しています。
scanf("%d",arr + j + 1);
ライン。
最初の位置の長さを割り当てサイズを維持したい場合:
arr = (int*)malloc(len * sizeof(int));
が小さすぎます (int
長さ自体にもう 1 つ必要です)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加