不允许指针指向不完整的类类型 "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("未找到该学生!");
}
}
你在定义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,不要混用
根据提示,Node不能作为一种数据类型,应该使用List或struct Node。
回答:
该问题的原因在于 "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; }