2015-09-23 3 views
-3
typedef char Word[ WORD_LEN + 1 ]; 

typedef struct { 
    Word list[ MAX_WORDS ]; 

} FIFO; 

Итак, у меня есть указатель на структуру FIFO, и мне любопытно, что лучший способ получить доступ к списку внутри. Я должен иметь возможность добавлять и удалять слова из списка. Любая помощь была бы потрясающей, спасибо!Доступ к списку в typedef struct

+0

Вы по существу объявили 2D массив символов ... в самом кругом о запутанном виде. Я бы начал с объявления двумерного массива символов как двухмерного массива символов. Затем добавьте переменные 'head' и' tail' в свой код, чтобы отслеживать ... um ... индексы головы и хвоста в FIFO. – user3386109

ответ

0

Давайте поговорим о ваших вариантах представления FIFO, который позволит устранить вашу путаницу в отношении доступа к данным. FIFO является абстрактным типом данных, который имеет два типа поведения:

  1. Элементы удаляются с самого начала.
  2. Элементы добавляются в конец.

Реализация FIFO должна отслеживать свое начало и конец, поэтому давайте обновим вашу структуру FIFO.

typedef struct { 
    unsigned int begin; /* index to first element */ 
    unsigned int end; /* index to last element */ 
    Word list[ MAX_WORDS ]; 
} FIFO; 

Теперь нам нужны две функции, которые реализуют два поведения выше. Назовем их fifo_add и fifo_remove. (Это неполный)

void fifo_add(FIFO * fifo, Word w) 
{ 
    fifo.list[fifo->end] = w; 
    fifo->end++; 
} 

Word fifo_remove(FIFO * fifo) 
{ 
    int i = fifo->begin; 
    fifo->begin++; 

    return fifo->list[i]; 
} 

Я намеренно оставил эти функции неполно, но я надеюсь, что это поможет вам думать в правильном направлении (см this page about circular buffers). Мне нужно подчеркнуть, что это только одна возможная реализация FIFO. Многие люди предпочитают связный на основе FIFO списка, который будет иметь на структуру, как это:

typedef struct { 
    Word w; 
    Node * next; 
} Node; 

typedef struct { 
    Node * head; 
    Node * tail; 
} FIFO; 

Независимо от того, что реализация вы используете, fifo_add и fifo_remove будет иметь один и тот же интерфейс, который изолирует код ФИФО от остальной части вашего программа.

Смежные вопросы