【问题标题】:How to link different nodes in linked list and traverse it如何链接链表中的不同节点并遍历它
【发布时间】:2014-02-28 15:23:04
【问题描述】:

我是链表的初学者。我有一种情况,在终端获取链接的大小,然后读取要保存在频率中的所有数据(在我的代码中,它是“频率”,但通常称为数据/信息),并使用它们创建一个链表.

到目前为止我所做的在下面的代码中显示,它只是读取要创建的 LL 的大小并为每个输入的数据创建节点。现在我必须如何链接这些节点,以使元素首先指向其他元素,最后一个元素将具有 NULL。现在我在每个创建的节点的下一个都有 NULL。

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include <string.h>

struct node
{
 int freq;
 struct node *next;
};
typedef struct node node;
node *tree=NULL;

main()
{
int size,data;

printf("enter the size of node\n");
scanf("%d", &size);
printf("start entering the number of elements until your size\n");
node *prev;
 node *temp;
prev = NULL;
do
{
 scanf("%d\n", &data);

 temp = (node*)malloc(sizeof(node));
 temp->freq=data;
 temp->next=NULL;
 if (prev)
    prev->next = temp;
 else
    tree = temp;
 prev = temp;
 size--;
}
while(size>0);

node *temp1;
temp1=temp;
while(temp1->next!=NULL)
{
  printf("%d-> ",temp->freq);
  temp1=temp1->next;
}
}

Que(1):我尝试链接这些在终端获取的节点,但它仍然不打印遍历的链表。问题出在哪里?

The output is:
hp@ubuntu:~/Desktop/Internship_Xav/Huf_pointer$ ./ll 
enter the size of node
4
start entering the number of elements until your size
22
11
4
5
6//It don't print the linked list here
hp@ubuntu:~/Desktop/Internship_Xav/Huf_pointer$ 

【问题讨论】:

    标签: c algorithm data-structures linked-list nodes


    【解决方案1】:

    您必须跟踪在前一次迭代中添加的节点,以便您可以使前一个节点next 字段指向新节点。像这样的:

    printf("start entering the number of elements until your size\n");
    node *prev;
    prev = NULL;
    do
    {
     scanf("%d\n", &data);
     node *temp;
     temp = (node*)malloc(sizeof(node));
     temp->freq=data;
     temp->next=NULL;
     if (prev)
        prev->next = temp;
     else
        tree = temp;
     prev = temp;
     size--;
    }
    while(size>0);
    

    请注意,在第一次迭代中,这会将tree 设置为新分配的节点。如果您想在创建列表后遍历它,这是必要的。到循环结束时,head 指向第一个元素,最后一个元素的next 指向NULL。

    是的,您遍历列表的方法是正确的。

    更新

    您描述的遍历列表的方法是正确的,但您没有正确实现。

    您希望从列表的头部开始,而不是从temp,因为temp 是您分配的最后一个节点。并且条件不是while (temp1-&gt;next != NULL),循环永远不会执行,因为temp1是最后一个节点,而最后一个节点的next字段总是指向NULL。

    相反,这是你想要的:

    node *temp1;
    temp1 = tree;
    while(temp1 != NULL)
    {
      printf("%d-> ", temp1->freq);
      temp1 = temp1->next;
    }
    

    注意printf() 的参数也发生了变化,您传递的是temp-&gt;freq,正确的变量应该是temp1-&gt;freq。

    【讨论】:

    • 谢谢,让我应用它。然后我会回到你身边。 :)
    • 我无法理解这些行,您能否再次解释一下这些行“if (prev) prev->next = temp; else tree = temp; prev = temp;”还有为什么你需要使用“prev”节点?
    • @user234839 它为tree 提供初始化。 if (prev) 的意思是“如果这不是我们第一次来”——在这种情况下,我们将先前的节点 next(即 prev-&gt;next)更新为新节点(即 temp)。否则(即prev 为NULL,第一次通过),我们将tree 初始化为temp,因为这将是列表的头部。然后,毕竟,在任何一种情况下,我们总是执行prev = temp;,因为temp 现在是下一次迭代的前一个节点。 prev = temp; 为下一次迭代准备代码。
    • 我按照您的要求进行了更改。 (请参阅编辑后的代码)但它仍然不打印链接列表。有什么帮助吗?它只是不执行while循环来打印树(并遍历)一次。
    【解决方案2】:

    只需跟踪前一个节点并将其链接到下一个节点。

    node *temp,*temp2=NULL,*head;
    do
    {
     scanf("%d", &data);
    
     temp = (node*)malloc(sizeof(node));
     if (temp2==NULL)
       head=temp;
     else
       temp2->next=temp;
    
     temp->freq=data;
     temp->next=NULL;
     temp2=temp;
    
     size--;
    }while(size>0);
    

    head会给出链表的起始节点。

    另外,您可能想要scanf("%d", &amp;data); 而不是scanf("%d\n", &amp;data);。见this answer。

    【讨论】:

    • 不是我,但可能是因为您的第一个答案不起作用。你错过了while (size &gt; 0);
    • @RikayanBandyopadhyay ,我已经编辑了代码。它仍然不遍历链表。如果您看到输出,那么它只是读取数据并中断代码。有什么帮助吗?
    • @user234839 立即查看答案。
    猜你喜欢
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多