双向链表上的 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->let
和 stop->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->prev
和stop->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!=NULL
和current->prev!=NULL
都会为false,循环甚至不会执行一次。因此,不会打印任何内容,因为 for
循环永远不会执行。
为了更清楚地理解 for
循环的工作原理,请参阅此流程图:
您还可以查看 this for
循环教程。
您还可以查看维基文章:For loop
这是列表的声明:
typedef struct list
{ char let;
struct list *next;
struct list *prev;
}list;
list *start=NULL, *stop=NULL;
设测试词为Example
用于创建列表的函数按预期工作。我试着打印
stop->let
和 stop->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->prev
和stop->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!=NULL
和current->prev!=NULL
都会为false,循环甚至不会执行一次。因此,不会打印任何内容,因为 for
循环永远不会执行。
为了更清楚地理解 for
循环的工作原理,请参阅此流程图:
您还可以查看 this for
循环教程。
您还可以查看维基文章:For loop