C程序存储文件锯齿阵列和排序它

问题描述:

我想创建C程序来读取文本文件并按升序排序。文本文件的例子是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#有很多不同。 对不起,我的英语不好,因为它不是我的第一语言。非常感谢你帮助我。

+1

反复'的strtok(行 “”)'不会做你想做的。由';'分隔的开启者看起来很有希望,但是行处理的其余部分应该用'strtok(NULL,',')'完成。也许为这些行分配一些*内存* – WhozCraig 2014-09-24 17:19:04

+0

感谢您花时间回答我的问题。通过分配内存,你的意思是使用行中元素的数量来初始化数组的大小? – user4075830 2014-09-24 17:54:08

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

谢谢你帮助我。请问,'fscanf'(filePtr,“%d”,&rows);''获得文本的行号,因为它是文本文件中的第一个数字吗?另外,什么是指针'* sizeArr'呢?尝试使用文本文件运行你的代码,但它的工作不正常,所以这里一定缺少一些东西 – user4075830 2014-09-24 18:38:46

+0

@ user4075830 _it是文本文件中的第一个数字_是的_什么是指针* sizeArr的做法?_你需要保持大小因为每一行的大小不同 – BLUEPIXY 2014-09-24 18:51:28

+0

@ user4075830 [DEMO](http://ideone.com/9GFx54) – BLUEPIXY 2014-09-24 18:55:49

对于额外的问题。

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

}