链接列表C:将节点添加到开始,意外的“0”值

时间:2017-03-26 21:58:00

标签: c linked-list

我正在尝试将新节点添加到链接列表的末尾,我可以添加一些内容,但是当我将其打印出来时,节点的值为“0”。我认为这可能会发生,因为我可能忽略了在某处初始化变量,或忘记分配内存所述变量。但我无法让它发挥作用。

这是我的源代码:

我的链接列表/结构:

#include<stdio.h>

typedef char DATA;

struct Node {
    DATA d;
    struct Node *next;
};

我的printList功能:

void printList(struct Node **head) {
    struct Node *newNode = malloc(sizeof(struct Node));
    struct Node *temp;

    temp = *head;
    printf("Linked list:");

    while (temp->next != NULL) {
        printf( " \n %d ", temp->d);
        temp = temp->next;
    }
    printf("\n");
}

我的insertNodeAtEnd结束函数:

// inset data at end

void insertNodeAtEnd(struct Node *head) {
    struct Node *newNode = malloc(sizeof(struct Node));
    struct Node *currentNode, *temp;

    temp = newNode;
    currentNode = newNode;

    printf("Enter a Node to insert at the end of the list \n");
    scanf("%s", &newNode->d);

    newNode->next = NULL;
    if (head == NULL) {
        head = newNode;
        currentNode = newNode;
    } else {
        temp = head;
        while (temp->next != NULL) {
            temp = temp->next;
        }
        temp->next = newNode;
    }

}

和我的主要():

int main() {
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    struct Node *head = newNode;
    struct Node *temp = newNode;

    head->d = 1;
    int i = 0;
    printf("Enter 3 numbers");

    for (i = 0; i < 3; i++) {
        struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
        scanf("%d", &temp->d);
        temp->next = newNode;
        temp = temp->next;
    }

    insertNodeAtEnd(head);
    printList(&head);

    return 0;

对于任何凌乱的代码感到抱歉,我仍然在这个新的

1 个答案:

答案 0 :(得分:0)

嗯,你有几个错误。首先,您需要添加

temp->next = NULL;
在行insertNodeAtEnd(head);之前

。您的代码可能在没有此行的情况下工作的原因可能是因为您的编译器默认情况下将指针初始化为NULL。例如,在GCC中,您的程序在没有该行的情况下崩溃。第二个问题是您将DATA类型视为char,但将其视为int。如果处理器使用big-engian地址,它可能会导致应用程序崩溃。你应该把它改成

typedef int DATA;

并且还要改变

scanf("%s", &newNode->d);

scanf("%d", &newNode->d);

之后,更改

while(temp->next!=NULL)

while(temp!=NULL)

因为否则你错过了最后一个元素。然后,您需要重新排序一个循环。这是包含所有修复的完整工作代码:

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

typedef int DATA;

struct Node
{
DATA d;
struct Node *next;
};

void printList(struct Node **head)
{
struct Node *newNode;
struct Node *temp;
temp = *head;
printf("Linked list:");
while(temp!=NULL)
{
    printf( " \n %d ", temp->d);
    temp = temp->next;
}
printf("\n");
}

// inset data at end

void insertNodeAtEnd(struct Node **headPointer)
{
    struct Node *head = *headPointer;
    struct Node *newNode = malloc(sizeof(struct Node));
    struct Node *currentNode, *temp;
    temp = newNode;
    currentNode = newNode;
    printf("Enter a Node to insert at the end of the list \n");
    scanf("%d", &newNode->d);
    newNode->next = NULL;
    if(head == NULL)
    {
        head = newNode;
        currentNode = newNode;
    }

else
{
    temp = head;
        while(temp->next!= NULL)
        {
            temp = temp->next;

        }
    temp->next = newNode;
}
  *headPointer = head;
}

int main()
{
struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
struct Node *head = newNode;
struct Node *temp = newNode;
head->d = 1;
int i = 0;
printf("Enter 3 numbers: ");

for(i = 0; i < 3; i++)
{
  if(i){
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    temp->next = newNode;
    temp = temp->next;
    scanf("%d", &temp->d);
  }else{
    scanf("%d", &temp->d);
  }

}
temp->next = NULL;
insertNodeAtEnd(&head);
printList(&head);
return 0;
}

更新

我添加了两个修复程序。正如@BLUEPIXY指出的那样,还有一些OP的错误。我已经发现了它们,但我没有解决它,因为它们对于导致OP问题的原因并不重要。但是,无论如何,错误如下:

首先,如果列表为空,函数insertNodeAtEnd将不会更新指向列表的指针,因为您将指针传递到列表的头部而不是指针的指针到头部。可以通过将**添加到函数参数类型来修复它。

其次,在打印列表时,您不需要分配内存。你显然只是将代码复制到每个函数,甚至是那些不需要插入节点的函数(如printList)。

上面的脚本是更新的脚本,包括这两个修复程序。