我正在尝试创建一个包含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;
}
这两个函数都是无效的,并且具有未定义的行为,至少是因为在这两个功能中都有向未分配内存写入或从未分配内存读取的尝试。
尝试以下
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;
}
}
请注意,尽管有些编译器允许使用返回类型为void的主声明,但这种声明不符合C。
你应该写
int main( void )
问题是,在new_msg()
函数中,您定义了一个局部变量m
,它从未被存储,全局queue
也从未被更新。在每次调用中,queue
都等于NULL。
接下来,在printList()
函数中,
temp
单元化- CCD_ 7很可能在第一次迭代中评估为false
假设new_msg
是正确的,则将指针列表打印为空,可能会导致核心转储。
您的M temp;
未初始化。你可能想要:
M temp = queue;