C程序将文件存储到锯齿状数组并对其进行排序

时间:2014-09-24 17:13:20

标签: c sorting jagged-arrays

我正在尝试创建C程序来读取文本文件并按升序对其进行排序。

是文本文件的示例
2
3; 2, 5, 7
6; 4, 7, 8, 9, 5, 2

第一行表示行数,";"之后的数字。指示元素每个行和元素由","分隔。 所以我的想法是创建一个动态锯齿状数组,以行作为第一个数字,然后将每一行指向具有元素的不同数组。首先排序指针数组,然后对每个数组的元素进行排序。这是我到目前为止所尝试的

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

int SortLists();

int main ()
{
    int i,j = 0;
    char filename[10];          //name of the file

    char line[100];
    int rows = 3;               //I have to initialized this to test my code first
    int cols;

    int **jaggedArr;                            //jagged array
    jaggerArr = malloc (rows*sizeof(int*))  ;

    printf("Enter the file name with .txt : ");
    scanf("%s", filename);  

    FILE *filePtr = fopen(filename, "r"); 

    int num;

    if (filePtr != NULL) 
    {       
        while (fgets(line, sizeof(line), filePtr) != NULL) //read each line of the text
        {               
            cols = atoi(strtok(line, ";"));     //use strtk to break elements
            for (i = 0; i < rows; i++)
            {
                for (j = 0; j < cols; j++)
                {
                    jaggedArr[i][j] = atoi(strtok(line, ","));  //parse into the jagged array                                   
                }
            }                           
        }       
    fclose(filePtr);    
    }
}


int SortLists(int list[], int size)     //sort method
{
    int i,j,temp;

    for (i = 0; i < size; ++i)
    {
        for (j = i + 1; j < size; ++j)
        {
            if (list[i] > list[j])
            {
                temp =  list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }
}

作为C语言的初学者,我不熟悉指针的概念,它与C#有很大不同。 抱歉我的英语不好,因为它不是我的第一语言。非常感谢你帮助我。

2 个答案:

答案 0 :(得分:1)

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

#define S_(x) #x
#define S(x) S_(x)

void SortLists(int list[], int size);

int main(void){
    char filename[FILENAME_MAX+1];
    char line[100];
    int rows, cols;

    printf("Enter the file name with .txt : ");
    scanf("%" S(FILENAME_MAX) "[^\n]%*c", filename);  
    FILE *filePtr = fopen(filename, "r");
    if(!filePtr)
        return EXIT_FAILURE;

    fscanf(filePtr, "%d ", &rows);
    int **jaggedArr;
    jaggedArr = malloc (rows * sizeof(int*));
    int *sizeArr = malloc(rows * sizeof(int));

    int r = 0, c;
    while (fgets(line, sizeof(line), filePtr) != NULL){
        sizeArr[r] = cols = atoi(strtok(line, ";"));
        jaggedArr[r] = malloc(cols * sizeof(int));
        for (c = 0; c < cols; ++c){
            jaggedArr[r][c] = atoi(strtok(NULL, ","));
        }
        SortLists(jaggedArr[r++], cols);
    }
    fclose(filePtr);
    //check print and deallocation
    for(r = 0;r < rows; ++r){
        for(c = 0; c < sizeArr[r]; ++c)
            printf("%d ", jaggedArr[r][c]);
        printf("\n");
        free(jaggedArr[r]);
    }
    free(jaggedArr);
    free(sizeArr);
    return 0;
}

void SortLists(int list[], int size){
    int i,j,temp;

    for (i = 0; i < size-1; ++i){
        for (j = i + 1; j < size; ++j){
            if (list[i] > list[j]){
                temp =  list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }
}

答案 1 :(得分:0)

提出额外问题。

#include <stdio.h> 

void SortLists(int list[], int size);
void SortRows(int *jaggedArr[], int size, int *rowSize);

int main(void){
    int row1[] = {4,7,8,9,5,2};
    int row2[] = {2,5,7};
    int *jaggedArr[] = { row1, row2};
    int rows = 2;
    int sizeArr[] = {6,3};
    int i, r, c;
    for(i=0;i<rows;++i)
        SortLists(jaggedArr[i], sizeArr[i]);
    for(r = 0;r < rows; ++r){
        for(c = 0; c < sizeArr[r]; ++c)
            printf("%d ", jaggedArr[r][c]);
        printf("\n");
    }
    printf("\n");
    SortRows(jaggedArr, rows, sizeArr);
    for(r = 0;r < rows; ++r){
        for(c = 0; c < sizeArr[r]; ++c)
            printf("%d ", jaggedArr[r][c]);
        printf("\n");
    }
    return 0;
}

void SortLists(int list[], int size){
    int i,j,temp;

    for (i = 0; i < size-1; ++i){
        for (j = i + 1; j < size; ++j){
            if (list[i] > list[j]){
                temp =  list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }
}
void SortRows(int *jaggedArr[], int size, int *rowSize){
    int i,j,temp,*tempp;

    for (i = 0; i < size-1; ++i){
        for (j = i + 1; j < size; ++j){
            if (rowSize[i] > rowSize[j]){
                //swap in pairs
                temp =  rowSize[i];
                rowSize[i] = rowSize[j];
                rowSize[j] = temp;
                tempp =  jaggedArr[i];
                jaggedArr[i] = jaggedArr[j];
                jaggedArr[j] = tempp;
            }
        }
    }

}

#include <stdio.h> 

void SortLists(int list[], int size);
void SortRows(int *jaggedArr[], int size);

int main(void){
    int row1[] = {6, 4,7,8,9,5,2};//The first element represents the number of elements.
    int row2[] = {3, 2,5,7};
    int *jaggedArr[] = { row1, row2};
    int rows = 2;
    //int sizeArr[] = {6,3};//Not required
    int i, r, c;
    for(i=0;i<rows;++i)
        SortLists(jaggedArr[i]+1, jaggedArr[i][0]);

    SortRows(jaggedArr, rows);
    for(r = 0;r < rows; ++r){
        for(c = 1; c <= jaggedArr[r][0]; ++c)
            printf("%d ", jaggedArr[r][c]);
        printf("\n");
    }
    return 0;
}

void SortLists(int list[], int size){
    int i,j,temp;

    for (i = 0; i < size-1; ++i){
        for (j = i + 1; j < size; ++j){
            if (list[i] > list[j]){
                temp =  list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }
}
void SortRows(int *jaggedArr[], int size){
    int i,j,*tempp;

    for (i = 0; i < size-1; ++i){
        for (j = i + 1; j < size; ++j){
            if (jaggedArr[i][0] > jaggedArr[j][0]){
                tempp =  jaggedArr[i];
                jaggedArr[i] = jaggedArr[j];
                jaggedArr[j] = tempp;
            }
        }
    }

}