按要求完成insertList,reverseList,countList, deleteListBySex,并在主函数中对以上函数进行调用,并输出结果;
注意这里把last定义为表的长度;
完成以下函数
/在学号从小到大排序的学生表中插入值为x的学生仍保持学号的有序性/
void insertList(SEQ_LIST *lp, STUDENT x);
/对lp指向的顺序表进行倒置操作/
void reverseList(SEQ_LIST *lp);
/统计学生表中身高值高于y的学生数并返回/
int countList(SEQ_LIST *lp,float y);
/删除性别为sex(0为男生,1为女生)的学生/
void deleteListBySex(SEQ_LIST *lp, int sex);
下面是4个函数的实现:
//在学号从小到大排序的学生表中插入值为x的学生仍保持学号的有序性
void insertList(SEQ_LIST* lp, STUDENT x)
{
int i, j;
for (i = 0; i < lp->last; i++)
{
if (x.student_NO < lp->DATA[i].student_NO)
{
for (j = lp->last; j > i; j--)
lp->DATA[j] = lp->DATA[j - 1];
lp->DATA[i] = x;
lp->last += 1; //数量+1
break;
}
}
}
//对lp指向的书虚表进行倒置操作
void reverseList(SEQ_LIST* lp)
{
int i = 0, j = lp->last - 1;
STUDENT t;
for (; i < j; i++, j--)
{
t = lp->DATA[i];
lp->DATA[i] = lp->DATA[j];
lp->DATA[j] = t;
}
}
//统计学生表中身高高于y的学生数并返回
int countList(SEQ_LIST* lp, float y)
{
int cnt = 0, i;
for (i = 0; i < lp->last; i++)
{
if (lp->DATA[i].student_height > y)
cnt++;
}
return cnt;
}
//删除性别为sex(0为男生,1为女生)的学生
void deleteListBySex(SEQ_LIST* lp, int sex)
{
int i, j=0;
for (i = 0; i < lp->last; i++)
{
if (lp->DATA[i].studeng_sex != sex)
{
lp->DATA[j] = lp->DATA[i];
j++;
}
}
lp->last = j;
}
【以下回答由 GPT 生成】
解决方案
首先,我们需要定义学生的结构体。假设学生包括学号、姓名、性别和身高四个属性,我们可以这样定义学生结构体:
typedef struct {
int id; // 学号
char name[50]; // 姓名
int sex; // 性别,0表示男性,1表示女性
float height; // 身高
} STUDENT;
接下来,我们可以定义一个顺序表结构体,用于存储学生的列表。顺序表结构体包含一个动态数组 students
用于存储学生数据,以及一个整型变量 size
用于记录当前列表中的学生数量:
#define MAX_SIZE 100 // 假设最大支持存储100个学生
typedef struct {
STUDENT students[MAX_SIZE]; // 存储学生数据的数组
int size; // 当前学生数量
} SEQ_LIST;
现在我们可以逐个实现需要完成的函数了。
void insertList(SEQ_LIST *lp, STUDENT x)
:按照学号从小到大的顺序将学生插入到学生表中。void insertList(SEQ_LIST *lp, STUDENT x) {
int i, j;
// 在有序的顺序表中找到插入点
for (i = 0; i < lp->size; i++) {
if (x.id < (lp->students[i]).id) {
break;
}
}
// 将插入点之后的元素后移一位
for (j = lp->size - 1; j >= i; j--) {
lp->students[j + 1] = lp->students[j];
}
// 将学生插入到插入点位置
lp->students[i] = x;
lp->size++;
}
void reverseList(SEQ_LIST *lp)
:将顺序表中的学生列表倒置。void reverseList(SEQ_LIST *lp) {
int i, j;
// 通过交换元素的方式逆序列表
for (i = 0, j = lp->size - 1; i < j; i++, j--) {
STUDENT temp = lp->students[i];
lp->students[i] = lp->students[j];
lp->students[j] = temp;
}
}
int countList(SEQ_LIST *lp, float y)
:统计学生表中身高高于y的学生数量,并返回结果。int countList(SEQ_LIST *lp, float y) {
int count = 0;
// 遍历列表,统计符合条件的学生数量
for (int i = 0; i < lp->size; i++) {
if (lp->students[i].height > y) {
count++;
}
}
return count;
}
void deleteListBySex(SEQ_LIST *lp, int sex)
:删除学生表中性别为sex(0表示男生,1表示女生)的学生。void deleteListBySex(SEQ_LIST *lp, int sex) {
int i, j;
// 遍历列表,将不符合条件的学生前移
for (i = 0, j = 0; i < lp->size; i++) {
if (lp->students[i].sex != sex) {
lp->students[j++] = lp->students[i];
}
}
lp->size = j;
}
现在,我们可以在主函数中调用这些函数,并输出结果。
#include <stdio.h>
int main() {
SEQ_LIST studentList;
studentList.size = 0;
// 测试数据
STUDENT s1 = {1001, "张三", 0, 175.5};
STUDENT s2 = {1002, "李四", 1, 165.8};
STUDENT s3 = {1003, "王五", 0, 180.2};
STUDENT s4 = {1004, "赵六", 1, 160.4};
// 插入学生到列表
insertList(&studentList, s1);
insertList(&studentList, s2);
insertList(&studentList, s3);
insertList(&studentList, s4);
// 输出学生列表
for (int i = 0; i < studentList.size; i++) {
printf("学号:%d, 姓名:%s, 性别:%s, 身高:%.1f\n",
studentList.students[i].id,
studentList.students[i].name,
studentList.students[i].sex == 0 ? "男" : "女",
studentList.students[i].height);
}
// 倒置列表
reverseList(&studentList);
// 输出倒置后的学生列表
printf("\n倒置后的学生列表:\n");
for (int i = 0; i < studentList.size; i++) {
printf("学号:%d, 姓名:%s, 性别:%s, 身高:%.1f\n",
studentList.students[i].id,
studentList.students[i].name,
studentList.students[i].sex == 0 ? "男" : "女",
studentList.students[i].height);
}
// 统计身高高于指定值的学生数量
printf("\n身高高于170的学生数量:%d\n", countList(&studentList, 170.0));
// 删除性别为1(女)的学生
deleteListBySex(&studentList, 1);
// 输出删除后的学生列表
printf("\n删除女生后的学生列表:\n");
for (int i = 0; i < studentList.size; i++) {
printf("学号:%d, 姓名:%s, 性别:%s, 身高:%.1f\n",
studentList.students[i].id,
studentList.students[i].name,
studentList.students[i].sex == 0 ? "男" : "女",
studentList.students[i].height);
}
return 0;
}