【问题标题】:why does my LinkListCreate function stop running?为什么我的 LinkListCreate 函数停止运行?
【发布时间】:2020-03-08 04:21:33
【问题描述】:

我想通过CreateLinkList(LinkList *L, int n)创建一个链接列表,但是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;
}

LinkListNode 被定义为:

typedef struct
{
    int data;
    struct Node *next;
} Node;

typedef Node *LinkList; 

【问题讨论】:

  • 您正试图通过将指针传递给LinkList 来模拟传递引用。然后你需要将p定义为一个non指针变量,并使用address-of操作符&amp;得到一个指向它的指针。

标签: c struct linked-list typedef singly-linked-list


【解决方案1】:

对于初学者这个结构定义

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

【讨论】:

  • 非常感谢。我刚开始学习C编程。我从教科书中学到了这种奇怪的编码风格,现在我决定退出这本书......
  • @user10927531 即使是一本糟糕的书也很有用,因为它会引发问题。:)
  • 你是对的。这是一本通俗易懂的书,但缺乏深度。我很快就会通过它。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多