为什么这段代码无法执行?
Why can't this code be executed?
我正在使用链表进行图形插入。下面的代码按预期工作正常。
#include <stdio.h>
#include <stdlib.h>
#define new_node (struct node*)malloc(sizeof(struct node))
struct node {
int index;
struct node* next;
};
void addEdge(struct node* head, int parent, int child) {
struct node* temp = new_node;
temp->index = child;
temp->next = (head+parent)->next;
(head+parent)->next = temp;
struct node* tmp = new_node;
tmp->index = parent;
tmp->next = (head+child)->next;
(head+child)->next = tmp;
return;
}
struct node* create_graph( int v ) {
struct node* temp = ( struct node* )malloc( v*sizeof(struct node) );
for( int i = 0; i < v; i++ ) {
(temp+i)->index = i;
(temp+i)->next = NULL;
}
return temp;
}
void printGraph(struct node* head, int vertex) {
struct node* temp;
for( int i = 0; i < vertex; i++ ) {
printf("All nodes connected to node %d is ", (head+i)->index);
temp = (head + i)->next;
while(temp != NULL) {
printf("-> %d", temp->index);
temp = temp->next;
}
printf("\n");
}
}
int main(void) {
int v; // Number of vertex in graph.
struct node* head = NULL;
v = 5;
//scanf( "%d", &v );
head = create_graph( v );
addEdge(head, 0, 1);
addEdge(head, 0, 4);
addEdge(head, 1, 2);
addEdge(head, 1, 3);
addEdge(head, 1, 4);
addEdge(head, 2, 3);
addEdge(head, 3, 4);
printGraph(head, 5);
return 0;
}
但是如果我更新 printGraph
函数中的以下更改,代码会导致 运行时错误 。
void printGraph(struct node* head, int vertex) {
struct node* temp = head;
for( int i = 0; i < vertex; i++ ) {
printf("All nodes connected to node %d is ", (temp+i)->index);
temp = (temp+i)->next;
while(temp != NULL) {
printf("-> %d", temp->index);
temp = temp->next;
}
printf("\n");
}
}
下面这行是我想不通的主要问题:
为什么这行代码会导致运行时错误?
temp = (temp+i)->next;
P.S。使用的编译器是 GCC 6.3
.
错误出现在您到达 temp == NULL
以退出 while
循环的内部 while
循环和外部 for
循环的第一行循环调用 (temp + i)->index
。由于 temp
为空,因此您会收到错误消息。
但是,在第一个代码中,您在外循环开始时使用 head
而不是 temp
(与使用 temp
的第二种情况相反) .因此,您根据 head
更改 temp
的值,与第二种情况相比,temp
的空值没有任何问题。
为了解决这个问题,你可以启动另一个变量,如temp
作为new_temp
,用于内部while
循环,并区分内部和外部循环的逻辑。
我正在使用链表进行图形插入。下面的代码按预期工作正常。
#include <stdio.h>
#include <stdlib.h>
#define new_node (struct node*)malloc(sizeof(struct node))
struct node {
int index;
struct node* next;
};
void addEdge(struct node* head, int parent, int child) {
struct node* temp = new_node;
temp->index = child;
temp->next = (head+parent)->next;
(head+parent)->next = temp;
struct node* tmp = new_node;
tmp->index = parent;
tmp->next = (head+child)->next;
(head+child)->next = tmp;
return;
}
struct node* create_graph( int v ) {
struct node* temp = ( struct node* )malloc( v*sizeof(struct node) );
for( int i = 0; i < v; i++ ) {
(temp+i)->index = i;
(temp+i)->next = NULL;
}
return temp;
}
void printGraph(struct node* head, int vertex) {
struct node* temp;
for( int i = 0; i < vertex; i++ ) {
printf("All nodes connected to node %d is ", (head+i)->index);
temp = (head + i)->next;
while(temp != NULL) {
printf("-> %d", temp->index);
temp = temp->next;
}
printf("\n");
}
}
int main(void) {
int v; // Number of vertex in graph.
struct node* head = NULL;
v = 5;
//scanf( "%d", &v );
head = create_graph( v );
addEdge(head, 0, 1);
addEdge(head, 0, 4);
addEdge(head, 1, 2);
addEdge(head, 1, 3);
addEdge(head, 1, 4);
addEdge(head, 2, 3);
addEdge(head, 3, 4);
printGraph(head, 5);
return 0;
}
但是如果我更新 printGraph
函数中的以下更改,代码会导致 运行时错误 。
void printGraph(struct node* head, int vertex) {
struct node* temp = head;
for( int i = 0; i < vertex; i++ ) {
printf("All nodes connected to node %d is ", (temp+i)->index);
temp = (temp+i)->next;
while(temp != NULL) {
printf("-> %d", temp->index);
temp = temp->next;
}
printf("\n");
}
}
下面这行是我想不通的主要问题: 为什么这行代码会导致运行时错误?
temp = (temp+i)->next;
P.S。使用的编译器是 GCC 6.3
.
错误出现在您到达 temp == NULL
以退出 while
循环的内部 while
循环和外部 for
循环的第一行循环调用 (temp + i)->index
。由于 temp
为空,因此您会收到错误消息。
但是,在第一个代码中,您在外循环开始时使用 head
而不是 temp
(与使用 temp
的第二种情况相反) .因此,您根据 head
更改 temp
的值,与第二种情况相比,temp
的空值没有任何问题。
为了解决这个问题,你可以启动另一个变量,如temp
作为new_temp
,用于内部while
循环,并区分内部和外部循环的逻辑。