C 链表的实现

C Implementation of linkedlist

我正在尝试打印存储在链表中的值,但我 运行 正在进入无限 loop.Please 谁能告诉我我的代码有什么问题。我能够成功收集节点的数据,但是在将列表打印时,我 运行 进入连续循环。任何帮助将不胜感激。提前致谢

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

struct node {
    int data; //4 bytes
    struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
};

int main(){
    struct node *head,*newnode,*temp;
    head = NULL ;
    temp = head;
    int count=0, choice=1;

    while(choice){
        newnode = (struct node *)malloc(sizeof(struct node));
        printf("Enter data:");
        scanf("%d",&newnode-> data);
        newnode->next = head;

        if(head == 0){
            head = temp = newnode;
        }
        else{
            temp->next = newnode;
            temp = newnode;

        }
        printf(" %d ",temp->data);

        printf("Do you want to continue? 0/1");
        scanf("%d",&choice);
    }
    int i = 0;
    temp = head;
    while( temp!=NULL){
        printf("%d ",temp->data);
        temp=temp->next;
    }
}

创建新节点时,将其“下一个”节点设置为头节点。这就是循环的制作方式。 将其设置为 NULL。

然后将新节点设置为“当前节点的下一个节点”和“当前节点”。 我相信您想将它设置为 temp 的下一个节点,然后将 temp 移动到它的下一个节点。

此外,请不要将 head 与 0 进行比较...如果您希望它为 NULL,则与 NULL 进行比较。

我怀疑它是否在所讨论的作业问题的范围内,但是将链表任务分解为更小的问题确实很有帮助。

我们从这个节点定义开始:

struct node {
    int data; //4 bytes
    struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
};

我将对其进行 typedef 以使我的生活稍微轻松一些。

typedef struct node {
    int data; //4 bytes
    struct node *next; // 4bytes 32 bit and 8 bytes i 64bit cp
} node_t;

让我们找到给定头的最后一个节点。我们将创建一个名为 currentnode_t 指针,并使用它遍历列表直到到达最后一个节点。我们会知道它是最后一个,因为它的 next 成员将是 NULL。当然,如果headNULL,那么我们就直接returnNULL

node_t *last_node(node_t *head) {
    if (head == NULL) {
        return NULL;
    }

    node_t *current;

    for (current = head; current->next != NULL; current = current->next);

    return current;
}

现在,让我们向具有给定头部的列表添加一个值。我们可以通过 return 指向新的最后一个节点的指针来提供快捷方式。如果 headNULL.

,我们也会缩短很多工作

否则我们将使用我们定义的 last_node 函数获取最后一个节点,将其 next 设置为新节点,并 return 指向新节点的指针。

node_t *add_to_list(node_t *head, int value) {
    node_t * new_node = malloc(sizeof(node_t));
    new_node->data = value;
    new_node->next = NULL;

    if (head == NULL) {
        return new_node;
    }

    node_t *last = last_node(head);
    last->next = new_node;
    return new_node;
}

最后我们可以编写一个函数来打印列表。鉴于您已经看过遍历列表,这应该看起来很熟悉。

void print_list(node_t *head) {
    for (node_t *current = head; 
         current->next != NULL; 
         current = current->next) {
        printf("%d ", current->data);
    }
}

将大问题分解成小问题至关重要。练习吧!