问题描述
某班学生的信息存放在一个线性单链表中,但每学期都有学生因故退学。现要求根据退学学生的学号,将其信息从链表中删除。假设学生的数据只保存姓名、学号、性别,并采用结构体类型描述。
输入说明
输入n个学生数据(1<=n<=10)。每行一个学生信息,包括:姓名(不超过20个字符的字符串)、学号(整形)、性别(字符),以空格分隔。学生数据以#结束,并在下一行输入退学学生的学号。
输出说明
若链表中有退学学生,输出删除该学生后的学生数据;如果链表中没有该学生,则输出错误信息No。
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef struct student
{
char name[20];
int num;
char sex;
}stu;
typedef struct node
{
stu data;
struct node *next;
}linklist;
linklist *Creat()
{
linklist *head,*r,*s;
head=(linklist*)malloc(sizeof(linklist));
r=head;
s=(linklist*)malloc(sizeof(linklist));
scanf("%s",s->data.name);
while((s->data.name[0])!='#')
{
scanf("%d %c",&s->data.num,&s->data.sex);
r->next=s;
r=s;
s=r->next;
s=(linklist*)malloc(sizeof(linklist));
scanf("%s",s->data.name);
}
r->next=NULL;
return head;
} //构造单链表
void Print(linklist *head)
{
linklist *m;
m=head->next;
while(m!=NULL)
{
printf("%s %d %c\n",m->data.name,m->data.num,m->data.sex);
m=m->next;
}
} //打印单链表
void Delete(linklist *head,int x)
{
linklist *r,*q;
r=head->next;
q=head;
while(r!=NULL&&r->data.num!=x)
{
q=r;
r=r->next;
}
if(r!=NULL)
{
q->next=r->next;
free(r);
Print(head);
}
else
printf("No\n");
} //进行删除操作
int main()
{
linklist *L;
int n;
L=Creat();
scanf("%d",&n);
Delete(L,n);
return 0;
}