在打印中显示运行时错误

时间:2014-01-10 18:03:54

标签: c list

当我打印链表时,我得到运行时错误

#include stdio.h
#include stddef.h

typedef struct
{
    int info;
    struct DEMO1 *next;
} DEMO1;

void insertatlast(DEMO1 * p, int o);

void printl(DEMO1 * p);

int main()
{
    int temp;
    DEMO1 *head = NULL;

    if (head == NULL)
        while (1)
        {
            printf("ENTER 0 to exit");
            scanf("%d", &temp);
            if (temp == 0)
                break;
            insertatlast(head, temp);
        }

    printl(head);
    return 0;
}

void insertatlast(DEMO1 * head, int data)
{
    if (head == NULL)
    {
        DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));

        node->info = data;
        node->next = 0;
        head = node;
    }
    else
    {
        DEMO1 *temp;

        temp = head;

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

        DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));

        node->info = data;
        node->next = 0;
        temp->next = node;
    }
}

void printl(DEMO1 * head)
{

    DEMO1 *temp;

    temp = head;
    printf("%d", temp->info);
    while (temp != NULL)
    {
        printf(":) %d\n", temp->info);
        temp = temp->next;
    }
}

2 个答案:

答案 0 :(得分:0)

head为NULL时,head仅在insertatlast()函数中更改,而不在main()中更改。 return headhead更新了main()

DEMO1* insertatlast(DEMO1 * head, int data)
{
    if (head == NULL)
    {
        DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));

        node->info = data;
        node->next = 0;
        head = node;
    }
    else
    {
        DEMO1 *temp;

        temp = head;
        while (temp->next != NULL)
        {
            temp = temp->next;
        }
        DEMO1 *node = (DEMO1 *) (malloc(sizeof(DEMO1)));

        node->info = data;
        node->next = 0;
        temp->next = node;
    }

    return head;
}


int main()
{
    int temp;
    DEMO1 *head = NULL;

    if (head == NULL)
        while (1)
        {
            printf("ENTER 0 to exit");
            scanf("%d", &temp);
            if (temp == 0)
                break;
            head=insertatlast(head, temp);
        }
    printl(head);
    return 0;
}

答案 1 :(得分:0)

编译时(在<>中修复丢失的#include之后,您可以从编译器中读取一些警告 - 希望您已启用警告。即使它们无法解决您的问题,看看它们是个好习惯。

这样的行
 DEMO1 *head = NULL;

 if (head == NULL)

应该建议你做错了什么。 if-body执行的事实,当你调用insertatlast时,单独告诉你头是NULL。没关系,你期待它。您可能不期望的是,head调用未对insertatlast 进行修改:因此当您调用printl时,head仍为NULL,并且打电话

 `printl(NULL);`

是有问题的,因为

  temp = head;
  ... temp->info ...

我想有人告诉你,如果你想在调用者中修改变量的值,你必须传递一个指向该变量的指针,而且由于你已经有了指针,你会感到困惑。

事实是,指针也是一个变量,如果你需要修改它,你必须获取指针指针。

DEMO1* head = NULL;

//...
insertatlast(&head, temp);

并且插入的原型将是

void insertatlast(DEMO1 **head, int data);

然后,您使用DEMO1*修改调用者变量(*head),访问它等等(不要忘记在insertatlast头部有类型{{1} }},所以DEMO1**的类型为*head}。

注意

不要施放DEMO1*返回值;在C

malloc

就足够了。