我需要在程序中创建一个链表。在我的程序中,列表是用malloc()在堆上分配的,然后我试图访问它,但我遇到了分段错误;
编辑:我在这行得到SIGSEGV"while(!(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; }
调用者函数将获得列表的头。
据我所知,问题出在行
node = newNodeXInterval(TYPE_END_LIST, 0);
在指定之前,node
指向链表中的最后一个节点,上一个节点的next
指针等于node
。分配后,node
指向类型为TYPE_END_LIST
的新创建的节点,但前一个节点的next
指针保持不变(即,它仍然保持node
的原始值)。换句话说,新创建的节点不是列表的一部分,因此下面的while()
循环中的条件node->nodeType == TYPE_END_LIST
永远不会计算为true,并且当您超过列表的末尾时,您最终会取消引用空指针。将线路更改为
node->next = newNodeXInterval(TYPE_END_LIST,0);
应该可以解决问题。