【发布时间】:2021-05-16 08:40:39
【问题描述】:
我想对优先级队列中具有相同优先级的值进行排序。一切都是从一个简单的 .txt 文件加载的。我已经对所有优先级进行了排序,但现在我想对具有相同优先级的值进行排序。
我的代码比较简单。它有推送和弹出功能,你猜对了,推送和弹出哈哈。
函数ispis是为打印而生的。我也知道声明一个虚拟节点不是一个好主意,但他们在大学教我们这样,所以我很适应它。
这是我想如何对元素进行排序的示例:
例如
10 1
2 1
3 1
到
2 1
3 1
10 1
我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct cvor* Red;
struct cvor {
int el, pr;
Red next;
};
void push(Red R, int b, int p);
void print(Red R);
void pop(Red R);
int main() {
FILE* dat;
int br, pr;
struct cvor Head;
Head.next = NULL;
dat = fopen("redsp.txt", "r");
if (!dat) {
printf("No file!\n");
}
while (fscanf(dat, "%d %d", &br, &pr) != EOF) {
push(&Head, br, pr);
}
printf("Printing:\n");
print(Head.next);
/*printf("\n\n\n");
printf("poppin:D\n");
for (int i = 0; i < 14;i++) {
pop(&Head);
printf("\n\n\n");
print(Head.next);
}*/
fclose(dat);
}
void push(Red R, int b, int p) {
Red q;
q = (Red)malloc(sizeof(struct cvor));
q->el = b;
q->pr = p;
/*if (q->pr >p) {
q->next = R;
R = q;
}*/
while (R->next != NULL && R->next->pr < p)
{
R = R->next;
}
q->next = R->next;
R->next = q;
}
void pop(Red R) {
Red temp, pre;
temp = R->next;
pre = NULL;
while (temp && temp->next) {
pre = temp;
temp = temp->next;
}
if (pre) {
free(pre->next);
pre->next = NULL;
}
}
void print(Red R) {
while (R != NULL)
{
printf("%d %d\n", R->el, R->pr);
R = R->next;
}
}
【问题讨论】:
-
如果您对相应的变量、函数参数和结构字段使用相同的名称,代码会更容易理解。我建议edit 您的问题,并在两列中使用不同的值扩展示例输入,并显示当前结果和预期结果。我想你的问题基本上是如何根据比较两个值对数据进行排序,即如何替换
while (R->next != NULL && R->next->pr < p)来比较两个元素。 -
@Bodo 我编辑了我的代码。嗯,是的,你可以这样称呼它。有没有办法制作这种算法?
标签: c linked-list queue priority-queue