我有一个带有名称的文本文件,后跟一个名称优先级的数字,现在我正在尝试按优先级排序文本文件并写一个新文件。
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;
}
答案 0 :(得分: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;
}
您需要正确调用它(阅读文档!),然后遍历您的数组并将内容写入新文件。
答案 1 :(得分:1)
假设您不能使用qsort()
,因为您的一个约束是编写自己的排序算法,这里就是。
你需要排序什么?一个job
数组。
您需要排序的关键是什么? job.prio
。
那怎么排序?任何常见的选择,插入或(eek)冒泡排序都可以。 (虽然如果你沿着泡泡排序路线走下去,至少要让它变得性感并且做一个鸡尾酒调酒器排序。)只需比较两个job.prio
,两个都是int
s,这样并不难,并交换根据需要将各自job
结构的位置放在数组中。
这是一个可行的选择排序算法。您可以在Google上找到很多其他人。
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
两次声明,一次作为char*
,一次作为char
数组。所以有很多清理,但希望你现在有足够的想法来完成你的任务。