【问题描述】输人若干个学生信息(包括学号、姓名和成绩),输人学号为0时输人结束,建立一个单向链表,再输人一个成绩值,将成绩大于等于该值的学生信息输出。试编写相应程序。
【样例输入】
1 zhang 78
2 wang 80
3 Li 75
4 zhao 85
0
80
【样例输出】
2 wang 80
4 zhao 85
示例代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student
{
int id;
char name[16];
int sc;
Student *next;
};
Student * Creat();//建立顺序链表
Student * Delete(Student *head,int sc_);//删除不满足要求的节点
void Printf(Student *head);//打印
int main()
{
Student *pr;
int sc_;
pr=Creat();
scanf("%d",&sc_);
pr=Delete(pr,sc_);
Printf(pr);
return 0;
}
/*建立链表这里就不在多说了*/
Student * Creat()
{
Student *head,*tail,*p;
int id,sc;char name[16];
head=tail=NULL;
scanf("%d",&id);
while(id!=0)
{
scanf("%s %d",name,&sc);
p=(Student *)malloc(sizeof(Student));
p->id=id;
p->sc=sc;
strcpy(p->name,name);
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
scanf("%d",&id);
}
return head;
}
Student * Delete(Student *head,int sc_)
{
Student *p1,*p2;
while(head!=NULL&&head->sc<sc_)//找到第一个不满足条件的位置
{
p2=head;
head=head->next;
free(p2);
}
if(head==NULL)
return NULL;
p1=head;
p2=head->next;
while(p2!=NULL)
{
if(p2->sc<sc_)//不满足条件的删除
{
p1->next=p2->next;//把p2位置删除了
free(p2);//释放内存
}
else
p1=p2;
p2=p1->next;
}
return head;
}
void Printf(Student *head)
{
Student *p=head;
if(p==NULL)
printf("Not Found!\n");
else
for(;p!=NULL;p=p->next)
printf("%d %s %d\n",head->id,head->name,head->sc);
}