【顺序表&学生信息管理系统】学完顺序表就可以上高速写学生信息管理系统(下)

简介: 【顺序表&学生信息管理系统】学完顺序表就可以上高速写学生信息管理系统

函数接口之快排:

void QuickSort(SeqList* ps,int left,int right)
{
  if (left > right) return;
  int begin = left, end = right;
  int keyi = left;
  while (left < right)
  {
    while (left < right && (strcmp(ps->student[right].id,ps->student[keyi].id)>= 0))
    {
      right--;
    }
    while (left < right && (strcmp(ps->student[left].id, ps->student[keyi].id)<= 0))
    {
      left++;
    }
    Swap(&ps->student[left], &ps->student[right]);
  }
  int meeti = left;
  Swap(&ps->student[meeti], &ps->student[keyi]);
  QuickSort(ps, begin, meeti - 1);
  QuickSort(ps, meeti + 1, end);
}

函数调用之交换:

void Swap(Student* a, Student* b)//这个类型开始写的时候有点难受就是
{
  Student temp = *a;
  *a = *b;
  *b = temp;
}

4-7按学号查找学生信息(题目要求使用使用二分查找,二分查找前提是有序,因此我们要先进行排序)

    case 7:
      printf("查找学生信息\n");
      QuickSort(&ST, 0, ST.size - 1);//复用上个给学号排序的快排函数接口进行排序
      char findId[18]={0};
      printf("请输入你要查找的学生的学号:>");
      scanf("%s", findId);
      int ret=SeqListBinarySearch(&ST,findId);//调用二分查找函数接口
      if (ret == -1)
      {
        printf("统计表中不存在学号为%s的学生\n", findId);
      }
      else
      {
        printf("找到了!该学号为:%s的同学的姓名:%s\t成绩:%d\n", findId,ST.student[ret].name, ST.student[ret].grade);
      }
      printf("\n");
      break;

函数接口:

int SeqListBinarySearch(SeqList* ps, char* findId)
{
  int left = 0, right = ps->size - 1;
  while (left <= right)
  {
    int mid = left + (right - left) / 2;
    if (strcmp(ps->student[mid].id, findId) == 0)
    {
      return mid;
      break;
    }
    else if (strcmp(ps->student[mid].id, findId) > 0)
    {
      right = mid - 1;
    }
    else
    {
      left = mid + 1;
    }
  }
  return -1;
}

4-8指定位置删除学生信息

  case 8:
      printf("删除学生信息\n");
      int locate = 0;
      printf("请输入你要删除的学生位置(目前可删除位置必须小于等于%d):>",ST.size);
      scanf("%d", &locate);
      SeqListDelete(&ST, locate-1);//删除元素函数接口
      printf("删除成功\n");
      printf("\n");
      break;

函数接口:

void SeqListDelete(SeqList* ps, int locate)
{
  int begin = locate+1;
  while (begin <= ps->size-1)//前移从前面那端开始移动
  {
    ps->student[begin-1] = ps->student[begin];
    begin++;
  }
  ps->size--;//勿漏
}

4.顺序表的销毁:题目虽然没有要求,但是这个必须加上!老师和我们说过动态内存开辟的空间要手动释放,毕竟谁开辟谁释放嘛,否则会损害公司的服务器!!!

函数接口:

void SeqListDestory(SeqList* ps)
{
  free(ps->student);
  ps->student = NULL;
  ps->size = 0;
  ps->capacity = 0;
}

5.打印结果


dc851f6ada7c41dd897e50cf33654cf6.png

db1c713f0e9045bfa81ead4f836069aa.png

9877130067184d328176192f57bf3e8f.png

6.源码分享共有两个文件(test,c文件和seqlist.c文件)

test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include"seqlist.h"
int main()
{
  SeqList ST;
  SeqListInit(&ST);
  int input = 0;
  //打印列表并且做出选择
  meau();
  do
  {
    printf("请输入你的选择:>");
    scanf("%d", &input);
    //根据菜单选择执行相应操作
    switch (input)
    {
    case 0:
      printf("退出程序\n");
      printf("\n");
      break;
    case 1:
      printf("录入学生信息\n");
      int n = 0;
      printf("请输入待插入学生的个数;>");
      scanf("%d", &n);
      for (int i = 0; i < n; i++)
      {
        Student stu;
        printf("请输入待插入学生的学号,姓名,分数:>");
        scanf("%s%s%d", stu.id, stu.name, &stu.grade);
        SeqListPushBack(&ST, stu);
      }
      printf("插入成功\n");
      printf("\n");
      break;
    case 2:
      printf("打印学生信息\n");
      SeqListPrint(&ST);
      printf("\n");
      break;
    case 3:
      printf("插入学生信息\n");
      //插入学生的位置
      int pos = 0;
      printf("请输入你要待插入学生信息的位置(目前可插入位置必须小于等于%d):>", ST.size);
      scanf("%d", &pos);
      //待插入学生的信息
      Student stu;
      printf("请输入待插入学生的学号,姓名,分数:>");
      scanf("%s%s%d", stu.id, stu.name, &stu.grade);
      SeqListInsert(&ST, stu, pos - 1);
      printf("插入成功\n");
      printf("\n");
      break;
    case 4:
      printf("统计学生个数\n");
      int sz = SeqListSize(&ST);
      printf("当前统计表中学生的个数为:%d\n", sz);
      printf("\n");
      break;
    case 5:
      printf("按姓名来排序\n");
      InsertSort(&ST);
      SeqListPrint(&ST);
      printf("\n");
      break;
    case 6:
      printf("按学号来排序\n");
      QuickSort(&ST, 0, ST.size - 1);
      SeqListPrint(&ST);
      printf("\n");
      break;
    case 7:
      printf("查找学生信息\n");
      QuickSort(&ST, 0, ST.size - 1);
      char findId[18]={0};
      printf("请输入你要查找的学生的学号:>");
      scanf("%s", findId);
      int ret=SeqListBinarySearch(&ST,findId);
      if (ret == -1)
      {
        printf("统计表中不存在学号为%s的学生\n", findId);
      }
      else
      {
        printf("找到了!该学号为:%s的同学的姓名:%s\t成绩:%d\n", findId,ST.student[ret].name, ST.student[ret].grade);
      }
      printf("\n");
      break;
    case 8:
      printf("删除学生信息\n");
      int locate = 0;
      printf("请输入你要删除的学生位置(目前可删除位置必须小于等于%d):>",ST.size);
      scanf("%d", &locate);
      SeqListDelete(&ST, locate-1);
      printf("删除成功\n");
      printf("\n");
      break;
    default:
      printf("输入有误,请重新输入\n");
      printf("\n");
      break;
    }
  } while (input);
  SeqListDestory(&ST);
}

seqlist,h文件

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
typedef struct Student
{
  char id[18];
  char name[18];
  int grade;
}Student;
typedef struct SeqList
{
  Student* student;
  int size;
  int capacity;
}SeqList;
void meau()
{
  printf("************************\n");
  printf("*****  0.退出程序  *****\n");
  printf("*****1.录入学生信息*****\n");
  printf("*****2.打印学生信息*****\n");
  printf("*****3.插入学生信息*****\n");
  printf("*****4.统计学生个数*****\n");
  printf("*****5.按姓名来排序*****\n");
  printf("*****6.按学号来排序*****\n");
  printf("*****7.查找学生信息*****\n");
  printf("*****8.删除学生信息*****\n");
}
void SeqListInit(SeqList* ps)
{
  ps->student = (Student*)malloc(sizeof(Student)*4);
  if (ps->student == NULL)
  {
    printf("malloc fail\n");
    exit(-1);
  }
  ps->size = 0;
  ps->capacity = 4;
}
void CheckCapacity(SeqList* ps)
{
  if (ps->size == ps->capacity)
  {
    int newcapacity = 2 * ps->capacity;
    Student* temp = realloc(ps->student, sizeof(Student) * newcapacity);
    assert(!temp);
    ps->student = temp;
    ps->capacity = newcapacity;
  }
}
void SeqListPushBack(SeqList* ps, Student stu)
{
  CheckCapacity(ps);
  ps->student[ps->size] = stu;
  ps->size++;
}
void SeqListPrint(SeqList* ps)
{
  for (int i = 0; i < ps->size; i++)
  {
    printf("学号:%s\t名字:%s\t分数:%d\n", ps->student[i].id, ps->student[i].name, ps->student[i].grade);
  }
}
void SeqListInsert(SeqList* ps, Student stu, int pos)
{
  CheckCapacity(ps);
  int end = ps->size - 1;
  while (end >= pos)
  {
    ps->student[end + 1] = ps->student[end];
    end--;
  }
  ps->student[pos] = stu;
  ps->size++;
}
int SeqListSize(SeqList* ps)
{
  return ps->size;
}
void InsertSort(SeqList* ps)
{
  for (int i = 0; i < ps->size - 1; i++)
  {
    int end = i;
    Student temp = ps->student[i + 1];
    while (end >= 0)
    {
      if ((strcmp(ps->student[end].name,temp.name))>0)
      {
        ps->student[end + 1] = ps->student[end];
        end--;
      }
      else
      {
        break;
      }
    }
    ps->student[end + 1] = temp;
  }
}
void Swap(Student* a, Student* b)
{
  Student temp = *a;
  *a = *b;
  *b = temp;
}
void QuickSort(SeqList* ps,int left,int right)
{
  if (left > right) return;
  int begin = left, end = right;
  int keyi = left;
  while (left < right)
  {
    while (left < right && (strcmp(ps->student[right].id,ps->student[keyi].id)>= 0))
    {
      right--;
    }
    while (left < right && (strcmp(ps->student[left].id, ps->student[keyi].id)<= 0))
    {
      left++;
    }
    Swap(&ps->student[left], &ps->student[right]);
  }
  int meeti = left;
  Swap(&ps->student[meeti], &ps->student[keyi]);
  QuickSort(ps, begin, meeti - 1);
  QuickSort(ps, meeti + 1, end);
}
int SeqListBinarySearch(SeqList* ps, char* findId)
{
  int left = 0, right = ps->size - 1;
  while (left <= right)
  {
    int mid = left + (right - left) / 2;
    if (strcmp(ps->student[mid].id, findId) == 0)
    {
      return mid;
      break;
    }
    else if (strcmp(ps->student[mid].id, findId) > 0)
    {
      right = mid - 1;
    }
    else
    {
      left = mid + 1;
    }
  }
  return -1;
}
void SeqListDelete(SeqList* ps, int locate)
{
  int begin = locate+1;
  while (begin <= ps->size-1)
  {
    ps->student[begin-1] = ps->student[begin];
    begin++;
  }
  ps->size--;
}
void SeqListDestory(SeqList* ps)
{
  free(ps->student);
  ps->student = NULL;
  ps->size = 0;
  ps->capacity = 0;
}
目录
相关文章
|
6月前
|
存储 机器学习/深度学习 API
顺序表:数据结构的建筑积木
朋友们大家好啊,本节内容我们进入数据结构的第二节,顺序表有关内容,同步我们会学习计组原理与cpp相关知识 本节我们重点探讨动态顺序表关于插入数据和删除数据的多种情况的分析
|
27天前
基于顺序表的学生成绩管理系统
基于顺序表的学生成绩管理系统
17 0
|
5月前
|
算法
$停车场管理系统 栈与队列
$停车场管理系统 栈与队列
|
6月前
|
存储 机器学习/深度学习 供应链
数据结构课程设计 仓储管理系统
数据结构课程设计 仓储管理系统
49 0
|
6月前
|
存储 算法 Java
【数据结构与算法】4.自主实现单链表的增删查改
【数据结构与算法】4.自主实现单链表的增删查改
|
存储
数据结构课程设计--航空客运订票系统
数据结构课程设计--航空客运订票系统
601 0
数据结构课程设计--航空客运订票系统
|
存储 C语言
基于线性表的图书信息管理实验
基于线性表的图书信息管理实验
248 0
|
存储 算法 Java
图的操作和应用之景区信息管理系统(数据结构课程设计)
0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设计) 现有一个景区,景区里面有若干个景点,景点之间满足以下条件: (1) 某些景点之间铺设了道路(相邻) (2) 这些道路都是可以双向行驶的(无向图) (3) 从任意一个景点出发都可以游览整个景区(连通图) 开发景区信息管理系统,对景区的信息进行管理。使用图的数据结构来保存景区景点信息,为用户提供创建图、查询景点信息、旅游景点导航、搜索最短路径、铺设电路规划等功能。 文章目录0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设
图的操作和应用之景区信息管理系统(数据结构课程设计)
|
C语言
学生成绩管理系统-单链表形式
学生成绩管理系统-单链表形式
|
存储 计算机视觉
利用单链表实现学生信息管理系统
利用单链表实现学生信息管理系统
158 0