C语言中的双链表,忽略了最后一个条目,或者想要一个并没有的条目

C语言中的双链表,忽略了最后一个条目,或者想要一个并没有的条目,c,C,我一直在学习第四版中Kochan编程中的C语言。我正试图在几个小时把头撞在墙上和寻求见解之间取得平衡 我在关于指针的章节中,练习了构建一些函数,然后扩展到双链表。其中一项是让列表指向前后和前后。我的问题是,当从前面到后面时,最后一个条目会显示一个我想跳过该值的值。同一个方向走另一个方向。我一直使用的方法是在前面和后面有一个节点条目,以便能够将条目添加到列表的开头和结尾。请注意,我们还没有达到内存分配之类的要求。我还保留了insert函数,以防出现问题。提前谢谢 #include <stdi

我一直在学习第四版中Kochan编程中的C语言。我正试图在几个小时把头撞在墙上和寻求见解之间取得平衡

我在关于指针的章节中,练习了构建一些函数,然后扩展到双链表。其中一项是让列表指向前后和前后。我的问题是,当从前面到后面时,最后一个条目会显示一个我想跳过该值的值。同一个方向走另一个方向。我一直使用的方法是在前面和后面有一个节点条目,以便能够将条目添加到列表的开头和结尾。请注意,我们还没有达到内存分配之类的要求。我还保留了insert函数,以防出现问题。提前谢谢

#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;
}```
#包括
#包括
结构条目
{
结构条目*上一个;
int值;
结构条目*下一步;
};
void insertEntry(结构条目*内容,结构条目*位置)
{
什么->下一步=哪里->下一步;
what->previous=何处->previous;
where->next=什么;
where->previous=什么;
}
作废打印条目\u反向(结构条目首字母)
{
while(initial.previous!=NULL){
printf(“%i\n”,首字母.previous->value);
initial.previous=initial.previous->previous;
}
}
作废打印条目(结构条目首字母)
{
while(initial.next!=NULL){
printf(“%i\n”,首字母.next->value);
initial.next=initial.next->next;
}
printf(“\n”);
}
内部主(空)
{
结构入口头部、底部、n0、n1、n2、n3、n4、nx;
结构条目*list\u ptr,*list\u end;
列表\u ptr=&n0;
列表结束=&n4;
n1.数值=100;
n2.1值=200;
n3.1值=300;
n4.1值=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;
插入法(&nx和&n2);
打印条目(*列表_ptr);
打印条目的反向(*列表结束);
返回0;
}```

一个问题是,
printEntries
函数实际上打破了列表

void printEntries_Reverse (struct entry *initial)
    {
        if (initial->next == NULL)
            initial = initial->previous;

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

void printEntries(struct entry *initial)
{
    if (initial->previous == NULL)
        initial = initial->next;
     while (initial->next != NULL){
        printf("%i   \n", initial->value);
        initial = initial->next;
}
printf("\n");
}
该行:
initial.next=initial.next->next
正在重新分配列表中每个节点的下一个指针

void printEntries_Reverse (struct entry *initial)
    {
        if (initial->next == NULL)
            initial = initial->previous;

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

void printEntries(struct entry *initial)
{
    if (initial->previous == NULL)
        initial = initial->next;
     while (initial->next != NULL){
        printf("%i   \n", initial->value);
        initial = initial->next;
}
printf("\n");
}
下面是调用
printEntries

经过一次迭代后,这些条目如下所示:

我稍微更改了print entries函数,如下所示:

void printEntries(struct entry *initial)
{
     while (initial != NULL){
        printf("%i   \n", initial->value);
        initial = initial->next;
}
printf("\n");
}
主要原因是在不更改列表节点中实际存在的任何指针的情况下遍历列表。它只更改指针变量
initial
,而不更改列表的内容

void printEntries_Reverse (struct entry *initial)
    {
        if (initial->next == NULL)
            initial = initial->previous;

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

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

我知道那种把头撞在墙上的感觉。我在这里使用了
gdb
来查找bug,我强烈建议任何学习C的人学习基础知识

进入Gdb是相当令人害怕的,但是95%的时候,您需要使用的只是本文中的部分,直到“Misc”部分



Welp,由于对我的列表结构的澄清,我能够通过添加一些“IF”语句来测试条目何时应该是列表的一部分来解决我的问题

void printEntries_Reverse (struct entry *initial)
    {
        if (initial->next == NULL)
            initial = initial->previous;

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

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

哦,是的,看起来很棒,我会去看看。调试器是后面的一章,但我不认为现在讨论它有什么错。我仍然在复习你上面的答案,这需要我永远的时间,对不起,谢谢。不要难过:)靠你自己学习很难,唯一的方法需要时间。祝你好运它更干净,但也有同样的问题。从后到前,它希望显示400,这是因为列表在到达NULL之前到达400,而反过来也是如此。