试题名称 学生信息管理
时间限制: 1 秒
内存限制: 10000KB
问题描述
某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。现要求根据退学学生的学号,将其信息从链表中删除。假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。
输入说明
输入n个学生数据(1<=n<=10)。每行一个学生信息,包括:姓名(不超过20个字符的字符串)、学号(整形)、性别(字符),以空格分隔。学生数据以#结束,并在下一行输入退学学生的学号。
输出说明
若链表中有退学学生,输出删除该学生后的学生数据;如果链表中没有该学生,则输出错误信息No。
输入样例
例1:
LiDong 1001 M
ZhaoJian 1002 M
ChenKai 1003 M
LiXia 1004 F
WangHong 1005 F
QianLi 1006 F
ZhouQiang 1007 M
1003
例2:
LiDong 1001 M
ZhaoJian 1002 M
ChenKai 1003 M
LiXia 1004 F
WangHong 1005 F
QianLi 1006 F
ZhouQiang 1007 M
1008
输出样例
例1:
LiDong 1001 M
ZhaoJian 1002 M
LiXia 1004 F
WangHong 1005 F
QianLi 1006 F
ZhouQiang 1007 M
例2:
No
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
char name[21];
int num;
char gender;
struct node *next;
}Student;
int main(void){
Student *head,*p,*q; //head头结点 p尾结点 q新结点
int delNum,flag;
head=(Student *)malloc(sizeof(Student));
head->next=NULL;
p=q=NULL;
//输入数据
while(1){
q=(Student *)malloc(sizeof(Student));
q->next=NULL;
scanf("%s",&q->name);
//判断是否结束
if(q->name[0]=='#'){
break;
}
scanf("%d %c",&q->num,&q->gender);
if(head->next==NULL){
head->next=q;
p=q;
}else{
p->next=q;
p=q;
}
}
//输入删除学生学号
scanf("%d",&delNum);
p=head;
flag=0;//0表示未删除 1表示删除
while(p->next!=NULL){//删除
q=p->next;
if(q->num==delNum){
flag=1;
p->next=q->next;
free(q);
break;
}
p=p->next;
}
//判断是否删除学生
if(flag==0){
printf("No");
}else{
p=head;
while(p->next!=NULL){
q=p->next;
printf("%s %d %c\n",q->name,q->num,q->gender);
p=p->next;
}
}
return 0;
}