回复 10楼 crystall
//找到该学生if(*per == pa->num)
{
if(pPrev == NULL)
{
free(pa);//释放内存
head = pa = NULL;
}
else
感觉这里有些不妥哈, if(pPrev == NULL) 这条语句大概意思是找到的学生位于头结点位置, 但是删除头结点的同时并没有指定下一个头结点。

打好基础,学会站在巨人的肩膀上!
程序代码:
int Delete(struct stud *head, int* per)
{
int y = 0;
struct stud * pa = head;
struct stud * pPrev = NULL;
if(*per == 0)
{
printf("学生的学号不能为0\r\n");
y=0;
return y;
}
//头节点的下一个结点为空,链表不为空.(有头节点这个元素)
//如果头节点为空,链表则为空.
if (head == NULL)
{
printf("链表为空!!!");
y=0;
return y;
}
else
{
//1 -> [2] -> 3
while(pa != NULL)
{
//找到该学生
if(*per == pa->num)
{
if(pPrev == NULL)
{
head = pa->next;
free(pa);//释放内存
pa = NULL;
}
else
{
pPrev->next = pa->next;
free(pa);//释放内存
pa = NULL;
}
y = 1;
break;
}
pPrev = pa;
pa = pa->next;
}
}
return y;
}
程序代码:/*
学生信息删除函数,删除指定学号的学生信息,
传递给该函数的实参是所建立的单链表的头指针L、要删除的学生学号。
若删除成功,返回值为1,否则,返回值为0。
*/
#include<stdio.h>
#include<stdlib.h>
#define N 2
typedef struct stud
{
int num;
char name[10];
float score[N+1];
struct stud *next;
}NODE;
NODE *create();
int Delete(NODE **p_head, int *per);
void print(NODE *head);
//主函数
int main()
{
NODE *L;
int n=1, i;
L=create();
print(L);
//printf("请输入要删除学生的学号:\n");
//scanf("%d\n", &n);
i=Delete(&L, &n);
print(L);
printf("i=%d\n", i);
return 0;
}
NODE *create() //创建链表,返回表头指针
{
NODE *head,*p,*q;
int i;
head=(NODE *)malloc(sizeof(NODE));
p=head;
for(i=1;i<N;i++)
{
printf("请依次输入第%d个学生的学号、姓名、分数(以空格键隔开):\n",i);
scanf("%d %s",&p->num,p->name);
for(int k=0;k<N+1;k++)
scanf("%f",&p->score[k]);
q=(NODE *)malloc(sizeof(NODE));
p->next=q;
p=p->next;
}
printf("请依次输入第%d个学生的学号、姓名、分数(以空格键隔开):\n",i);
scanf("%d %s",&p->num,p->name);
for(int r=0;r<N+1;r++)
scanf("%f",&p->score[r]);
p->next=NULL;
return head;
}
//学生信息删除函数,删除指定学号的学生信息
int Delete(NODE **p_head, int *per)
{
NODE *p,*q;
p=*p_head;
if(p==NULL) //空指针,删除失败,返回0
return 0;
if(p->num==*per) //删除节点在头指针处
{
*p_head=p->next;
free(p);
return 1;
}
else
{
while(p->num!=*per&&p->next!=NULL)
{
q=p;
p=p->next;
}
if(p->num==*per) //已找到,删除该节点
{
q->next=p->next;
free(p);
return 1;
}
else //链表中不存在指定学号的学生
return 0;
}
}
void print(NODE *head) //输出链表中信息
{
NODE *p;
p=head;
if(p==NULL)
printf("该链表为空!");
else
{
while(p->next!=NULL)
{
printf("姓名:%s\n 学号:%d\n",p->name,p->num);
for(int j=0;j<N+1;j++)
printf("分数:%4f",p->score[j]);
printf("\n");
p=p->next;
}
printf("姓名:%s\n 学号:%d\n",p->name,p->num);
for(int j=0;j<N+1;j++)
printf("分数:%4f",p->score[j]);
printf("\n");
}
}