双向链表上的 FOR 循环不是 return 最后一个元素。反向给出了分段错误

FOR loop on doubly linked list doesn't return the last element. The reverse gives a segmentation fault

这是列表的声明:

 typedef struct list
 {  char let;
    struct list *next;
    struct list *prev;
 }list;
 list *start=NULL, *stop=NULL;

设测试词为Example

用于创建列表的函数按预期工作。我试着打印 stop->letstop->prev->next->let 以及 start->next...->next->let 一直到最后一个只是为了检查每个 link 是否正常工作。我确实得到了最后一个字母 e.

然而,下面的 for 循环在显示最后一个字母之前结束。 (输出为Exampl):

for(current=start;current->next!=NULL;current=current->next)
                  printf("%c",current->let);

此外,尝试从右到左显示单词会在显示任何内容之前出现分段错误:

for(current=stop;current->prev!=NULL;current=current->prev)
                  printf("%c",current->let);

根据要求,这里是创建列表的函数。输入是一个字符串。计算后 strlen 该函数为每个字母创建一个新节点。

void create(list *first)

{   list* new_node, *current;
    char word[50];

printf("Please input the word: "); //read the input
scanf("%[^\n]s",&word);
for(int i=0;i<=strlen(word)-1;i++) 
{   new_node=malloc(sizeof(list));
    new_node->let=word[i];
    if(first==NULL)
    {

        start=first=current=new_node;
        current=new_node;
        new_node->prev=NULL;
    }
    else
        if(i==strlen(word)-1)
        {
            current->next=new_node;
            new_node->prev=current;
            new_node->next=NULL;
            stop=current=new_node;


        }
        else
        {
            current->next=new_node;
            new_node->prev=current;
            current=new_node;
        }

}

注:

1.start->prevstop->next是创建列表后的NULL

2.The 完全相同的 for 循环非常适合单个 linked 列表。

3.list *current是显示函数的局部变量

改变

for(current=start;current->next!=NULL;current=current->next)
              printf("%c",current->let);

for(current=start;current!=NULL;current=current->next)
              printf("%c",current->let);

也改

for(current=stop;current->prev!=NULL;current=current->prev)
              printf("%c",current->let);

for(current=stop;current!=NULL;current=current->prev)
              printf("%c",current->let);

因为current->next!=NULLcurrent->prev!=NULL都会为false,循环甚至不会执行一次。因此,不会打印任何内容,因为 for 循环永远不会执行。

为了更清楚地理解 for 循环的工作原理,请参阅此流程图:

您还可以查看 this for 循环教程。

您还可以查看维基文章:For loop