c - 双链表显示函数中的段错误

标签 c pointers segmentation-fault queue doubly-linked-list

所以我有一个程序,它接受一个int作为输入,并将整数插入到一个双向链表中,其中的函数是createQueueenqueue出队显示peekdestroyQueue。我有一个 main.c 和一个 queue.h 文件,但问题不在其中,它在 queue.c 文件中。问题是,当我通过管道传输 test12.txt 文件并使用以下命令 enqueue 0 0 display 打印到 output.txt 时,我出现段错误。如果我在 test12.txt 文件中运行 enqueue 0 0 就没有问题,它工作得很好。我的问题是,当我编写 temp = temp->prev; 时,当我在 display 中取消引用 temp 时,它没有指向任何内容,或者是一个有效的调用,我的问题在于我的 temp 节点的初始化?

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;
}

关于c - 双链表显示函数中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35387390/

相关文章:

objective-c - objective-c 中的悬垂指针 - nil 是否也释放内存?

c - 移动双链表中的项目范围? [C]

android - 调试应用程序段错误?编译器的错?

c++ - 主导出后出现段错误

c++ - 代码中的溢出会覆盖什么内存

c - 保存简单的 XML 文件

c - 读取一个数字,应该算作一个符号

c - 指针和数组的微妙概念

xml - 带有 XML Twig 段错误的 Perl 脚本,子进程以信号 11 终止

c - 在 C 中检测新行