双向链表显示函数中的分段错误

Segmentation Fault in A Doubly Linked List Display Function

所以我有一个程序,它接受一个 int 作为输入,并将整数插入一个双向链表,其中的函数是 createQueueenqueuedequeuedisplaypeekdestroyQueue。我有一个 main.c 和一个 queue.h 文件,但问题不在那里,它在 queue.c 文件中。问题是当我使用以下命令 enqueue 0 0 display 流水线传输 test12.txt 文件并打印到 output.txt 时,出现分段错误。如果我在 test12.txt 文件中 运行 只是 enqueue 0 0 就没有问题,它工作得很好。我的问题是,我是否在 display 中取消引用 temp 当我写 temp = temp->prev; 时它什么也没有指向,或者这是一个有效的调用,我的问题在于我的 [=27= 的初始化]节点?

queue.c 文件:

#include "queue.h"

Queue_ptr createQueue() {
    Queue_ptr s = (Queue_ptr)malloc(sizeof(Queue));
    s->front = NULL;
    s->back = NULL;
    return s;
}

void enqueue(Queue_ptr s, element e) {
    DN_ptr n = (DN_ptr)malloc(sizeof(DLLNode));
    n->e = e;
    if (s->front == NULL) {
        n->next = NULL;
        s->front = n;
        s->back = n;
    }else{
        s->back->next = n;
        n->prev = s->back;
        s->back = n;
    }
}

element dequeue(Queue_ptr s) {
    DN_ptr temp = s->front->next;
    element e = s->front->e;
    free(s->front);
    s->front = temp;
    s->front->next = NULL;
    s->front->prev = NULL;
    return e;
}

int isEmpty(Queue_ptr s) {
    if (s->front == NULL)
        return 1;
    else
        return 0;
}

element peek(Queue_ptr s) {
    return s->front->e;
}

void display(Queue_ptr s) {
    DN_ptr temp = s->back;
    while (temp) {
        printf("%d\n", temp->e);
        temp = temp->prev;
    }
}

void destroyQueue(Queue_ptr s) {
    DN_ptr temp = s->front;
    DN_ptr next;
    while (temp) {
        next = temp->next;
        free(temp);
        temp = next;
    }
    free(s);
}

queue.h 文件:

#ifndef queue_h
#define queue_h

#include "stdheader.h"

//Structures

//element is content of a node.
typedef int element;

//_DLLnode is 1 link in a doubly linked list.
struct _DLLNode {
    element e;
    struct _DLLNode *next;
    struct _DLLNode *prev;
};

typedef struct _DLLNode DLLNode;
typedef struct _DLLNode *DN_ptr;

//DLL is a series of links tracked by the head and back of the list.
struct _DLL {
    DN_ptr front;
    DN_ptr back;
};

typedef struct _DLL Queue;
typedef struct _DLL *Queue_ptr;

Queue_ptr createQueue();
void enqueue(Queue_ptr, element);
element dequeue(Queue_ptr);
int isEmpty(Queue_ptr);
element peek(Queue_ptr);
void display(Queue_ptr);
void destroyQueue(Queue_ptr);

#endif /* queue_h */

队列为空时enqueue中不设置n->prev,队列非空时也不设置n->next

dequeue 如果队列有 2 个以上的元素,它会损坏队列,如果只有一个元素,它会崩溃。

这是更正后的版本:

void enqueue(Queue_ptr s, element e) {
    DN_ptr n = (DN_ptr)malloc(sizeof(DLLNode));
    n->e = e;
    n->next = NULL;
    if (s->front == NULL) {
        n->prev = NULL;
        s->front = n;
        s->back = n;
    } else {
        s->back->next = n;
        n->prev = s->back;
        s->back = n;
    }
}

element dequeue(Queue_ptr s) {
    DN_ptr temp = s->front->next;
    element e = s->front->e;
    free(s->front);
    s->front = temp;
    if (temp) {
        temp->prev = NULL;
    } else {
        s->back = NULL;
    }
    return e;
}