我试图使用struct-nodes理解c中所谓的链表。我想要的是在代码中使用相同的指针,但在执行时,for循环打印最后一个字符。我想我理解为什么 - 可能是因为指针指向程序中的第二个节点和最后一个节点。
程序将两个字符放入连续节点 - 字母“h”和“e”。目的是打印这些字符。
所以问题 - 如何使用此指针返回第一个节点?是创建两个指针的唯一答案 - 即一个指针调用例如startpointer而另一个指针调用nextpointer?或者我可以通过代码以某种方式使用同一个指针吗?
谢谢!
#include <stdio.h>
#include <stdlib.h>
struct listNode {
char c[2];
struct listNode *ptrNextNode;
};
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
int main(void) {
ListNode list_node;
ListNodePtr list_node_ptr;
list_node_ptr = malloc(sizeof(list_node));
strcpy(list_node_ptr->c, "h");
list_node_ptr = list_node_ptr->ptrNextNode;
list_node_ptr = malloc(sizeof(list_node));
strcpy(list_node_ptr->c, "e");
int i;
for (i = 0; i < 2; i++) {
printf("%s", list_node_ptr->c);
}
return EXIT_SUCCESS;
}
答案 0 :(得分:2)
走向黑暗面的道路伴随着这项任务:
list_node_ptr = list_node_ptr->ptrNextNode;
这里用未初始化的值覆盖原始指针。这会使您丢失导致内存泄漏的原始list_node_ptr
。如果您在上述作业之后尝试使用list_node_ptr
,除了作为作业的收件人之外,它将是未定义的行为。
尽管在下一行中,您再次覆盖指针,使其再次成为有效指针,并避免未定义的行为。
总而言之,您没有按照问题中的代码制作链接列表。您可以执行类似
的操作ListNodePtr head, list_node_ptr;
head = list_node_ptr = calloc(1, sizeof(*list_node_ptr));
list_node_ptr->c[0] = 'c';
list_node_ptr->next = calloc(1, sizeof(*list_node_ptr));
list_node_ptr = list_node_ptr->next;
list_node_ptr->c[0] = 'e';
for (list_node_ptr = head; list_node_ptr != NULL; list_node_ptr = list_node_ptr->next)
printf("%s\n", list_node_ptr->c);
在上面的代码中,我在将next
指针重新分配给list_node_ptr
之前分配了它。我还将列表的原始头部保存在head
变量中,以便您可以迭代列表。
答案 1 :(得分:0)
是的,您需要一个双向链表,即使用另一个指针指向上一个节点。