如何调试链表程序?

时间:2016-06-16 12:27:56

标签: c list pointers linked-list

我很难理解我的代码中的错误,

正如你所看到的,它是一个链表,它应该连接“Boxes”,每个Box都有一个int值和指向下一个Box的指针,但是我无法让它运行而且我不能我知道为什么。

有谁可以告诉我它为什么没有运行?

#include <stdio.h>
#include <stdlib.h>

struct node {
    int n;
    struct node *next;  
} node;

typedef struct node Box;

main()
{    
    Box *q, *r, *s;
    Box t;

    q = (Box *)malloc(sizeof(Box));
    r = (Box *)malloc(sizeof(Box));
    s = (Box *)malloc(sizeof(Box));

    q->n = 2;
    q->next->n = 3;
    r->n = 4;
    q->next->next = r;
    r->next = NULL;
    s->n = 5;
    s->next = NULL;
    t.n = 6;

    printf("================");
    printf("Q == %d\n", q->n);
    printf("R == %d\n", r->n);
    printf("S == %d\n", s->n);
    printf("{%d}{%d}{%d}{%d}{%d}", q->n, q->next->n, r->n, s->n, t.n);      
}

3 个答案:

答案 0 :(得分:3)

您的初始化序列非常混乱,这使得它通过写入非初始化指针来调用未定义的行为。

应该是:

O(n^2)

另外,please don't cast the return value of malloc() in C

答案 1 :(得分:3)

您为q

分配内存
Box *q = malloc(sizeof(Box));

然后您使用q->next而未指定它:

q->n = 2;
q->next->n = 3;

答案 2 :(得分:2)

您正在写入未分配的内存:

q->n = 2;
q->next->n = 3; //q->next points "into the wild" here

您可能想要这样的事情:

q = malloc(sizeof(Box));
q->next = malloc(sizeof(Box));
q->next->n = 3;

由于这是重复的,你应该写一个例程来完成这个任务:

void append(Box* where, int what) {
 ...
}

清理:

void delete(Box* where) {
 ...
}