Как я могу отобразить каждый элемент в этой структуре стека? (С)

avatar
Daryl Ruggier
1 июля 2021 в 15:41
56
2
1

В настоящее время я работаю над заданием, и один из вопросов касается структуры стека. Я нашел подходящую структуру (структура односвязного списка), однако я не уверен, как отобразить каждый элемент в стеке, поскольку он использует несколько структур.

struct stack_entry {
    char *data;
    struct stack_entry *next;
};

struct stack_t { 
    struct stack_entry *head;
    size_t stack_size;
};

struct stack_t *newStack(void) { 
    struct stack_t *stack = malloc(sizeof *stack);
    if (stack) {
        stack->head = NULL;
        stack->stack_size = 1;
    }
    return stack;
}

До сих пор я написал эту функцию, однако она, конечно же, не работает, так как я, мягко говоря, в тупике.

void display(struct stack_t *stack) { //displays all of the entries of the stack
    for (int i = 0; i < stack->stack_size; i++) {
        char *tmp = stack->head[i].data;
        printf("%s ", tmp);
    }
}
Источник
h0r53
1 июля 2021 в 15:45
1

Этот stack очень похож на linked list

Ted Lyngmo
1 июля 2021 в 15:52
0

Несвязанный: почему вновь созданный stack_t имеет размер 1 вместо 0?

Daryl Ruggier
1 июля 2021 в 15:55
0

Часть вопроса гласит, что стек должен всегда содержать хотя бы одну запись, поэтому размер был инициализирован как 1 вместо 0. Я понимаю, что на первый взгляд это может показаться запутанным, хахаха

Ted Lyngmo
1 июля 2021 в 15:56
1

Действительно так. :-) Если он должен содержать хотя бы одну запись, возможно, вам также следует создать эту запись?

Daryl Ruggier
1 июля 2021 в 15:59
0

Это будет следующим шагом; чтобы добавить элемент "по умолчанию" стека. Я чувствую, что мне не следует больше задавать вопросы - так как это отвлекает от учебного аспекта задания, хотя это вызывает у меня стресс :)

Daryl Ruggier
1 июля 2021 в 16:00
1

Кроме того, я ценю быстрые ответы и ваш ответ; мне очень помогло :-)

Ted Lyngmo
1 июля 2021 в 16:01
0

@DarylRuggier Рад это слышать! Пожалуйста!

Ответы (2)

avatar
Ted Lyngmo
1 июля 2021 в 15:47
0

head является указателем на первый struct stack_entry и каждый struct stack_entry имеет указатель next.

char *tmp = stack->head[i].data; пытается использовать head в качестве массива, что приведет к неопределенному поведению.

Вы должны следовать указателям (ссылкам), пока не достигнете указателя NULL.

Пример:

void display(struct stack_t *stack) { //displays all of the entries of the stack
    for(struct stack_entry *curr = stack->head; curr; curr = curr->next) {
        printf("%s ", curr->data);
    }
}
avatar
jakez
1 июля 2021 в 15:56
0

Вы можете попробовать что-то вроде этого (просматривает список):

void display(struct stack_t *stack)
 { struct stack_entry *pEntry;  // current entry
   pEntry = stack->head;   
   while (pEntry != NULL)    
    { char *tmp = stack->head[i].data;
      printf("%s ", tmp);
      pEntry = pEntry->next;  // next element of list
    }
 }