科学健康资讯 · 内容仅供参考,不替代专业诊疗 联系我们|疾病百科
操作系统

getchar和scanf(getchar和scanf一起用避免输入错误)

2023-05-02 操作系统 本文链接

题目:建立一个链表,每个结点包括:学号,姓名,性别,年龄。输入一个年龄 ,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

我编写的程序如下,他们说这样不太好,虽然满足题目要求,但是有很多弊端,让我找找分析改进,我好为难。找不出来。

#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);

}

书上答案如图。

本文内容仅供健康科普参考,不能替代专业医疗诊断和治疗建议。如有身体不适,请及时就医并遵从医师指导。

相关阅读