打印链表时出现问题
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()
函数中,
temp
被单元化
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 )
我正在尝试创建一个包含 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()
函数中,
temp
被单元化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 )