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

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

函数接口之快排:

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;
}
目录
相关文章
|
9月前
|
存储 算法 C语言
实现顺序表——实践报告
实现顺序表——实践报告
73 0
|
27天前
|
算法
$停车场管理系统 栈与队列
$停车场管理系统 栈与队列
13 1
|
2月前
|
存储 算法 Java
【数据结构与算法】4.自主实现单链表的增删查改
【数据结构与算法】4.自主实现单链表的增删查改
|
存储 算法 Java
图的操作和应用之景区信息管理系统(数据结构课程设计)
0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设计) 现有一个景区,景区里面有若干个景点,景点之间满足以下条件: (1) 某些景点之间铺设了道路(相邻) (2) 这些道路都是可以双向行驶的(无向图) (3) 从任意一个景点出发都可以游览整个景区(连通图) 开发景区信息管理系统,对景区的信息进行管理。使用图的数据结构来保存景区景点信息,为用户提供创建图、查询景点信息、旅游景点导航、搜索最短路径、铺设电路规划等功能。 文章目录0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设
图的操作和应用之景区信息管理系统(数据结构课程设计)
|
12月前
|
C语言
学生成绩管理系统-单链表形式
学生成绩管理系统-单链表形式
|
存储 计算机视觉
利用单链表实现学生信息管理系统
利用单链表实现学生信息管理系统
126 0
|
关系型数据库 MySQL 数据库
|
存储 算法 Java
【C语言】网吧管理系统-链表项目设计
C语言 & 网吧管理系统
135 0
|
缓存 C语言 数据安全/隐私保护
|
数据可视化 C语言 C++
数据结构实验报告—顺序表的基本操作—学生管理系统
数据结构实验报告—顺序表的基本操作—学生管理系统
293 0