【问题标题】:Creating a priority queue in C using strings使用字符串在 C 中创建优先级队列
【发布时间】:2020-12-17 19:51:21
【问题描述】:

注意:代码 sn-ps 可能无法用于演示我的想法。

我正在尝试在 c 中复制银行队列,但非常基本。我是 C 新手,我真的在这里寻求帮助。

所以我希望完成 3 个主要任务。

  1. 插入客户。
  2. 正在删除客户。
  3. 显示排队的客户列表。

对于1,我想出了这个主意:

int pri_que[MAX];
int front, rear;

void insert(char data){

    if (rear >= MAX - 1){

        printf("\nQueue is full.");
        return;
    }

    if ((front == -1) && (rear == -1)){

        front++;
        rear++;
        pri_que[rear] = data;
        return;
    }    

    else{

        check(data);
    }
    rear++;

}

然后我有check 函数

void check(char data) {

    int i,j;

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

        if (data >= pri_que[i]) {

            for (j = rear + 1; j > i; j--) {

                pri_que[j] = pri_que[j - 1];

            }

            pri_que[i] = data;
            return;
        }
    }
    pri_que[i] = data;
}

del 函数

void del(char data) {

    int i;

    if ((front==-1) && (rear==-1)) {

        printf("\nQueue is empty ");
        return;
    }

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

        if (data == pri_que[i]) {
            
            for (; i < rear; i++) {

                pri_que[i] = pri_que[i + 1];
            }

        pri_que[i] = -99;

        rear--;

        if (rear == -1)
            front = -1;

        return;
        }
    }
    printf("\n%d not found in queue to delete", data);
}

最后是show 函数。

void show() {
    if ((front == -1) && (rear == -1)) {

        printf("\nQueue is empty");
        return;

    }
    
    for (; front <= rear; front++) {
        
        printf(" %d ", pri_que[front]);
    }
    
    front = 0;
}

顺便说一下,我想向等待的客户展示这样的:

1 - James
2 - Jacop
3 - Sarah 

【问题讨论】:

  • 那么,您认为使用多少优先级?例如,是否会有一个 MAXIMUM 优先级,比如 10?
  • MAX_SIZE 10 好
  • 您甚至没有主要代码让我知道您要准确实现什么算法。您实际上如何优先考虑名称?例如。主要是您要求输入名称的优先级还是仅按升序排列?更多细节让您获得更多帮助。

标签: c queue priority-queue


【解决方案1】:

据我了解,这就是你想要的。

Please enter 10 names with priorities
1) priority and name: 2 name-1
2) priority and name: 5 name-2
3) priority and name: 6 name-3              
4) priority and name: 7 name-4
5) priority and name: 8 name-5
6) priority and name: 9 name-6
7) priority and name: 10 name-7
8) priority and name: 1 name-8
9) priority and name: 3 name-9
10) priority and name: 4 name-10

Priority        Name
2       name-1
5       name-2
6       name-3
7       name-4
8       name-5
9       name-6
10      name-7
1       name-8
3       name-9
4       name-10

这是您可以用来创建字符串并将它们插入队列的代码。然后,您可以通过启发我为您的目的编写的示例代码来开发其余功能。如果您在开发此示例代码时遇到任何问题,请让我解决问题。祝你好运。

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

#define MAX 10

struct item {
    int priority;
    char *name;
};

int front=0,rear=0;
struct item priQueue[MAX];

char *getMemoryFor(const char *ch){
    char *mem = malloc(strlen(ch) * sizeof(char));
    return mem;
}

void insert(int priority, const char *data){

    if (rear > MAX){
        printf("\nQueue is full.\n");
        return;
    }

    priQueue[rear].priority = priority;
    char *loc = getMemoryFor(data);
    if(loc == NULL){
        printf("Memory allocation failed!\n");
        return; // No memory so don't continue
    }
    strcpy(loc, data); // Copy the name to the allocated location
    priQueue[rear].name = loc; // Store the location of the name in the queue
    rear++;
}

void show(){
    if ((front == -1) && (rear == -1)){

        printf("\nQueue is empty\n");
        return;

    }
    
    printf("\nPriority\tName\n");
    for (; front < rear; front++){
        
        printf("%d\t%s\n", priQueue[front].priority, priQueue[front].name);
    }
    
    front = 0;
}

int main() {
    
    printf("Please enter 10 names with priorities\n");
    for(int i=0; i<MAX; i++){
        int pri = 0;
        char nameTemp[50];
        printf("%d) priority and name: ", i+1);
        scanf("%d%s", &pri, nameTemp);
        insert(pri, nameTemp);
    }
    
    show();
  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多