当前位置: 首页 > 知识库问答 >
问题:

重新排列双链表时偶尔出现错误

水麒
2023-03-14

我很抱歉,如果这对一些人来说可能是微不足道的,但在过去的一天里,我无法弄清楚为什么会发生这种故障。我有一系列的双链表,我保持一定的顺序。每次访问或更新列表中的节点时,都会将其移动到列表的开头,这在数组中的每个链接列表中都会发生。我将提供如何初始化链表数组以及如何排列顺序的代码。感谢您的帮助。如果有帮助的话,可以使用双链表数组来模拟缓存。我只是希望这是显而易见的事情,因为我对malloc和C有点陌生。第一次使用这个网站,所以请让我知道,如果我没有遵循惯例,或者我的帖子有问题

我试着打印出链表数组的结构,它似乎总是结构合理的。只有当我重新排列节点时,特别是当我试图访问节点时,才会出现分段故障。

void maintainLRU(cacheBlock* ptr, int index)//rearranges a list with node passed in to be head
{
    if(ptr->next == NULL)//Tail
    {
        ptr->next = cache[index].head;
        cache[index].head = ptr;
        cache[index].tail = ptr->prev;
        ptr->prev->next = NULL;
        ptr->prev = NULL;
    }
    else
    {
        ptr->prev->next = ptr->next;
        ptr->next = cache[index].head;
        cache[index].head = ptr;
        ptr->prev->next = NULL;
        ptr->prev = NULL;
    }
}

//following code exists within main and is how i initialize the'cache'
numLines = cacheSize/(blockSize*assocType); //determines number of linked lists in my array. 
cache = malloc(sizeof(cacheLine)*numLines);
for(int i = 0; i < numLines; i++)
{
        cacheBlock* temp = malloc(sizeof(cacheBlock));
        temp->valid = 0; //whether the node holds data yet or not
        cache[i].head = temp;
        for(int j = 1; j < assocType; j++)//assoctype is just how many nodes in the list
        {
            temp->next = malloc(sizeof(cacheBlock));
            temp->next->prev = temp;
            temp->next->valid = 0;
            temp = temp->next;
        }
        cache[i].tail = temp;
}//cacheblock is just a node with next, prev, and a valid bit
//cacheLine is just a struct with a pointer to a headnode
//the maintain order function is explicitly called only if the node updated or accessed is not the head.```

共有1个答案

齐文林
2023-03-14

案例1:ptr是在列表的末尾,你正确地移除自己,把自己放在列表的开头,但不要让列表的“旧”头指向你;所以你的名单是腐败的。

案例2:ptr不在列表的末尾,你将上一个指向下一个,但不要将下一个指向上一个,这样列表就会损坏。

所有情况下:你应该提供足够多的程序,有人可以编译并试用。在某种程度上,这将导致你对自己的工作进行充分的分析,从而注意到明显的错误。微妙的是这个论坛的目的。

30年前,严格优化链表操作是非常重要的;在那段时间里,编译器书呆子已经提升了他们的游戏水平,你应该能够将维护LRU写成:

void maintainLRU(cacheBlock* ptr, int index) {
    list_remove(&cache[index], ptr);
    list_insert_before(&cache[index], cache[index].head, ptr);
}

所以你不会成为简单错误的受害者。

 类似资料:
  • 我有一个文件解析器代码,偶尔会在m.matches()上出现堆栈溢出错误(其中m是匹配器)。 我再次运行我的应用程序,它解析相同的文件,没有堆栈溢出。 我的模式确实有点复杂。它基本上是一组可选的零长度正lookahead,其中包含命名组,这样我就可以匹配一组变量名/值对,而不考虑它们的顺序。但我认为,如果某个字符串会导致堆栈溢出错误,它总是会导致它。。。不只是有时候。。。有什么想法吗? 我的模式

  • 我真的很难修复我的代码。我已经创建了一个双链接列表,我正试图反向遍历它。 有什么想法吗? 这是我的代码:Node。爪哇: 下面是第二个类“DNode.java”: 最后,这里是双链接列表。java:(重写另一个类“链表”中的“添加”和“删除”方法) 公共类双链接列表扩展了链接列表{ 我可以向前打印列表,但向后打印时会遇到无限循环。有什么想法吗? 谢谢

  • 因此,我对数据结构很陌生,我在对数组进行排序时,在尝试了几天之后,我偶然发现了双链表的插入排序。我仍然无法理解排序有什么问题,是的,我已经在线检查过,我不能只插入排序,我需要对函数参数中传递的列表进行排序,它的名称是internationSort(Dlinkedlist-arr)。 ` ` 我尝试实现它,但我被困住了,因为处理数组的逻辑有点不同,因为我们正在使用 next 和 prev 指针,这使

  • 我是C语言的新手。我正在尝试创建一个双链接列表,其中数据字段是一个结构。但是当我输出元素时,只有结构的第一个字段正确显示。 所以,我有几个问题。我是否正确声明了节点值字段?我是否正确地插入了列表末尾的节点?双向链表项的输出正确吗?我的错误在哪里,如何纠正?

  • 对于使用c实现的链表队列,我的入队列和出队列有点问题。我的老师说模板是禁止使用的,我不能改变他给我们的公共和私人功能。我总是遇到一个分割错误。我真的不明白我做错了什么。我还包括了header、enqueue和dequeue函数。

  • 问题内容: 最近,我将计算机更新为功能更强大的计算机,并配备了四核超线程处理器(i7),因此可以使用大量实际并发。现在,我退出()正在开发的应用程序(带有Swing GUI)时, 偶尔会 遇到以下错误: 好吧,鉴于它开始使用具有更多并发能力的硬件发生,并且与线程有关,并且偶尔发生,这显然是某种时机。但是问题是堆栈跟踪太短了。我只有上面的清单。它根本不包含我自己的代码,因此很难猜测该错误在哪里。 有