C程序无法识别空指针

时间:2014-02-22 00:35:07

标签: c insert null linked-list

我正在尝试在C中重新实现插入函数,但我遇到了各种各样的问题。我参加了一个简介CS课程,他们在我们之前曾经使用它之前就开始向我们投掷C实验室。部分问题是列表指针未被识别为NULL,我也非常确定我正在使用malloc不正确。

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

#define True 1
#define False 0
typedef int BOOLEAN;

struct Node{
int value;
struct Node *next;
};

void insert(int x, struct Node **pL){
printf("insert\n");
if(*pL == NULL){
    printf("inside if\n");
    struct Node *pN;
    pN = (struct Node*) malloc(sizeof(struct Node));
    (*pN).value = x;
    (*pN).next = NULL;
    return;
}
if (*pL != NULL){
    printf("inside else\n");
    insert(x, &(((*pL)->next)));
}
printf("end insert\n");
};

void printList(struct Node *L){
while (L != NULL){
printf("%d", (*L).value);
printList((*L).next);
}
return;
};

main(){
printf("main\n");
struct Node* L;
//L).next = NULL;
int i;
printf("for loop\n");
for (i = 3; i < 20; i+=2){
    printf("%d\n", i);
    insert(i, &L);
}
printList(L);
};

1 个答案:

答案 0 :(得分:0)

首先,在main中,您需要初始化L

struct Node* L = NULL;

其次,在insert分配新节点pN时,您没有将其分配给pL,即它未插入。将此权利放在return;中的insert

之前
*pL = pN;

(您也可以删除return并将if (*pL != NULL)更改为else。)

然后,在printList中,您正在使用while循环和递归进行迭代。选择一个,而不是两个,例如:

while (L) {
    printf("%d\n", L->value);
    L = L->next;
}

此外,在整个代码中,您可以将(*pointer_to_struct).field替换为pointer_to_struct->field以获得更好的风格。