数据结构 c语言 函数 结构

按要求完成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);

img

img

img

img

img

img

img

下面是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;

现在我们可以逐个实现需要完成的函数了。

  1. 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++;
}
  1. 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;
  }
}
  1. 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;
}
  1. 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;
}

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632