Есть несколько проблем с кодом, во-первых, ошибка здесь
struct node *next_ptr;
, как указано @chux. Это должно быть struct Node *next_ptr;.
secondaly, в PopTickets()
при печати struct Node
информация, это
while (StackTop != NULL) { /* some code */ }
должно быть
struct Node *TempPtr = StackTop;
while (TempPtr != NULL) { /* some code */ }
, так как более ранний код создает ошибку ошибки сегментации.Предположим, что есть только один узел, тогда этот
TempPtr = StackTop->next_ptr;
делает TempPtr
как NULL
, но StackTop
остается тем же и снова повторяет цикл (не должен), и этот StackTop = TempPtr;
делает StackTop
как NULL
и при доступе к StackTop->SeatRow
т.е. NULL->SeatRow
происходит сбой.
Вот пример кода:
trevor.c
#include "StackLib.h"
#include <stdio.h>
#include <stdlib.h>
void PushSoldSeat(struct Node **StackTop, char RowToAdd, int SeatToAdd) {
struct Node *NewNode = malloc(sizeof(struct Node));
NewNode->SeatRow = RowToAdd;
NewNode->SeatNumber = SeatToAdd;
if (*StackTop == NULL) {
*StackTop = NewNode;
NewNode->next_ptr = NULL;
}
else {
NewNode->next_ptr = *StackTop; //line 20
*StackTop = NewNode;
}
}
void PopTickets(struct Node *StackTop) {
struct Node *TempPtr = StackTop;
if(StackTop == NULL) {
printf("Pop not executed - stack is empty\n\n");
return;
}
while (TempPtr != NULL) {
StackTop = TempPtr;
printf("\n______________\n");
printf("\n| |\n");
printf("\n| Seat %c%d |\n", StackTop->SeatRow, StackTop->SeatNumber);
printf("\n| |\n");
printf("\n______________\n");
TempPtr = StackTop->next_ptr; //line 41
free(StackTop);
}
}
int main(void) {
struct Node *head = NULL;
PushSoldSeat(&head,'a',5);
PushSoldSeat(&head,'b',10);
PushSoldSeat(&head,'c',15);
PushSoldSeat(&head,'d',20);
PopTickets(head);
return 0;
}
StackLib.h
#include <stdio.h>
#include <stdlib.h>
#ifndef _STACKLIB_H
#define _STACKLIB_H
struct Node {
char SeatRow;
int SeatNumber;
struct Node *next_ptr; /* avoid spell mistake */
}StackTop; /* *stackTop is not required */
void PushSoldSeat(struct Node **StackTop, char RowToAdd, int SeatToAdd);
void PopTickets(struct Node *StackTop);
#endif
Теперь скомпилируйте ваш код, как показано ниже
gcc -Wall -Wstrict-prototypes -Werror trevor.c