我是C编程的新手,我尝试创建一个SingleLinkedList。我在迭代列表时遇到了问题,但我不知道为什么。
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
struct node {
int val;
};
struct entry {
struct entry *next;
struct node node;
};
struct list_head {
struct entry *next;
};
/* Insert new element in the beginning of the list */
void list_add(struct list_head *list, struct entry *new)
{
if(list == NULL)
{
printf("%s", "Please make sure your head isn't NULL!");
return;
}
else
{
new->next = list->next;
list->next = new;
}
}
/* Check, whether entry is the last entry of the list */
bool list_is_last(struct entry *entry)
{
if(entry->next == NULL)
{
return true;
}
else
{
return false;
}
}
void print_list(struct list_head *list)
{
if(list == NULL)
{
printf("%s", "Please make sure your head isn't NULL!");
return;
}
if(list->next != NULL)
{
struct entry* current;
current = list->next;
while(!list_is_last(current))
{
printf("%i \n", current->node.val);
current = current->next;
}
}
else
{
return;
}
}
int main()
{
struct list_head* head;
head = malloc(sizeof(struct list_head));
head->next == NULL;
int i;
for(i = 0; i < 10; i++)
{
struct entry* e = malloc(sizeof(struct entry));
e->node.val = i + 1;
e->next = NULL;
list_add(head, e);
}
print_list(head);
return 0;
}
在访问列表的最后一项时,我总是在list_is_last方法中获得SegmentationFault。我实际上并没有理解为什么,因为在我看来,他不应该进入&#34;最后&#34;迭代,因为指针&#34; next&#34;最后一个变量应为NULL。
如果有人可以帮助我,我会很高兴。
答案 0 :(得分:0)
布尔最后一个节点检查应该是(这可以让你打印列表的最后一个节点)。
if( entry == NULL )
{
return true;
}
else
{
return false;
}
此外,您应该在null旁边指定head-&gt;的值。
head->next=NULL
不要忘记free
已分配的内容。
您应该检查malloc
的返回值。例如: -
struct list_head * head; head = malloc(sizeof(struct list_head)); if(head == NULL){ fprintf(stderr,“%s”,“malloc中的错误”); 出口(1); }
您应该包含stdlib.h
来运行此代码。 (malloc
等)。
您也可以采取一些措施使您的代码更具可读性: -
选择适当的变量名称。它可以帮助您长期维护代码。
尝试编译代码并查找可能的错误和警告消息。
有时也会干掉代码,以便在代码中出现小错误。
原因是你首先要分配head-next == NULL
。这基本上只是一个比较,head->next
的值不会改变。
head->next
包含垃圾值。
现在您认为已将其分配给NULL
,但您没有使用==
代替=
。
现在,如果您从链接列表中的节点插入逻辑中思考,您将看到在列表头中添加值为1,2,3,4...10
的节点。
因此,在插入所有内容10->9->..._.2->1->(X)
之后,列表就会变为。
您认为(X)= NULL但实际上它是垃圾值。
现在你开始打印了。
你做得很好,然后你去了最后一个节点1
。然后,您检查了next
NULL
是否为1
,当然不是这种情况,因此您打印NULL
然后您现在正在entry==NULL
取消引用一些垃圾值。 ..从这一点开始,它是未定义的行为。而且你的程序可能会打印垃圾值并爆炸或者只是炸掉。
发生了什么事。
另外,为什么需要将逻辑更改为RewriteEngine On
RewriteCond %{QUERY_STRING} ^(.*)lang=en&(.+)$
RewriteRule ^(.*)$ /$1?%1%2&lang=en
...你会明白,如果你用纸画图像并思考。我将把它留作作业。