我需要在程序中创建一个链表。在我的程序中,列表使用malloc()分配在堆上,而不是我尝试访问它但是我得到了一个segmetation错误;
编辑:我在这一行获得了SIGSEGV“而(!(node-> nodeType == TYPE_END_LIST)){”
struct dagNode *createList(int k);
struct dagNode *newNodeXInterval(int type, int val);
struct dagNode *createList(int k){
struct dagNode *head, *node;
printf("\nList %d = ", k);
head = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,1));
node = head;
int i;
for (i=1; i<LENGTH_OF(k); i++){
node->next = newNodeXInterval(TYPE_XTEST, getRightPointOf(k,i));
node = node->next;
node->next = newNodeXInterval(TYPE_EDGE_OR_GAP, getVal(k,i+1));
node = node->next;
}
node = newNodeXInterval(TYPE_END_LIST, 0);
node = head; // i think that here there is the error
printf("%d", node->val); i=0;
while(!(node->nodeType == TYPE_END_LIST)){
printf("%d ", i);
node = node->next;}
return head;}
struct dagNode *newNodeXInterval(int type, int val){
struct dagNode *node = (struct dagNode *) malloc(sizeof(struct dagNode));
if (type == TYPE_EDGE_OR_GAP){
*node = (struct dagNode) {(val<0)? TYPE_GAP:TYPE_EDGE, val, NULL, NULL, NULL};
}
else{
*node = (struct dagNode) {type, val, NULL, NULL, NULL};
}
return node; }
调用者函数将成为列表的头部。
答案 0 :(得分:1)
据我所知,问题在于行
node = newNodeXInterval(TYPE_END_LIST, 0);
在分配之前,node
指向链接列表中的最后一个节点,而前一个节点的next
指针等于node
。在分配后,node
指向新创建的类型为TYPE_END_LIST
的节点,但前一个节点的next
指针保持不变(即它仍保留原始值node
)。换句话说,新创建的节点不是列表的一部分,因此以下node->nodeType == TYPE_END_LIST
循环中的条件while()
永远不会计算为true,并且最终会取消引用空指针当你超过列表的末尾。将行更改为
node->next = newNodeXInterval(TYPE_END_LIST,0);
应该解决问题。