反向遍历双向链表时崩溃

标签 c linked-list doubly-linked-list

typedef struct tape
{
    char symbol;
    struct tape *next;
    struct tape *prev;
}tape;

tape *pt;    

void GenerateInputTape(int n)
{
    int i;

    pt=(tape*)malloc(sizeof(tape));

    pt->symbol='B';

    pt->prev=NULL;
    pt->next=(tape*)malloc(sizeof(tape));
    pt=pt->next;

    for(i=0;i<2*(n+1);i++)
    {   
        if(i < (2*n/2))
            pt->symbol='0';
        else
            pt->symbol='1';

        pt->prev=pt;
        pt->next=(tape*)malloc(sizeof(tape));
        pt=pt->next;
    }

    pt->symbol='B';

    pt->next=NULL;
}

void ShowTape()
{
    //Move tape to the beginning
    while (pt->prev != NULL)
        pt=pt->prev; //crash point

    //List out all of the elements
    while ((pt->next) != NULL)
    {   
        printf("%c",pt->symbol);
        pt=pt->next;
    }
    puts("\n");
}

这是一个程序代码片段,旨在创建一个双向链表,用 B0...n011....(n+1)1B 个字符填充它并打印它们。不幸的是,它在返回时崩溃了。为什么?

Unhandled exception at 0x771a15de in turing_machine.exe: 0xC0000005: Access violation reading location 0xcdcdcdd5.

最佳答案

你没有正确设置 pt->prev

代替

pt->prev=pt;
pt->next=(tape*)malloc(sizeof(tape));

尝试:

pt->next = malloc(sizeof(tape));
pt->next->prev = pt;

关于反向遍历双向链表时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14285776/

相关文章:

c++ - 为什么我的模板链接列表不起作用?

c - 如何在c中实现通用链表

c - 树/链表结构的遍历

c - 无法删除双链表中的节点

c - netbsd pthread_create SIGABRT

c - bv_len 和 bi_size 分别如何用于 linux 内核的 struct bio?

C循环双链表: traverses fwd/rev for end node gives different pointer address

c - C-删除节点函数中的双向链表

c - 无法理解 Axel Schreiner 的书 "OOP in C"中的上下文

c - OpenCl共享虚拟内存测试奇怪的结果