第一个方法:
/*根据姓名删除链表的中的学生记录*/ void deleteByName(struct STUDENT * head) { struct STUDENT *p,*q; char name[20]; if(head==NULL) { printf("链表为空。\n"); return; } printf("请输入要删除的学生的姓名:"); scanf("%s",name); for(p=head->next,q=head;p!=NULL;p=p->next,q=q->next) { if(strcmp(p->name,name)==0) { q->next=p->next; } } if(p==NULL) printf("要删除的学生不存在。"); else free(p); }
这个方法主要是 q->next=p->next ,然后释放 p结点所占的内存空间。
第2个方法:
/*************** 函数功能: 删除出勤学生姓名 返回:指向链表表头的指针 /***************/ struct student * del_message(struct student* head) { FILE* fp; struct student* pointer,*temp; //p指向新的结点 temp指针为临时结点 InputBox(stu.ID,11,"请输入要删除学生姓名的学号"); fp=fopen("student.txt","wb+"); pointer=head->next; //从头结点开始遍历指向下一个节点 while(pointer!=NULL) //如果遍历不到空数据的话就一直遍历 { if(strcmp(pointer->ID,stu.ID)==0) //找到要删除的结点 { temp=pointer; //将找到的结点赋值给临时temp结点变量 pointer=pointer->next; // 将p结点的下一个节点 赋值给p结点 free(temp); //释放临时temp结点所占内存 while(pointer!=NULL) //将剩下的结点写入 { fwrite(pointer,sizeof(struct student),1,fp); pointer=pointer->next; } break; } fwrite(pointer,sizeof(struct student),1,fp); //开始遍历链表结点,并写入文件 pointer=pointer->next; //p指针指向新的结点(下一个结点) } fclose(fp); outtextxy(220, 200, "删除出勤学生成功!"); return head; }
这个方法先找到p结点,也就是要删除的结点,然后将其赋值给一个临时的temp结构变量,然后p结点的下一个结点赋值给p结点,最后释放temp结点所占用的内存。
temp=pointer; //将找到的结点赋值给临时temp结点变量
pointer=pointer->next; // 将p结点的下一个节点 赋值给p结点
free(temp); //释放临时temp结点所占内存
第二个方法是是从文件中读写链表结构。
不知道两种方法是否一样?