排队和取消排队功能

Enqueue and Dequeue Functions

提问人:BrownyChewy 提问时间:11/10/2023 最后编辑:BrownyChewy 更新时间:11/10/2023 访问量:65

问:

由于上下文很短,我需要将队列中的元素取消排队,并将它们排入临时队列。当原始队列为空且元素位于临时队列内时,我需要将它们排回原始队列。我的排队函数工作正常,但我认为我的 dequeue 函数缺少一些参数,我想不出它。在执行调用 dequeue 的不同函数后,程序将始终在函数完成执行后终止。

这是一段解决相同问题的代码。

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

typedef struct person{
    char firstname[30], lastname[30], sex[10];
    int hfeet, hinches;
    float weight;
}Person;

typedef struct node *nodeptr;

typedef struct node{
    Person data;
    nodeptr next;
}Node;

//Function Declarations
void Add(nodeptr *queue, nodeptr *tail);
void Enqueue(nodeptr *queue, nodeptr *element, nodeptr *tail);
nodeptr Dequeue(nodeptr *queue, nodeptr *head);
void DisplayAll(nodeptr *queue, nodeptr *head, nodeptr *tail);

int main(void) {
    nodeptr queue1 = NULL;
    nodeptr h = NULL;
    nodeptr t = NULL;
    int ch;

    while(1){
    printf("Enter choice: ");
    scanf("%d", &ch);

        switch (ch) {
            case 1:
                Add(&queue1, &t);
                break;
            case 2:
                DisplayAll(&queue1, &h, &t);
                break;  
        }
    } 
    return 0;
 }

void Enqueue(nodeptr *queue, nodeptr *element, nodeptr *tail) {
    if (*tail == NULL) {
       *queue = *element;
       *tail = *element;
     } 
    else {
       (*tail)->next = *element;
       *tail = *element;
    }
}

nodeptr Dequeue(nodeptr *queue, nodeptr *head) {
    nodeptr current = *queue;
    *queue = (*queue)->next;
    *head = *queue;
     return current;
}

void Add(nodeptr *queue, nodeptr *tail){

    nodeptr queue1 = *queue;
    nodeptr t = *tail;
    bool chk = *chked;
    char first[30], last[30];
    int inch, feet;
    float mass;

    nodeptr element = (nodeptr)malloc(sizeof(Node));

        printf("\nEnter First Name: ");
        fflush(stdin);
        gets(first);
        strcpy(element->data.firstname, first);
        printf("Enter Last Name: ");
        fflush(stdin);
        gets(last);
        strcpy(element->data.lastname, last);
        Enqueue(&queue1, &element, &t);
        printf("\nData successfully added.");
        getch();
        system("cls");
    
        *queue = queue1;
        *tail = t;
        *chked = chk;
}

void DisplayAll (nodeptr *queue, nodeptr *head, nodeptr *tail){

    nodeptr queue1 = *queue;
    nodeptr h = *head;
    nodeptr t = *tail;
    nodeptr tempqueue = NULL;
    nodeptr h2 = NULL;
    nodeptr t2 = NULL;  

    while (queue1 != NULL){
        nodeptr current = Dequeue(&queue1, &h);
        printf("\nFirst Name\tLast Name");
        printf("\n%s\t%s", current->data.firstname, current->data.lastname);
        getch();
        Enqueue(&tempqueue, &current, &t2);
    }

    while (tempqueue != NULL){
        nodeptr current = Dequeue(&tempqueue, &h2);
        Enqueue(&queue1, &current, &t);
    }

    *queue = queue1;
    *head = h;
    *tail = t;
    getch();
    system("cls");
}

显示队列中的元素后,程序将退出。

C 队列

评论

2赞 Some programmer dude 11/10/2023
请尝试创建一个小而简单的程序,一个最小的可重现示例,以隔离地测试队列。这将使调试程序变得更加容易。
2赞 Some programmer dude 11/10/2023
每当涉及任何类型的指针、列表和类似内容时,我建议您使用铅笔和纸来跟踪所有变量和指针以及它们指向的位置。为变量和节点绘制标记框,为指针和链接绘制箭头。在更改程序中的相应指针或链接时擦除和重绘箭头。
1赞 Some programmer dude 11/10/2023
关于另外几点说明:C 规范中明确提到,将仅输入流(如 )传递给会导致未定义的行为永远不要使用!它是如此危险,以至于它甚至已经从 C 语言中删除了。stdinfflushgets
0赞 Armali 11/10/2023
@BrownyChewy –In function 'Add': error: 'chked' undeclared
0赞 Some programmer dude 11/10/2023
在您的函数中,和 参数的目的是什么?为什么你要分配到 ,并在函数结束时?那能解决什么问题?你似乎在一个应该只显示一些东西的功能中做了很多事情。请使函数名称反映函数的实际操作。并且请不要在单个函数中做太多,如果一个函数只做一件事会更好。DisplayAllheadtail*queue*head*tail

答: 暂无答案