Первая проблема:
node *dir = (node *) malloc(sizeof(dir));
dir = NULL;
, поэтому у вас есть утечка памяти из-за потери выделения, просто выполните
node *dir = NULL;
Вторая проблема push_back возвращает последний элемент списка, при этом
dir = push_back(dir, temp);
dir теперь указывают на последний элемент, и вы потеряли заголовок списка, поэтому все элементы, кроме последнего
Один из способов - изменить push_back , чтобы он возвращал (новый) заголовок списка:
node* push_back(node * head, item datain)
{
node *newnode = (node *)malloc(sizeof(node));
newnode->data = datain;
newnode->next = NULL;
if (head == NULL)
return newnode;
node * dir = head;
while (dir->next != NULL)
dir = dir->next;
dir->next = newnode;
return head;
}
, но это предполагает, что вызывающий всегда делает что-то вроде dir = push_back (dir, temp);
другой способ - использовать двойной указатель:
void push_back(node ** head, item datain)
{
node *newnode = (node *)malloc(sizeof(node));
newnode->data = datain;
newnode->next = NULL;
if (*head == NULL)
*head = newnode;
else {
node * dir = *head;
while (dir->next != NULL)
dir = dir->next;
dir->next = newnode;
}
}
, и вызывающая сторона может просто сделать push_back (& dir, temp); без риска забыть назначить