2017-04-26 190 views
0
#include <stdio.h> 
#include <stdlib.h> 

void printingArr(int** arr, int rows); 
void sortingEachOneOfThem(int** pArr, int rows); 
void sortingTheWholeArray(int** pArr, int rows); 
void bubbleSort(int* arr); 
void freeArray(int **a, int m); 

int main(void) 
{ 
    int** pArr = 0; 
    int numOfRows = 0; 
    int sizes = 0; 
    printf("Enter number of rows: "); 
    scanf("%d", &numOfRows); 
    pArr = (int**) malloc(sizeof(int*) * numOfRows); 
    if (pArr == NULL) 
    { 
     printf("Unsuccessful malloc!\n"); 
     return 1; 
    } 

    for (int i = 0; i < numOfRows; i++) 
    { 
     printf("Enter array length for row %d: ",i); 
     scanf("%d", &sizes); 
     pArr[i] = (int*) malloc(sizeof(int) * sizes + 1); 
     if (pArr[i] == NULL) 
     { 
      printf("Unsuccessful malloc!\n"); 
      return 1; 
     } 
     pArr[i][0] = sizes; 
     for (int k = 1; k < sizes + 1; k++) 
     { 
      printf("Enter value for array: "); 
      scanf("%d", &pArr[i][k]); 
     } 
    } 
    printingArr(pArr, numOfRows); 
    sortingEachOneOfThem(pArr, numOfRows); 
    printingArr(pArr, numOfRows); 
    sortingTheWholeArray(pArr, numOfRows); 
    printingArr(pArr, numOfRows); 


    for (int i = 0; i < numOfRows; i++) 
    { 
     if (pArr[i] != NULL) 
     { 
      free(*(pArr + i)); 
     } 
    } 
    //free(pArr); 

    system("pause"); 
    return 0; 
} 
/* 
this amazing, wonderfull piece of program prints the array given 
input: int** arr, int rows 
output: none 
*/ 
void printingArr(int** arr, int rows) 
{ 
    int i = 0; 
    int k = 0; 
    for (i = 0; i < rows; i++) 
    { 
     for (k = 0; k <= arr[i][0]; k++) 
     { 
      printf("%d ", arr[i][k]); 
     } 
     printf("\n"); 
    } 
    printf("\n"); 
} 
/* 
This beautiful function sorts the whole array, but its length of rows like a pyramid 
input: int** arr, int rows 
output: none 
*/ 
void sortingTheWholeArray(int** pArr, int rows) 
{ 
    int* temp = 0; 
    int i = 0, k = 0; 
    for (i = 0; i < rows - 1; i++) 
    { 
     for (k = 0; k < rows - 1; k++) 
     { 
      if (pArr[k][0] > pArr[k + 1][0]) 
      { 
       temp = pArr[k]; 
       pArr[k] = pArr[k + 1]; 
       pArr[k + 1] = temp; 
      } 
     } 
    } 
} 
/* 
This little small function sorts every row of the array of arrays given to it 
input: int** arr, int rows 
output: none 
*/ 

void sortingEachOneOfThem(int** pArr, int rows) 
{ 
    int i = 0; 
    for (i = 0; i < rows; i++) 
    { 
     bubbleSort(pArr[i]); 
    } 
} 

/* 
This little piece of a code is a bubble sort, sorts the array given to it :) 
input: int* arr, int rows 
output: none 
*/ 

void bubbleSort(int* arr) 
{ 
    int i = 1, k = 0; 
    for (i = 1; i < arr[0] - 1; i++) 
    { 
     for (k = 1; k <= arr[0] - i; k++) 
     { 
      if (arr[k] > arr[k + 1]) 
      { 
       arr[k] += arr[k + 1]; 
       arr[k + 1] = arr[k] - arr[k + 1]; 
       arr[k] -= arr[k + 1]; 
      } 
     } 
    } 
} 

自由末崩潰我的代碼,顯示此錯誤: https://i.stack.imgur.com/nqxBG.png 另一個代碼免費的()函數的用法相同的工作不錯,但不是在這裏。我試圖通過逐步模式運行它,它在第一次免費時崩潰。 Dr.記憶顯示:https://i.stack.imgur.com/rSZJr.png 另一個鏈接:https:// i.stack。 imgur.com/ZX2Ne.png(粘貼時沒有空格,不能超過2個鏈接) 我該怎麼辦?下分配免費()崩潰的代碼

pArr[i] = (int*) malloc(sizeof(int) * sizes + 1); 

+3

將文本發佈爲文本本身,而不是圖像。 –

+0

使用二維數組代替指針數組,所有這些錯誤都會自動消失。這裏沒有明顯的需要使用指針數組。 – Lundin

回答

4

此。將單個字節添加到int數組的大小是沒有意義的。你大概的意思是:

pArr[i] = malloc((sizes + 1) * sizeof *pArri[i]); 

不要投的malloc()返回值,並在左側使用sizeof

+0

謝謝,它工作。但爲什麼我不應該使用malloc()的返回值呢?我們的老師告訴我們這樣做,這是一個約定 – Lidor

+0

@Lidor你可以[看到這個答案](http://stackoverflow.com/a/605858/28169)爲什麼。如果這是您的慣例,我想您必須這樣做,但是當您發佈代碼時,我無法知曉。 :)另外,我會說這是一個不好的約定,應該改變,因爲在相關答案中給出的原因。 – unwind