【问题标题】:C program store file to jagged array and sort itC程序将文件存储到锯齿状数组并对其进行排序
【发布时间】:2014-11-19 06:58:56
【问题描述】:

我正在尝试创建 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# 有很大不同。 对不起我的英语不好,因为它不是我的第一语言。非常感谢你帮助我。

【问题讨论】:

  • 重复的strtok(line, ",") 不会做你想做的事。由';' 分隔的开瓶器看起来很有希望,但行处理的其余部分应使用strtok(NULL, ',') 完成。也许为这些行分配一些内存
  • 感谢您花时间回答我的问题。通过分配内存,你的意思是使用行中的元素数来初始化数组的大小吗?

标签: c sorting jagged-arrays


【解决方案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;
            }
        }
    }
}

【讨论】:

  • 感谢您帮助我。请问,fscanf(filePtr, "%d ", &amp;rows); 行是否获取文本的行号,因为它是文本文件中的第一个数字?另外,指针*sizeArr 是做什么的?我尝试使用文本文件运行您的代码,但它无法正常工作,所以这里肯定缺少一些东西。
  • @user4075830 它是文本文件中的第一个数字 是的。 指针 *sizeArr 是做什么的? 你需要保持大小,因为每一行的大小不同。
  • 感谢您的回答。如果我想先对数组中的元素进行排序怎么办?我尝试SortLists(jaggedArr[sizeArr [i]],rows); 但它不起作用。
  • @user4075830 for(i=0;i&lt;rows;++i)SortLists(jaggedArr[i], sizeArr[i]); 划分排序过程时。输入后不能在输入元素前面。 (在while循环之后)
  • 划分排序过程是什么意思?很抱歉问了这么多无聊的问题
【解决方案2】:

额外的问题。

#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;
            }
        }
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 2023-01-10
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    • 2011-03-27
    • 2020-12-21
    相关资源
    最近更新 更多