在链表中使用相同的指针

时间:2013-11-17 13:44:09

标签: c pointers struct linked-list

我试图使用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;
} 

2 个答案:

答案 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)

是的,您需要一个双向链表,即使用另一个指针指向上一个节点。