c语言删除学生信息函数 有问题求指教!

void del(struct student*head)
{
struct student*p1,*p2,*q;
int i=0;
p1=head;
printf("请输入要删除学生的学号:\n");
q=(struct student*)malloc(sizeof(struct student));
scanf("%d",&q->num);
while(p1!=NULL)
{
i++;
if(i==1 && p1->num==q->num)
{
head=p1->next;
printf("已删除该学生信息\n");
print(head);//这是我写的输出函数,在这个删除函数调用时没有问题,但是如果在主函数调用输出函数,还是会输出我已经删掉的信息
break;

}
p2=p1;p1=p1->next;
if(i!=1 && p1->next!=NULL && p1->num==q->num)
{
p2->next=p1->next;
free(p1);//不知道为什么一有这句运行程序就会出错
printf("已删除该学生信息");
break;
}
if(p1->next=NULL && p1->num==q->num)
{
p2->next=NULL;
free(p1);
printf("已删除该学生信息");
break;
}

}
void main()
{
struct student*head;
head=create();
system("cls");
print(head);
getchar();
getchar();

del(head);
getchar();
getchar();
system("cls");
print(head);

}
这是主函数

struct student* del(struct student* head)
{
if (NULL == head)//如果链表为空,则直接返回
return head;

struct student* p, *q;
int num;
p = head;

printf("请输入要删除学生的学号:\n");
scanf("%d", &num);//这里不需要再申请结构体空间,直接放int变量就可以了

// 循环查找,直到找到或者链表结束为止
while (p != NULL && p->num != num)
{
q = p;//q用来保存上一节点,再删除当前节点时会用到,见p!=NULL
p = p->next;
}
//while结束后,p==NULL,则表示没有找到

//如果找到第一个p一定不为NULL,因为第一句已经判断,head后移一次
if (p == head)
head = head->next;//头结点改变
else if (p != NULL)
{
q->next = p->next;//断开要删除的节点
p->next = NULL;
}

//如果找到,则需要释放删除的节点的空间,避免内存泄露
if (p != NULL)
free(p);

return head;//由于可能改变了头结点,所以需要返回头结点
}

void main()
{
struct student*head;
head=create();
system("cls");
print(head);
getchar();
getchar();

head = del(head);//这里需要得到头结点,因为头结点可能改变了
getchar();
getchar();
system("cls");
print(head);
}

按照上面的改就没问题了,有不懂的再问
不好意思,早上出去玩了来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-17
print(head);//这是我写的输出函数,在这个删除函数调用时没有问题,但是如果在主函数调用输出函数,还是会输出我已经删掉的信息
你把这句:struct student*head;
写在主函数之外就不会有问题了追问

放主函数外头也不管用啊

追答

放外面之后就不要return语句了,就是return head;这句就不要了

第2个回答  2012-03-17
传地址也没用,你的头改变了的话是要返回的,除非你不改变头, 就是你删除的如果是头,那你这程序就会出错,删除不了
第3个回答  2012-03-17
struct student* del(struct student*head)
{
struct student*p1,*p2,*q;
int i=0;
int num;
p2=p1=head;
printf("请输入要删除学生的学号:\n");
//q=(struct student*)malloc(sizeof(struct student)); 只是要输入学号,干嘛要定义个结构体指针,画蛇添足!
//scanf("%d",&q->num);
scanf("%d",&num);
while(p1!=NULL)
{

if(p1->num == num)
{
if(p1 == head)
{
head = p1->nex;
}
else if(p1->next == NULL)
{
P2->next = NULL;
}
else
{
p2->next = p1->next;
}
free(p1);
break;
}
p2 = p1;
p1 = p1->next;
}
return head;
}

void main()
{
struct student*head;
head=create();
system("cls");
print(head);
getchar();
getchar();

head = del(head);
getchar();
getchar();
system("cls");
print(head);

}
相似回答