为什么我的 LinkListCreate 函数停止 运行?
why does my LinkListCreate function stop running?
我想通过 CreateLinkList(LinkList *L, int n)
创建一个 link 列表,但是 printf 的输出只有 0 1
。
CreateLinkList
好像停在第3行了。
我该如何解决?
void CreateLinkList(LinkList *L, int n)
{
srand(time(0));
printf("1\n");
*L = (Node*)malloc(sizeof(Node)); \ it seems to stop here
printf("2\n");
Node *flag = *L;
printf("3\n");
for (int i=0; i<n; i++)
{
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = rand() %100+1;
flag->next = newNode;
flag = newNode;
}
printf("4\n");
flag->next = NULL;
printf("5\n");
}
int main()
{
LinkList *p;
printf("0");
CreateLinkList(p, 10);
return 0;
}
LinkList
和Node
定义为:
typedef struct
{
int data;
struct Node *next;
} Node;
typedef Node *LinkList;
对于初学者这个结构定义
typedef struct
{
int data;
struct Node *next;
} Node;
无效。在结构中,类型 struct Node *
与 typedef 名称 Node
.
不同
改写
typedef struct Node
{
int data;
struct Node *next;
} Node;
节点L和节点标志都没有初始化。
*L = (Node*)malloc(sizeof(Node)); \ it seems to stop here
printf("2\n");
Node *flag = *L;
所以这个声明
flag->next = newNode;
调用未定义的行为。
而且指针p也没有在main中初始化
LinkList *p;
所以即使是这个电话
*L = (Node*)malloc(sizeof(Node));
也会调用未定义的行为。
无论如何使用像
这样的typedef是个坏主意
typedef Node *LinkList;
因为它只会让代码的读者感到困惑。
可以按照演示程序中所示定义函数。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node
{
int data;
struct Node *next;
} Node;
typedef Node *LinkList;
void CreateLinkList( LinkList *head, unsigned int n )
{
const int MAX_VALUE = 100;
srand( ( unsigned int )time( NULL ) );
for ( unsigned int i = 0; i < n; i++ )
{
*head = malloc( sizeof( Node ) );
( *head )->data = rand() % MAX_VALUE + 1;
( *head )->next = NULL;
head = &( *head )->next;
}
}
void print( LinkList head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d -> ", head->data );
}
puts( "NULL" );
}
int main(void)
{
LinkList head = NULL;
CreateLinkList( &head, 10 );
print( head );
return 0;
}
程序输出可能看起来像
14 -> 40 -> 17 -> 54 -> 8 -> 48 -> 40 -> 25 -> 99 -> 41 -> NULL
我想通过 CreateLinkList(LinkList *L, int n)
创建一个 link 列表,但是 printf 的输出只有 0 1
。
CreateLinkList
好像停在第3行了。
我该如何解决?
void CreateLinkList(LinkList *L, int n)
{
srand(time(0));
printf("1\n");
*L = (Node*)malloc(sizeof(Node)); \ it seems to stop here
printf("2\n");
Node *flag = *L;
printf("3\n");
for (int i=0; i<n; i++)
{
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = rand() %100+1;
flag->next = newNode;
flag = newNode;
}
printf("4\n");
flag->next = NULL;
printf("5\n");
}
int main()
{
LinkList *p;
printf("0");
CreateLinkList(p, 10);
return 0;
}
LinkList
和Node
定义为:
typedef struct
{
int data;
struct Node *next;
} Node;
typedef Node *LinkList;
对于初学者这个结构定义
typedef struct
{
int data;
struct Node *next;
} Node;
无效。在结构中,类型 struct Node *
与 typedef 名称 Node
.
改写
typedef struct Node
{
int data;
struct Node *next;
} Node;
节点L和节点标志都没有初始化。
*L = (Node*)malloc(sizeof(Node)); \ it seems to stop here
printf("2\n");
Node *flag = *L;
所以这个声明
flag->next = newNode;
调用未定义的行为。
而且指针p也没有在main中初始化
LinkList *p;
所以即使是这个电话
*L = (Node*)malloc(sizeof(Node));
也会调用未定义的行为。
无论如何使用像
这样的typedef是个坏主意typedef Node *LinkList;
因为它只会让代码的读者感到困惑。
可以按照演示程序中所示定义函数。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct Node
{
int data;
struct Node *next;
} Node;
typedef Node *LinkList;
void CreateLinkList( LinkList *head, unsigned int n )
{
const int MAX_VALUE = 100;
srand( ( unsigned int )time( NULL ) );
for ( unsigned int i = 0; i < n; i++ )
{
*head = malloc( sizeof( Node ) );
( *head )->data = rand() % MAX_VALUE + 1;
( *head )->next = NULL;
head = &( *head )->next;
}
}
void print( LinkList head )
{
for ( ; head != NULL; head = head->next )
{
printf( "%d -> ", head->data );
}
puts( "NULL" );
}
int main(void)
{
LinkList head = NULL;
CreateLinkList( &head, 10 );
print( head );
return 0;
}
程序输出可能看起来像
14 -> 40 -> 17 -> 54 -> 8 -> 48 -> 40 -> 25 -> 99 -> 41 -> NULL