打印链表时出现问题

Issue when printing Linked List

我正在尝试创建一个包含 5 个节点的链表并打印它们。我不知道为什么在打印链接列表时看不到结果,即使我没有收到错误并且我确信我的结构很好。我只看到空白屏幕。这是我的代码:

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


typedef struct msg *M;
struct msg{
    double id;
    M next;
};
M queue;

void new_msg(double id);
void printList();

void main()
{
    double r;

    srand(0);
    for(int i=0;i<5;i++){
        r = rand() % 100;
        new_msg(r);
    }

    printList(); // PRINT DOES NOT SHOW RESULTS :(
}

void printList()
{
    M temp;

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

        printf("MSG ID:%6.3f \n", temp->id);
    } 
}

void new_msg(double id)
{
    M m;
    if(queue == NULL)
    {
        m = malloc(sizeof(struct msg));
    }
    else
    {
        m= queue;
        queue = queue->next; 
    }

    m->id = id;
    m->next = NULL;
}

问题是,在 new_msg() 函数中,您定义了一个局部变量 m,它永远不会 存储 和全局变量 queue永远不会更新。在每次调用中,queue 等于 NULL。

接下来,在您的 printList() 函数中,

  1. temp 被单元化
  2. while (temp->next != NULL) 很可能在第一次迭代中评估为 false。

假设 new_msg 是正确的,您正在打印一个指向虚无的指针列表,可能导致核心转储。

您的 M temp; 未初始化。你可能想要:

M temp = queue;

这两个函数都是无效的并且至少有未定义的行为,因为在这两个函数中都试图写入或读取未分配的内存。

尝试以下方法

void printList()
{
    for ( M temp = queue; temp != NULL; temp = temp->next; )
    {
        printf("MSG ID:%6.3f \n", temp->id);
    } 
}


void new_msg(double id)
{
    M m = malloc( sizeof( struct msg ) );

    if ( m != NULL)
    {
        m->id = id;
        m->next = queue;
        queue = m; 
    }
}

请注意,尽管某些编译器允许使用带有 return 类型 void 的主声明,但是这样的声明不符合 C。

你应该写

int main( void )