回复 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"); } }