int del_student(pstudent* head, int date[3],int *num)//删除 { pstudent middle; char c = 0; long id = 0; int day1 = 0, day2 = 0, i = 0; printf("输入需要删除编号:"); scanf("%ld", &id); c = getchar(); while ((*head) != NULL) { if ((*head)->id == id)//遍历对比 { middle = *head; *head = (*head)->next;//跳过节点 printf("编号\t\t姓名\t\t性别\t\t年龄\t\t班级\t\t缴费日期\t\t费年限\n"); p(middle); day1 = day_diff(middle->date, date);//实际学习天数 day2 = day_diff(middle->date, middle->time);//应学习天数 printf("输入一天所需收费:"); scanf("%d", &i); c = getchar(); if (day2 > day1) printf("需要退费:%d\n", (day2 - day1) * i); if (day2 == day1) printf("无需退费\n"); if (day2 < day1) printf("需要补交:%d\n", (day1 - day2) * i); printf("删除成功\n"); free(middle); (*num)--; return 1; } head = &(*head)->next; } printf("未找到该学生\n"); return 0; }
时间: 2024-04-05 18:34:07 浏览: 21
这是一个C语言函数,用于删除链表中的某个学生信息,并计算该学生是否需要退费或补交费用。函数的参数包括一个指向指针的指针head,一个长度为3的整型数组date,一个指向整型变量的指针num。
函数中首先定义了多个变量,包括pstudent类型的指针middle,long类型的变量id,int类型的变量day1、day2和i,以及char类型的变量c。
接下来,函数通过提示让用户输入需要删除的学生的编号,使用scanf函数将其读入,并跳过输入缓冲区中的回车符等无效字符。然后,函数遍历链表,查找编号与输入相同的学生,如果找到了,则输出该学生的信息,并计算其需要退费或补交的费用,并输出相应的信息。具体实现过程如下:
1.遍历链表,查找编号与输入相同的学生。
2.如果找到了该学生,则将其信息输出到控制台上,并计算该学生的实际学习天数day1和应学习天数day2,并提示用户输入一天所需的收费i。
3.根据实际学习天数day1和应学习天数day2,以及每天的收费i,计算出需要退费或补交的费用,并输出相应的信息。
4.删除该学生的节点,释放其内存,并将num减1。
5.函数返回1,表示删除成功。
如果遍历完整个链表仍然没有找到该学生,则输出相应的信息,函数返回0,表示删除失败。
整个函数的作用是删除一个学生的信息,并计算其需要退费或补交的费用,便于管理学生的缴费情况。
相关问题
typedef struct student{ char * name; //名字 int age; //年龄 struct student * classmate; //同桌 }student, * pstudent;里struct student * classmate;
在这个结构体中,struct student *classmate是一个指向struct student类型的指针,它用于存储学生的同桌信息。在结构体定义中,可以使用结构体自身的指针类型来定义结构体中的成员,这种方式通常被称作“自引用”。这样做的好处是可以实现嵌套结构体,也就是一个结构体中包含另一个结构体的指针,从而实现更加复杂的数据结构。在这个例子中,每个学生都有一个同桌,因此可以使用结构体自身的指针类型来存储同桌的信息。
如何去使用typedef struct student{ char * name; //名字 int age; //年龄 struct student * classmate; //同桌 }student, * pstudent;里的struct student * classmate;
在这个结构体中,`struct student *classmate`是一个指针类型的成员,它指向了另一个`student`类型的结构体,表示这个学生的同桌是谁。
如果需要使用这个成员,可以通过以下方式访问:
1. 定义一个`student`类型的变量,例如:
```
student s1;
```
2. 给这个变量的各个成员赋值,例如:
```
s1.name = "Tom";
s1.age = 18;
```
3. 为`s1`的`classmate`成员分配内存空间,并将其指向另一个`student`类型的结构体,例如:
```
student s2;
s2.name = "Jerry";
s2.age = 18;
s1.classmate = &s2;
```
这里使用了`&`符号取`s2`的地址,将这个地址赋值给`s1`的`classmate`成员。
4. 访问`s1`的`classmate`成员,例如:
```
printf("%s is %d years old and his/her classmate is %s.\n", s1.name, s1.age, s1.classmate->name);
```
这里使用了`->`符号来访问`s1`的`classmate`成员的`name`成员,即`s2`的名字。