问题描述
某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。现要求根据退学学生的学号,将其信息从链表中删除。假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。
输入说明
输入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<string.h>
#include<malloc.h>
typedef struct stu
{
char m[20];
int h;
char b;
struct stu *next;
}l;
l *cre()
{
char m[20];
l *head,*r,*s;
head=(l*)malloc(sizeof(l));
r=head;
scanf("%s",m);
while(m[0]!='#')
{
s=(l *)malloc(sizeof(l));
strcpy(s->m,m);
scanf("%d %c",&s->h,&s->b);
r->next=s;
r=s;
scanf("%s",m);
}
r->next=NULL;
return head;
}
l *loc(l *head,int h)
{
l *p = head->next;
while(p!=NULL)
{
if(p->h==h)return p;
p=p->next;
}
return NULL;;
}
void del(l *head,l *t)
{
l *p=head;
while(p->next!=t) p=p->next;
p->next=t->next;
free(t);
}
void output(l *head)
{
l *r=head->next;
while(r!=NULL)
{
printf("%s %d %c\n",r->m,r->h,r->b);
r=r->next;
}
}
int main()
{
int n;
l *L,*p;
L=cre();
scanf("%d",&n);
p=loc(L,n);
if(p==NULL) printf("No");
else
{
del(L,p);
output(L);
}
return 0;
}