Несколько структур данных в C - PullRequest
3 голосов
/ 26 апреля 2011

У меня есть файл queue.c, который определяет очередь на C. Как бы я сделал 3 отдельные очереди независимыми друг от друга?Я не очень разбираюсь в C, и я продолжаю думать об этом с точки зрения ОО, и я знаю, что не могу этого сделать.

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

struct Node
{
    char data;
    struct Node *next;
} *Head, *Tail;

void addCharacter(char c)
{
    struct Node *temp1, *temp2;
    temp1 = (struct Node *)malloc(sizeof(struct Node));
    temp1->data = c;

    temp2 = Tail;

    if(Head == NULL)
    {
        Head = temp1;
        Head->next = NULL;
        Tail = Head;
    }
    else
    {
        Tail = temp1;
        temp1->next = NULL;
        temp2->next = temp1;
    }
}

void deleteCharacter()
{
    struct Node *temp1 = Head;
    Head = temp1->next;
    free(temp1);
}

int replaceCharacter(char c)
{
    Head->data = c;
}

int main() {}

Это моя очередь, и все, что у меня есть для другого файла C, по сути:

#include "queue.h"

Я не знаю, куда идти ...

Ответы [ 4 ]

9 голосов
/ 26 апреля 2011

Вместо создания Head и Tail глобальных переменных создайте другую структуру, которая содержит их, например:

struct Queue {
    struct Node *head;
    struct Node *tail;
};

Затем измените ваши функции, работающие в очереди, чтобы указатель на Queue struct, и оперируем этим.

Вам также понадобится функция initQueue, которая инициализирует head и tail в NULL.Тогда использование очереди может выглядеть так:

struct Queue queue1;
initQueue(&queue1);
addCharacter(&queue1, 'a');
//....
2 голосов
/ 26 апреля 2011

Вы можете просто определить новую структуру для очереди.

struct Node
{
    char data;
    struct Node *next;
};
struct Queue
{
    struct Node *Head, *Tail;
    // optional int size;
};

И затем для каждой функции добавить еще один параметр:

void addCharacter(struct Queue *q, char c);

void deleteCharacter(struct Queue *q);

И получить доступ с помощью q->Head и q->Tail.

1 голос
/ 26 апреля 2011

Вы проектировали эту библиотеку очереди? В его текущей форме вы не можете иметь более одной очереди, потому что функция использует глобальные указатели Head и Tail и нет никакого способа указать вашим функциям использовать некоторые другие указатели.

0 голосов
/ 26 апреля 2011

У вас есть глобальные Head и Tail. Если вы хотите несколько списков, вам нужно несколько голов. Поэтому вам нужно изменить свои функции так, чтобы &Head и &Tail были параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...