C中的双链表,忽略最后一个条目,或者想要一个不存在的条目

杰里·辛格

我一直在用Kochan的C 4版编程研究C。我试图在将头撞到墙上几个小时和寻求见解之间取得平衡。

我在有关指针的章节中,练习使您构建了许多功能,然后扩展到双向链表。一项是使列表点从前到后和从后到前。我的问题是,从前向后移动时,最后一个条目会在我要跳过该值的位置显示一个值。相同的方向。我一直在使用的方法是在节点的前面和后面都有一个节点条目,以便能够将条目添加到列表的开头和结尾。请注意,我们尚未达到内存分配之类。我也留在我的插入功能,以防万一那里有问题。提前致谢

#include <stdio.h>
#include <stdbool.h>

struct entry
  {
      struct entry *previous;
      int      value;
      struct entry *next;
  };

void insertEntry(struct entry *what, struct entry *where)
{
    what->next = where->next;
    what->previous = where->previous;
    where->next = what;
    where->previous = what;
}

void printEntries_Reverse (struct entry initial)
    {
        while (initial.previous != NULL){
            printf("%i  \n", initial.previous->value);
            initial.previous = initial.previous->previous;
        }
    }

void printEntries(struct entry initial)
{
     while (initial.next != NULL){
        printf("%i   \n", initial.next->value);
        initial.next = initial.next->next;
}
printf("\n");
}

int main (void)
{
  struct entry head, foot, n0, n1, n2, n3, n4, nx;

  struct entry *list_ptr, *list_end;

  list_ptr = &n0;
  list_end = &n4;

    n1.value = 100;
    n2.value = 200;
    n3.value = 300;
    n4.value = 400;


    n0.next = &n1;
    n1.next = &n2;
    n2.next = &n3;
    n3.next = &n4;
    n4.next = NULL;


    n0.previous = NULL;
    n1.previous = &n0;
    n2.previous = &n1;
    n3.previous = &n2;
    n4.previous = &n3;

    nx.value = 250;

    insertEntry(&nx, &n2);
    printEntries(*list_ptr);
    printEntries_Reverse(*list_end);

  return 0;
}```
甘地

一个问题是该printEntries函数实际上正在中断列表。

这行:initial.next = initial.next->next;在列表中的每个节点中重新分配下一个指针。

这是呼叫前3个项目的样子 printEntries 在此处输入图片说明

经过一次迭代,这些条目如下所示:
在此处输入图片说明

我更改了打印条目功能,使其看起来像这样:

void printEntries(struct entry *initial)
{
     while (initial != NULL){
        printf("%i   \n", initial->value);
        initial = initial->next;
}
printf("\n");
}

主要原因是要遍历列表而不更改列表节点中实际存在的任何指针。它仅更改指针变量initial,而不更改列表的内容。


我知道那种把头撞在墙上的感觉。我曾经gdb在这里找到错误,并且强烈建议向学习C的任何人学习基础知识。

Gdb非常令人恐惧,但是95%的时间中,您需要使用的只是本文中“ Misc”部分中的部分https://beej.us/guide/bggdb/


本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

查找给定值的数据,如果不存在,则查找该值数据系列中的最后一个条目

Mongodb:如果不存在,如何在数组中创建一个条目

在c的链表中插入一个条目

联接 SQL Server 中的两个表以删除其中一个表中不存在的条目

Kotlin:警告:Classpath条目指向一个不存在的位置:

条目和最后一个条目之前的条目

Arrayformula查找最后一个条目

检索每个的最后一个条目

按月返回最后一个条目

链表 C - 当不存在时创建一个 Head

测试当前条目是CollectionViewSource中的第一个条目还是最后一个条目

更改逗号分隔列表中的最后一个条目

从表中获取最后一个条目

获取连接中的最后一个条目

jq如何获取对象中的最后一个条目

如何只选择表中的最后一个条目?

R 中的 for 循环只迭代最后一个条目

如何获取烧瓶中的最后一个条目

仅删除紧邻链表中最后一个节点的不存在的节点会终止程序

这是“双重检查”反模式的情况吗?(获取一个地图条目并创建它,如果它不存在)

为什么我的链表仅打印最后一个条目?

Tools.DiffFiles 返回错误 <FileName> 不存在或者是一个目录

从一个表中查找在另一个表中不存在的记录,或者对于特定值总和为0

从键值对中获取一个条目

随着打印条目的文本,最后一个字符被忽略。怎么修?

从链表C#中删除最后一个节点

如何将分区中的最后一个条目与下一个中的第一个条目合并?

如果在sql的新表中不存在该条目,如何将行从一个表复制到另一个表

让一个节点忽略CSS类条目