下面的程序可以运行,但会出现一个对话框,提示 filename.exe 已停止运行。为什么这样?

The following program below works but a dialog box appears saying that the filename.exe has stopped working. Why so?

这个程序应该是一个从链表中删除节点的演示。 该程序可以运行并且输出与预期相同,但不久之后会出现一个对话框,提示可执行文件已停止运行。我使用代码块作为 IDE 和 C 编程语言。我想知道为什么会发生这种情况以及如何避免将来发生这种情况。提前致谢。

#include <stdio.h>
#include <stdlib.h>

struct node{
    int data;
    struct node *next;
};

void create(struct node *first,int a[])
{
    struct node *t,*last;
    int i;
    first->data=a[0];
    first->next=NULL;
    last=first;
    for(i = 1; i < 5; i++)
    {
        t=(struct node *)malloc(sizeof(struct node));
        t->data=a[i];
        t->next=NULL;
        last->next=t;
        last=t;
    }
}

void display(struct node *f)
{
    int i;
    for(i=0;i<5;i++)
    {
        printf("%d ",f->data);
        f=f->next;
    }
}

int delete(struct node * f,int pos)
{
    int i,x;
    struct node *q=NULL;
    if (pos < 1 || pos > 5) {
        return -1;
    }
    if (pos == 1) {
        q=f;
        f=f->next;
        x=q->data;
        free(q);
        return x;
    }
    for (i = 0; i < pos - 1; i++)
    {
        q=f;
        f=f->next;
    }
    q->next=f->next;
    x=f->data;
    free(f);
    return x;
}

int main()
{
    int a[]={3,5,7,8,9};
    struct node *first;
    int pos=4,t;
    first=(struct node *)malloc(sizeof(struct node));
    create(first,a);
    t=delete(first,pos);
    display(first);
    return 0;
}

问题出在 f 为 null 的显示函数上

一个解决方案是删除 for 循环并使用 while 测试 f 是否为 null。 我还添加了一个最终的 \n 来刷新 stdout

void display(struct node *f)
{
    while (f)
    {
        printf("%d ",f->data);
        f=f->next;
    }
    printf("\n");
}