我正在尝试以最有效的方式在C中创建一个已排序的linked_list存储库。链表将存储包含“key”和“data”值的数据记录。链表应保持按键排序的记录。示例链接列表看起来像{1,5},{3,8},{4,7}。链表保持记录按键排序。
我有一个名为“invert”的函数,只有当列表中不存在具有相同键值的记录时才会向列表中添加值。如果在列表中找到密钥,则应删除该记录。我已经拥有了所有这些的功能代码,但现在我正在尝试提高它的效率,所以我修改了我的代码以减少程序的迭代次数。出于某种原因,在我的新代码中,我遇到了分段错误。此外,当我将print语句添加到debug时,除非我将新行字符添加到语句的末尾,否则不会打印print语句。这是代码:
node *pnode;
printf("made pnode\n");
node *delTemp;
printf("made delTemp\n");
node *travTemp;
printf("made travTemp\n");
travTemp = &sentinel; //sentinel is an empty node that is always
// present in the linked list but is not an actual record. It is just there
// to make insert and deletion easier
while((travTemp->next)!=NULL && (travTemp->next->key)<key){
printf("inside while loop\n");
travTemp = travTemp->next;
}
if((travTemp->next->key)==key){
printf("deleting\n");
delTemp = travTemp->next;
travTemp->next = delTemp->next;
free(delTemp);
return 0;
}
printf("outside while loop \n");
pnode = malloc(sizeof(node));
pnode->data = data;
pnode->key = key;
pnode->next = travTemp->next;
travTemp->next = pnode;
return 1;
出于某种原因,“while while loop”和“while while loop”都不会打印。我写了一个快速if语句来查看travTemp-&gt; next是否为null,它应该在程序的开头。但是,在这种情况下,它应该仍然打印“外循环”不应该吗?我对于发生分段错误的位置感到非常困惑。在此先感谢您的帮助。另外,有没有人解释为什么除非我在其中添加“\ n”,否则代码最开头的打印语句不会打印出来?
此外,哨兵的定义如下:
node sentinel;
void Repository_init(){
sentinel.data = -1;
sentinel.next = NULL;
sentinel.key = -1;
}
在main()中调用Repository_init()没有问题。
编辑: 我使用了一个调试器,发现seg错误出现在语句“if((travTemp-&gt; next-&gt; key)== key)”。我可以理解为什么会在程序开始时发生这种情况,但我不确定如何克服这个问题。在if语句周围放置一个if语句来检查travTemp是不是NULL似乎是多余的。
答案 0 :(得分:1)
由于
而发生分段错误if((travTemp->next->key)==key){
何时
travTemp->next == NULL
在这种情况下,无论是在循环内还是在外面打印,都不会打印。