1

我有一个文本文件,其名称后跟一个数字,即名称的优先级,现在我正在尝试按优先级对文本文件进行排序并编写一个新文件。

old
name1 1
name2 2
name3 3
name4 1
name5 1
name6 2 
name7 1
name8 3

new
name 1 1
name4 1
name5 1
name2 2
name6 2
name3 3
name8 3

我已经实现了将旧文本文件放入数组中,但我坚持按优先级对该数组进行排序。我不应该再次遍历文件,只想对数组进行排序,然后将新排序的数组写入新的文本文件。我该如何进行??

编码

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


typedef struct{
    int p;
    char *name;
}names;

int main(void){
    FILE *old= fopen("old.txt", "r");
    FILE *new = fopen("new.txt", "w");

    char n[10];
    int i =0;

    names *name= malloc(sizeof(names));

    for(i; i<count; i++){
        int p;

        char *n= malloc(sizeof(char) * 4); 
        fscanf(old, "%s %i", n, &p); 

        names[i].name= n; 
        names[i].p= p;

    }
    int j=0;

    for(i=0; i < count;i++){

    }

    return 0;
}
4

2 回答 2

1

qsort()您应该使用标准库函数进行排序。

它将要求您实现一个比较两个job结构的函数,以便提供排序。

这是一个尝试:

static int compare_jobs(const void *a, const void *b)
{
  const job *ja = a, *jb = b;

  return ja->prio < jb->prio ? -1 : ja->prio > jb->prio;
}

您需要正确调用它(阅读文档!),然后遍历您的数组并将内容写入新文件。

于 2013-08-27T07:56:59.310 回答
1

假设您不能使用qsort(),因为您的限制之一是编写您自己的排序算法,这里是。

你需要整理什么?一个数组job

您需要排序的关键是什么?job.prio.

那么如何排序呢?任何常见的选择、插入或(eek)冒泡排序都可以。(尽管如果你沿着冒泡排序路线走,至少让它变得性感并进行鸡尾酒摇酒排序。)只需比较两个job.prios,两者都是ints,这并不难,并根据需要交换它们各自job结构在数组中的位置.

这是一个可行的选择排序算法。你可以在谷歌上找到很多其他的。

void selectionSort (job* jobs, int size) {

    int smallest;
    job temp;

    for (int i = 0; i < size - 1; i++) {
        smallest = i;
        for (int walk = i + 1; walk <= size - 1; walk++) {
            if (jobs[walk].prio < jobs[smallest].prio)
                smallest = walk;
        }  // end inner loop
        temp = jobs[i];
        jobs[i] = jobs[smallest];
        jobs[smallest] = temp;
    }   // end outer loop
    return;
}

相当简单;就像任何旧的选择排序一样。但是选择排序很无聊。尝试进行插入排序,现在选择排序为您提供了如何交换数组中元素的总体思路。

请注意,您的代码还有其他问题,正如人们指出的那样:您只为阵列中的一项作业分配空间,但您需要八个;您有未定义的变量,例如eerste;您已经name声明了两次,一次作为 a char*,一次作为char. 所以有很多清理工作,但希望你现在有足够的想法来完成你的任务。

于 2013-08-27T09:17:16.307 回答