#include
struct student
{
long num;
float score;
struct student* next;
};
int n;
struct student* insert(struct student* head, struct student* stud)
{
struct student* p0, * p1, * p2;
p1 = head; //使p1指向第一个结点
p0 = stud; //指向要插入的结点
if (head == NULL) //原来的链表是空表
{
head = p0;p0->next = NULL;
} //使p0指向的结点作为头结点
else
{
while ((p0->num > p1->num) && (p1->next != NULL))
{
p2 = p1; //使p2指向刚才p1指向的结点
p1 = p1->next;
} //p1后移一个结点
if (p0->num <= p1->num)
{
if (head == p1) head = p0; //插到原来第一个结点之前
else p2->next = p0; //插到p2指向的结点之后
p0->next = p1;
}
else
{
p1->next = p0;
p0->next = NULL; //插到最后的结点之后
}
}
n = n + 1; //结点数加1
return (head);
}
这个错误的原因是,在插入的时候,在某些情况下,p2 变量并没有被赋值。
具体来说,在这个代码中,p2 只会在 while 循环中被赋值,而且只有当 p1 指向的结点的 num 字段大于 p0 指向的结点的 num 字段,并且 p1 指向的结点的 next 指针不为 NULL 的情况下,p2 才会被赋值。
因此,如果在插入的时候,p1 指向的结点的 num 字段不大于 p0 指向的结点的 num 字段,或者 p1 指向的结点的 next 指针为 NULL,那么 p2 将不会被赋值。
为了解决这个问题,你需要在 p2 可能被使用之前给它赋一个初始值。例如,你可以在开头添加一行代码来初始化 p2:
struct student* p2 = NULL;
这样,即使在 p2 可能被使用之前没有被赋值,它也会有一个合法的初始值,这样就可以避免“使用了可能未初始化的本地指针变量”的错误了。