c - 链表在打印时仅显示第一个节点元素

标签 c algorithm data-structures linked-list singly-linked-list

我正在尝试创建一个链表,以增强我对指针和地址的概念。我必须按以下方式创建链表:

(1) 在终端同时读取所有节点。

(2) 然后显示最后形成的最终链表。

我如何尝试这样做? 我首先阅读链表的大小(要输入的节点总数)。然后我在 do-while 循环中一一读取所有节点。阅读所有节点后,我尝试创建链表。我区分了节点是第一个由 count 变量创建的节点的情况,当节点是第一个节点时它将具有 count=0 之后它将在另一个节点中循环。

我得到的输出如下:

 enter the size of node
4
start entering the number of elements until your size
2
3
4
5
Printing linked list
2-> //It don't print the other nodes, Just first one
hp@ubuntu:~/Desktop/pointer$ 

我的完整代码是:

#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;

void main() 
{
    int size, data;
    int count = 0; //this count flag is to check is it's first node or not inside the do-while loop.
    tree = NULL;
    printf("enter the size of node\n");
    scanf("%d", & size);
    printf("start entering the number of elements until your size\n");
    node * temp3 = tree;
    node * prev;
    //Problem creating area is below
    do
    {
        scanf("%d", & data);
        if (count == 0)
        {
            node * temp;
            temp = (node * ) malloc(sizeof(node));
            temp-> freq = data;
            temp-> next = NULL;
            prev = temp;
        } 
        else if (count != 0) 
        {
            node * temp;
            temp = (node * ) malloc(sizeof(node));
            temp-> freq = data;
            temp-> next = NULL;
            prev-> next = temp;
        }
        size--;
        ++count;
    }
    while (size > 0);

    printf("Printing linked list\n");
    node * temp1;
    temp1 = prev;
    //there may be problem here
    while (temp1-> next != NULL) 
    {
        printf("%d-> ", temp1-> freq);
        temp1 = temp1-> next;
    }
    printf("\n");
}

任何人都可以通过指出错误的解决方案来帮助我打印完整的链表吗?

最佳答案

好的,这里有一些不必要的指针和一些指针错误,为了便于回答,我已经重写了您的代码,我将尝试解释我在这里所做的事情:

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

struct node
{
    int freq;
    struct node * next;
};
typedef struct node node;
//only need two pointers when building a linked list, one for the top and one for the
//current node
node *tree = NULL, *curr = NULL; //init both pointers to NULL initially

int main()
{
    int size, data; //dont need count, you'll see in a minute why
    printf("enter the size of node\n");
    scanf("%d", & size);
    printf("start entering the number of elements until your size\n");

    //Problem creating area is below
    do
    {
        scanf("%d", &data);
        if (tree == NULL) //just test for top node being NULL instead of using count
        {
            node *temp;
            temp = malloc(sizeof(node));
            temp->freq = data;
            temp->next = NULL;
            //stylistically i like using curr rather than prev, just a style choice
            tree = temp; //set tree to first node
            curr = tree; //make the top node the current node
        }
        else //don't need else if, there are only two conditions
        {
            node *temp = malloc(sizeof(node));
            temp->freq = data;
            temp->next = NULL;
            curr->next = temp; //set the next node in list to the new one
            curr = curr->next; //here's where you had pointer issues, move the current
                               //to the newly created node
        }
        size--;
    }
    while (size > 0);

    printf("Printing linked list\n");
    curr = tree; //reuse curr, no need to make a new pointer

    //test for the current node being NULL, takes care of special case of empty list
    //causing a segfault when you attempt to access a member of an invalid pointer
    while (curr != NULL)
    {
        printf("%d->", curr->freq);
        curr = curr->next; //move to next item in list
    }
    printf("\n");
    return 0;
}

我运行了一个样本运行,大小为 3,输入为 1、2 和 3,得到的输出为:1->2->3->

关于c - 链表在打印时仅显示第一个节点元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212537/

相关文章:

c - 相当于 C 的 perl 语句

c++ - typedef 结构中的下划线是什么意思?

java - 算法问题,android java

algorithm - 如何从具有链接信息的配对数据列表中找到唯一名称的数量?

C: 当 Haystack 中找不到 Needle 时,my_strstr 返回 Needle

c - 为什么没有关于管道的维基百科?

algorithm - 如何计算平面分布的重心?

file - 文件修改的时间复杂度?

C++ 线程安全双向链表

C++:隐式链表