链接列表仅显示打印时的第一个节点元素

时间:2014-03-06 00:39:33

标签: 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");
}

有没有人可以帮我打印完整的链表,指出我的解决方案是错误的?

2 个答案:

答案 0 :(得分:2)

你有两个问题。

else if (count != 0) 
    {
        node * temp = prev;
        temp = (node * ) malloc(sizeof(node));
        temp-> freq = data;
        temp-> next = NULL;
        prev-> next = temp;
    }

您不会将prev更改为指向新节点。它仍然指向您的场景中的“2”,并且列表中的节点永远不会超过两个。

尝试类似

的内容
else if (count != 0) 
    {
        /* node * temp = prev; */ //This code is not doing anything useful
        temp = (node * ) malloc(sizeof(node));
        temp-> freq = data;
        temp-> next = NULL;
        prev-> next = temp;
        prev = temp;
    }

接下来,您的打印循环应该是

node* temp1 = start; //You need a variable that points to the first node in the list
do 
{
    printf("%d-> ", temp1-> freq);
    temp1 = temp1-> next;
} 
//The last item will always have next == NULL, and must be included
while (temp1-> next != NULL); 

答案 1 :(得分:2)

好的,有一些不必要的指针和一些指针错误,为了便于回答我已经重写了你的代码,我会试着解释一下我在这里做了什么:

#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-&gt; 2-&gt; 3-&gt;