不允许指针指向不完整的类类型

不允许指针指向不完整的类类型 "struct Node"

typedef struct _Node//创建结点
{
    Student stu;//学生
    struct Node *next;//指向下一结点的指针
}Node;

void deleteStu(Node *head)//删除学生信息
{
    int i;
    Node *temp, *p;
    p = head;
    printf("输入要删除学生的学号:");
    scanf("%d", &i);
    while (p->next != NULL)
    {
        if (p->next->stu.stunum == i)
        {
            p->next = p->next->next;
            free(temp);//将要删除的空间释放
            temp = NULL;
            printf("该学生已删除!\n");
            system("pause");//暂停
            system("cls");//清屏
            break;
        }
        p = p->next;
    }
    if (p->next = NULL)
    {
        printf("未找到该学生!");
    }
}

img

你在定义Node结构体时,其内部包含一个指向Node的指针,但这个时候Node并未完全定义。而且你使用struct Node *next;的时候,编译器会去找名为Node的结构体,但在你的代码中,结构体的名字是_Node,并没有名为Node的结构体,这就造成了类型的不匹配和不完整。

为了解决这个问题,你应该使用struct _Node *next;。在C语言中,struct关键字是必须的,除非你使用typedef定义了一个新的类型名,如下所示:

typedef struct _Node
{
    Student stu;
    struct _Node *next;
} Node;

另外,你在deleteStu函数中也有一处错误,你在使用temp指针前并未对其进行初始化,这会导致未定义的行为。你应该在删除节点之前将temp指针指向要删除的节点。

最后,你的if (p->next = NULL)语句中使用了赋值操作=,而不是比较操作==,这也是一个错误。正确的代码应该是if (p->next == NULL)

修正后的代码如下:

typedef struct _Node
{
    Student stu;
    struct _Node *next;
} Node;

void deleteStu(Node *head)
{
    int i;
    Node *temp, *p;
    p = head;
    printf("输入要删除学生的学号:");
    scanf("%d", &i);
    while (p->next != NULL)
    {
        if (p->next->stu.stunum == i)
        {
            temp = p->next;
            p->next = p->next->next;
            free(temp);
            temp = NULL;
            printf("该学生已删除!\n");
            system("pause");
            system("cls");
            break;
        }
        p = p->next;
    }
    if (p->next == NULL)
    {
        printf("未找到该学生!");
    }
}
typedef struct Node
{
    Student stu;
    struct Node *next;
} Node;

void deleteStu(Node *head)
{
    int i;
    Node *temp, *p;
    p = head;
    printf("输入要删除学生的学号:");
    scanf("%d", &i);
    while (p->next != NULL)
    {
        if (p->next->stu.stunum == i)
        {
            temp = p->next;
            p->next = p->next->next;
            free(temp);
            temp = NULL;
            printf("该学生已删除!\n");
            system("pause");
            system("cls");
            break;
        }
        p = p->next;
    }
    if (p->next == NULL)
    {
        printf("未找到该学生!\n");
    }
}


Node就是你用typedef 定义出来的struct _Node的别名,所以你直接写Node就好
或者写全了写struct _Node,不要混用

  • 这篇博客: 数据类型struct Node与Node的使用问题中的 问题修正 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 根据提示,Node不能作为一种数据类型,应该使用List或struct Node。

  • 以下回答由chatgpt基于相关博客总结生成:

    回答:

    该问题的原因在于 "struct Node" 类型不完整,解决方法是在结构体定义的同时为其定义一个别名,然后使用别名来定义指针变量或结构体变量。具体方法有两种:

    方法一:在结构体定义之后,用 typedef 为其定义一个别名

    如下所示:

    typedef struct Node { ElemType data; struct Node *next; } ListNode;

    这样就为结构体定义了一个别名 ListNode。

    定义链表指针变量可以这样写:

    ListNode *list;

    方法二:直接用别名来定义结构体变量

    如下所示:

    struct ListNode { ElemType data; struct ListNode *next; };

    这样就为结构体定义了一个别名 ListNode。

    定义链表指针变量可以这样写:

    struct ListNode *list;

    将代码修改为下面这样就可以解决问题了:

    List Merge(List L1, List L2) { ListNode p1, p2; // 修改这里 p1 = L1->Next; p2 = L2->Next; if (p1 == NULL) //判断是否存在空链表 return L2; if (p2 == NULL) return L1; List L; //创建合并后链表的头结点 L = (List)malloc(sizeof(struct Node)); if (!L) return 0; L->Next = NULL; ListNode* tmp = L; // 修改这里 while (p1 && p2) { if (p1->Data <= p2->Data) { tmp->Next = p1; tmp = tmp->Next; L1->Next = p1->Next; p1 = p1->Next; } else { tmp->Next = p2; tmp = tmp->Next; L2->Next = p2->Next; p2 = p2->Next; } } if (p1) { tmp->Next = p1; L1->Next = NULL; } if (p2) { tmp->Next = p2; L2->Next = NULL; } return L; }