getchar和scanf(getchar和scanf一起用避免输入错误)
题目:建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄 ,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
我编写的程序如下,他们说这样不太好,虽然满足题目要求,但是有很多弊端,让我找找分析改进,我好为难。找不出来。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct student {
int num;
char name[20];
char sex[7];
int age;
struct student* next;
}; //定义结构体
void print(struct student* x);
struct student* creat(void);
struct student* chaxun(struct student* y, int z);
int main()
{
struct student* p,*p1;
int ag; //用来存放要输入的年龄
p = creat(); //建立动态链表
print(p); //输出动态链表
printf("请输入一个年龄:");
scanf_s("%d", &ag);
p1=chaxun(p, ag); //查询输入的年龄是否在动态链表中,若存在,释放相应的结点
print(p1); //输出重新连接的链表
return 0;
}
struct student *creat()
{
struct student* head;
struct student* p1, * p2;
int n;
n = 0;
printf("请输入学生的学号,姓名,性别,年龄。 ");
printf("最后输入0 0 0 0结束输入. ");
p1 = p2 = (struct student*)malloc(sizeof(struct student));
scanf_s("%d%s%s%d", &p1->num, p1->name,20, p1->sex,7, &p1->age);
head = NULL;
while(p1->num!=0)
{
n++;
if (n == 1)head = p1;
else p2->next = p1;
p2 = p1;
p1 = (struct student*)malloc(sizeof(struct student));
scanf_s("%d%s%s%d", &p1->num, p1->name,20, p1->sex,7, &p1->age);
}
p2->next = NULL;
return(head);
}
void print(struct student* x)
{
struct student* pt;
pt = x;
if(x!=NULL)
do
{
printf("学号:%-d 姓名:%-s 性别:%-s 年龄:%-d ", pt->num, pt->name, pt->sex, pt->age);
pt = pt->next;
} while (pt != NULL);
}
struct student *chaxun(struct student *y,int z)
{
struct student* pp, * pp1,*pp2;
struct student* start;
start=pp = y;
if(y->age!=z)
while(pp->next!=NULL)
{
pp2 = pp->next;
if (pp2->age == z)
{
printf("此学生信息为: ");
printf("%d %s %s %d ", pp2->num, pp2->name, pp2->sex, pp2->age);
pp1 = pp2->next;
free(pp2);
pp->next = pp1;
}
pp = pp->next;
}
else
{
printf("此学生信息为: ");
printf("%d %s %s %d ", pp->num, pp->name, pp->sex, pp->age);
free(pp);
start = pp->next;
}
return(start);
}
书上答案如图。





