typedef struct LNode{
//定义节点
int data;
struct LNode *next;
}LNode;
void Print(LNode *L){
//打印节点
LNode *q = L;
while(q != NULL){
q = q -> next;
printf("%d ", q -> data);
}
printf("\n");
}
LNode * CreateList(int n){
//尾插法创建单链表
LNode *L, *s, *tail;
L = (LNode *)malloc(sizeof(LNode));
L -> next = NULL;
tail = L;
for(int i = 0; i < n; i++){
s = (LNode *)malloc(sizeof(LNode));
s -> data = i + 1;
s -> next = NULL;
s -> next = tail -> next;
tail -> next = s;
tail = s;
}
Print(L);
return L;
}
上述代码运行会提示 Segmentation fault: 11 的错误,对于此类错误,有博主有详细解释,参见下面链接。
https://blog.csdn.net/u010150046/article/details/77775114
这里我简单说明本代码错误原因:错误使用了空指针。
//在第二个Print函数中,打印p->data这里出错。
//while循环到最后一个节点,p指针为空,却用于输出p->data
void Print(LNode *L){
LNode *q = L;
while(q != NULL){
q = q -> next;
printf("%d ", q -> data); // 这里出错了,p指针为空,不能输出p->data.
}
printf("\n");
}
修改方法有两种
//方法一
void Print(LNode *L){
LNode *q = L;
while(q -> next != NULL){ //循环条件改为p->next不为空
q = q -> next;
printf("%d ", q -> data);
}
printf("\n");
}
//方法二
void Print(LNode *L){
LNode *q = L -> next; //p指向表头节点的下一个节点(即第一个节点)
while(q != NULL){
printf("%d ", q -> data); //交换两句顺序
q = q -> next;
}
printf("\n");
}