2012-10-09 101 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

你的传奇......我花了很多时间并希望为观众提供尽可能多的信息! –