2012-10-09 105 views
0

下面是我的代碼:快速排序的結構C

我似乎無法有效地使用快速排序......事實證明我的數組0的它們與名稱填充和開始時間後......它是一個問題我qsort電話?或qsort本身。

頭與結構如下:

/** 
* Simulation of a process scheduler 
*/ 

//#ifndef SCHEDULER_H_ 
#define SCHEDULER_H_ 

#include <stddef.h> 
#include <errno.h> 
#include <limits.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <ctype.h> 


/* types */ 
/** units of time */ 
typedef long time; 
/** process identifier */ 
typedef int pid; 

/** Information about a job of interest to the task scheduler */ 
struct job_data { 

/* pid of this process */ 
    pid pid; 
    /* time process starts */ 
    time start; 
    /* time needed to finish */ 
    time finish; 
    /* time spent processing so far */ 
    time scheduled; 
    /* Number of lines */ 
    int lines; 

}; 

struct job { 

    /* Various parameters used by the scheduler */ 
    char job_id[20]; 
    struct job_data parameters; 
    char *lines[20]; 


}; 




     /* I/O Files */ 
     //static char *inputFile; 
     char * in; 
     static FILE *input; 
     static FILE *cur; 
     /*Scheduled jobs indexed by PID*/ 
     struct job list[20]; 

     /* the next job to schedule */ 
     //static struct job *job_next = NULL; 

     /* Time */ 
     time clock; 

     /*Comparison for qsort*/ 
     int compare_start(const void *x, const void *y) 
     { 
      const struct job *a = x; 
      const struct job *b = y; 

       printf("%ld, %ld\n", a->parameters.start, b->parameters.start); 

      if (a->parameters.start < b->parameters.start) 
      { 
         return -1; 
      } 
      if (a->parameters.start > b->parameters.start) 
      { 
        return 1; 
      } 

      return 0; 

     } 

     /*Order Jobs*/ 
     static void order_jobs(void) 
     { 

      qsort(list, (sizeof list)/(sizeof list[0]), sizeof list[0], compare_start); 

     } 


     /** Read and parse input from input file */ 
     static void parse_input(void) 
     { 
      char buffer[BUFSIZ]; 
      char lines[BUFSIZ]; 
      int jobs = 0; 
      struct job *current; 





      while(fgets(buffer, sizeof(buffer), input)) 
      { 


       time start; 
       char buf[BUFSIZ]; 
       sscanf(buffer,"./%s/", buf); 
       cur = fopen(buf, "r"); 

       int n_lines = 0; 


       while(fgets(lines, sizeof(lines), cur)) 
       { 


        if(n_lines == 0) 
        { 
         current = &list[jobs]; 
         strcpy(current->job_id, buf); 
         sscanf(lines,"%ld", &start); 
         current->parameters.start = start;    
        }  

        n_lines++; 
       } 
       current->parameters.lines = n_lines; 

       jobs++; 

       fclose(cur); 

      } 
      order_jobs(); 
      for (int i = 0; i < jobs; i++) 
      { 
       printf("%s %ld %d\n", list[i].job_id, list[i].parameters.start, list[i].parameters.lines); 
      } 

     } 

int main(int argc, char **argv) 
{ 
    in = argv[1]; 
    if ((input = fopen(in, "r")) == NULL) { 
     fprintf(stderr, "cannot open %s\n", argv[1]); 
    } 

    parse_input(); 

    fclose(input); 

    return EXIT_SUCCESS; 
} 
+0

您應該只發布代碼的相關部分。試着更具體地說明你的問題。 – Constantinius

+0

有關@Constantinius的含義的更詳細解釋,請閱讀本網站關於[簡短,獨立,正確(可編譯),示例](http://sscce.org/)。例如:你的例子依賴於複雜的結構,你是否可以用一個或兩個字段的結構演示類似的問題?你可以寫一個不能做I/O的版本,但是仍然可以證明這個問題?你無論如何都得到了答案,但是*對未來來說,遵循這些方法是一個好主意,你可以在這個過程中自己找到自己的吸菸槍...... – HostileFork

回答

5

你只負載jobs條目到陣列中,但你告訴qsort()到整個陣列(20種元素)進行排序。這可能會將未初始化的元素放在前面,然後打印出來。

+0

你的傳奇......我花了很多時間並希望爲觀衆提供儘可能多的信息! –