繁体   English   中英

使用Queue的单链表

[英]C singly linked list using Queue

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "locker.h"


void QueueInit(Queue* p)
{
    p->front = NULL;
    p->rear = NULL;
}

int QIsEmpty(Queue* p)
{
    if(p->front == NULL)
    {
        return 1;
    }
    return 0;
}

void Enqueue(Queue* p, int data)
{
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->next = NULL;
    newNode->id = data;

    if(QIsEmpty(p))
    {
        p->front = newNode;
        p->rear = newNode;
    } else {
        p->rear->next = newNode;
        p->rear = newNode;
    }
}

void attachEnqueue(Queue* p, int user_id)
{
    Node* temp = p->front;
    temp->user_id = user_id;    
    p->front = temp;

    printf("Locker %d Owned By %d\n", temp->id, temp->user_id);

    temp->owned = 1;

    temp = temp->next;

}

int Dequeue(Queue* p)
{
    Node* temp = p->front;
    uint16_t item;

    if(QIsEmpty(p))
    {
        printf("No element exists!");
        exit(0);
    } else {
        item = temp->id;
        p->front = temp->next;
        free(temp);

        if(temp == NULL)
        {
            p->rear = NULL;
        }
        return (item);
    }
}

void printList(Queue* p) 
{
    Node* v = p->front;
    while(v != NULL){ 
        printf("Locker: %d\n", v->id);
        v = v->next;
    }
}

int count (Queue p)
{
    int c = 0 ;
    Node* temp = p.front ;

    while ( temp != NULL )
    {
        temp = temp->next;
        c++ ;
    }

    return c ;
}

void SearchQueue(Queue* p, int val1)
{
    Node* v = p->front;
    int sw = 0;

    while( v != NULL)
    {
        if(v->id == val1)
        {
            printf("Locker ID: %d\n", val1);
            printf("Lock Status: locked\n");

            if(v->owned == 0){
            printf("unowned\n");
            } else if(v->owned == 1)
            {
            printf("owned by %d\n", v->user_id);
        }
            sw = 1;
        }
        v = v->next;
    }
    if(!sw)
    {
        printf("locker %d does not exists\n", val1);
    }
}

int main(int argc, char* argv[])
{

    Queue queue;
    QueueInit(&queue);

    char input[50];
    char command[20];
    int val1;
    uint16_t id = 1;


    while(1)
    {
        scanf(" %49[^\n]s", input);
        sscanf(input, "%s %d", &command, &val1);

        if(strcmp(command, "CREATE") == 0)
        {
            printf("New Locker created: %d\n", id);
            Enqueue(&queue, id);
            id++;

        } else if(strcmp(command, "DISPLAY") == 0)
        {
            SearchQueue(&queue, val1);

        } else if(strcmp(command, "ATTACH") == 0)
        {
            attachEnqueue(&queue, val1);    

        } else if(strcmp(command, "DISPLAYALL") == 0)
        {
            printList(&queue);

        }else if(strcmp(command, "DELETE") == 0)
        {
            printf("Deleted the locker, %d\n",Dequeue(&queue)); 

        }else if(strcmp(command, "QUIT") == 0)
        {
            printf("Good Bye!\n");
            exit(0);
        }
        continue;
    }
    return 0;
}

这是到目前为止,“ locker.h”的内容是:

#ifndef LOCKER_H
#define LOCKER_H
#include <stdint.h>

typedef struct locker_t {
  uint16_t id;
  uint16_t user_id;
  uint8_t locked;
  uint8_t owned;
  int write_fd;
  int read_fd;
      struct locker_t* next;
    }Node;

typedef struct queue_t {
  Node* front;
  Node* rear;
  size_t size;
}Queue;

#endif

除了attachEnqueue部分之外,其他所有东西都工作正常。 目的是,当我创建储物柜1和储物柜2并输入ATTACH 20时,储物柜1的所有者应为20,再次输入ATTACH 30时,储物柜2的所有者应为30。

但是,当我创建2个储物柜,首先创建ATTACH 20,然后再次输入ATTACH 30时,储物柜1的所有者的值仅从20变为30,而没有将30个所有者分配给储物柜2。

我100%确定attachEnqueue函数涉及错误的内容,但是我真的不确定如何修改它。

另外,我需要包括一个“ LOCK”命令来使储物柜处于锁定状态还是解锁状态,但是问题是,学校希望我通过使用信号SIGUSR来做到这一点。 如何使用信号功能锁定或解锁储物柜? pthread.mutex.lock和解锁会起作用吗?

任何帮助或建议将非常感激!

该评论是正确的。 attachEnqueue的最后一行是temp = temp->next; attachEnqueue temp = temp->next; 也许您认为temp在下次调用该函数时会将这些信息牢记在心,但现在绝对不行。 此行temp ,下一次,将temp分配到队列的前面。
要解决此问题,您可以如上所述在结构中创建一个标志,向函数添加计数器参数以跟踪队列中要附加的元素,或者将temp设为静态参数,以便其状态在两次调用之间保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM