C 按第二个字符串对数组排序
我有一个文本文件,它的名字后面跟一个数字,这个数字是名称的优先级,现在我正试图按优先级对文本文件进行排序,并编写一个新文件C 按第二个字符串对数组排序,c,C,我有一个文本文件,它的名字后面跟一个数字,这个数字是名称的优先级,现在我正试图按优先级对文本文件进行排序,并编写一个新文件 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 我已经实现了在一个数组中获取旧文本文件,但我仍然坚持按优先级对该数组进行排序。我不应该再次遍历文件,只想对数组进
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;
}
#包括
#包括
类型定义结构{
INTP;
字符*名称;
}姓名;
内部主(空){
FILE*old=fopen(“old.txt”,“r”);
文件*new=fopen(“new.txt”,“w”);
charn[10];
int i=0;
名称*名称=malloc(sizeof(名称));
对于(i;i您应该使用标准库函数进行排序
它需要您实现一个比较两个作业
结构的功能,以便提供排序
这里有一个尝试:
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;
}
static int compare_作业(const void*a、const void*b)
{
常量作业*ja=a,*jb=b;
返回ja->prioprio-1:ja->prio>jb->prio;
}
您需要正确地调用它(阅读文档!),然后在数组上循环并将内容写入一个新文件。假设您无法使用qsort()
,因为您的一个限制条件是编写自己的排序算法,下面是
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
您需要排序什么?一个作业
数组
您需要按什么键排序?job.prio
那么如何排序呢?任何常见的选择、插入或(eek)气泡排序都可以。(不过,如果你选择气泡排序,至少要让它性感一点,然后做鸡尾酒杯排序。)只需比较两个job.prio
s,它们都是int
s,因此这并不难,并根据需要交换它们各自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;
}
void selectionSort(作业*作业,整数大小){
int最小;
工作温度;
对于(int i=0;i 对于(int walk=i+1;walk为什么在C中这样做?你做得很好。你已经对它进行了测试,并且你有了解决部分难题的方法。下一步是用文字描述你想如何对数据进行排序。元素一和二排序了吗?是的。元素二和三排序了吗?是的。元素三和排序了吗?否。然后做什么。。。用文字描述下一步要编写的程序。然后将其放入问题中并尝试编写。fscanf(eerste、%s%f)、name和prio)
,小心,prio
是一个int
,您正在扫描一个float
您似乎只为一个作业分配了空间,但您试图读入8个作业并将其存储在未分配的内存中,如果您将job
声明为{int prio;char jobName[8];}
;不必为(非常短的)字符串处理单独的malloc()
,这将使它更简单、更快。Qsort是libc(stdlib.h)的一部分,您已经在使用malloc,它也是stdlib.h的一部分,因此您不需要额外的库