C代码:不能像我预期的那样打印出整个链表

时间:2014-10-26 04:57:31

标签: c data-structures

我已经盯着这些代码这么久了,它仍然没有像我预期的那样工作。代码应该只允许用户通过输入链表的长度和每个节点的数据来初始化链表,然后打印出所有数据。

#include "stdio.h"
#include "stdlib.h"

typedef struct Node {
    int data;
    struct Node* next;
} Node;

int n,x,i;
Node* head = (Node*)malloc(sizeof(Node));

void Init(int x, Node* temp){
    Node* newNode = (Node*)malloc(sizeof(Node));
    temp->data = x;
    temp->next = newNode;
    temp = newNode;
}

void Print(){
    Node* temp = head;
    while(temp != NULL){
        printf("%d ", temp->data);
        temp = temp->next;
    }
}

int main(){
    printf("Please enter the number of nodes in the linked list:\n");
    scanf("%d", &n);
    Node* temp = head;
    printf("Please enter the data of the node:\n");
    for(i=0;i<n;i++){
        scanf("%d", &x);
        Init(x,temp);
    }
    Print();
}

我认为head节点可能存在一些问题。当我运行代码时,数据似乎插入没有问题,但它无法从Print()函数的最开始打印出所有内容。

这是我跑步时的样子。

Please enter the number of nodes in the linked list:
4
Please enter the data of the node:
1
2
3
4
4 -842150451 Press any key to continue

我想我可能已经错过了一些非常基本的东西,对不起,如果我有新的学习C和数据结构。

2 个答案:

答案 0 :(得分:1)

您的Init功能存在问题,您需要在链接列表的末尾添加新节点。

尝试使用固定代码:


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

typedef struct Node {
    int data;
    struct Node* next;
} Node;

void Init(int x, Node* head)
{
    Node *temp;
    //Add the new node to end of the list
    for(temp=head;temp->next!=NULL;temp=temp->next); 
    Node* newNode = malloc(sizeof(Node));
    if(!newNode)
    {
        fprintf(stderr, "out of mem\n");
        exit(EXIT_FAILURE);
    }
    temp->data = x;
    temp->next = newNode;
    temp = newNode;
}

void Print(Node* head)
{
    Node* temp = head;
    while(temp->next != NULL)
    {
        printf("%d ", temp->data);
        temp = temp->next;
    }
}

int clean_stdin()
{
    while (getchar()!='\n');
    return 1;
}

int main()
{
    int n,x,i;
    int c;
    Node *head = malloc(sizeof(Node));
    if(!head)
    {
        fprintf(stderr, "out of mem\n");
        exit(EXIT_FAILURE);
    }
    head->data = 0;
    head->next = NULL;

    printf("Please enter the number of nodes in the linked list: ");
    while(scanf("%d",&n) != 1)
    {
        printf("Please enter the number of nodes in the linked list(Integer value): ");
        while(getchar() != '\n');
    }
    //Clear input buffer
    while ( (c = getchar()) != '\n' && c != EOF );

    printf("Please enter the data of the node:\n");
    for(i=0; i<n; i++)
    {
        while(scanf("%d", &x) != 1)
        {
            printf("Please input an integer\n");
            while(getchar() != '\n');
        }
        //Clear input buffer
        while ( (c = getchar()) != '\n' && c != EOF );
        Init(x,head);
    }
    Print(head);
    return(EXIT_SUCCESS);
}

答案 1 :(得分:1)

此功能

void Init(int x, Node* temp){
    Node* newNode = (Node*)malloc(sizeof(Node));
    temp->data = x;
    temp->next = newNode;
    temp = newNode;
}

不会更改调用函数中的Node。不仅如此,newNode现在是内存泄漏。

您的代码需要一些重新工作。 Init()可以设计为在列表末尾或列表开头添加项目。您必须决定要实现的行为。之后,Init需要重新设计一点以匹配预期的行为。