【数据结构】查找与排序(一)—>“监视哨”的学习(下)

简介: 【数据结构】查找与排序(一)—>“监视哨”的学习(下)

四、完整程序

1、头文件

#ifndef _Search_h
#define _Search_h
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
typedef int Status;
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define NUM 8//表长
#define OVERFLOW -1
typedef struct
{
  int stu_id;
  char name[10];
  char class_id[10];
  int cpp_score;
  int stru_score;
}Stu;
typedef struct
{
  Stu* elem;
  int length;
}SqList;
//菜单
void menu();
//信息初始化
Status InitList(SqList &L);
//输出数据
void OutList(SqList L, int i);
//输出全部数据
void OutAllList(SqList L);
//顺序查找
void SqSearch(SqList L);
//二分查找
void binaryFld(SqList L);
//直接插入排序
void Insert_sorting(SqList &L);
//冒泡排序
void Bubbling_sorting(SqList &L);
//直接选择排序
void Choose_sorting(SqList& L);
#endif

2、功能函数文件

#include"Search.h"
//菜单
void menu()
{
  printf("*******************学生成绩管理系统*******************\n");
  printf("*        1.信息初始化             2.顺序查找         *\n");
  printf("*        3.二分查找               4.直接插入排序     *\n");
  printf("*        5.冒泡排序               6.直接选择排序     *\n");
  printf("*        0.退出                                      *\n");
  printf("******************************************************\n");
}
//初始化
Status InitList(SqList& L)
{
  L.elem = new Stu[MAXSIZE];
  if (!L.elem)
    exit(OVERFLOW);
  L.length = NUM;
  int i = 0;
  for (i = 0; i < L.length; i++)
  {
    cout << "请依次输入学号,姓名,班级,C++成绩,数据结构成绩>:";
    scanf("%d", &L.elem[i].stu_id);
    scanf("%s", L.elem[i].name);
    scanf("%s", L.elem[i].class_id);
    scanf("%d", &L.elem[i].cpp_score);
    scanf("%d", &L.elem[i].stru_score);
  }
//  L.elem[0] = { 1,"王立","03511",85,76 };
//  L.elem[1] = { 2,"张秋","03511",78,88 };
//  L.elem[2] = { 3,"刘丽","03511",90,79 };
//  L.elem[3] = { 4,"王通","03511",75,86 };
//  L.elem[4] = { 5,"赵阳","03511",60,71 };
//  L.elem[5] = { 6,"李艳","03511",58,68 };
//  L.elem[6] = { 7,"钱娜","03511",95,89 };
//  L.elem[7] = { 8,"孙胜","03511",45,60 };
  return OK;
}
//输出某一数据
void OutList(SqList L, int i)
{
  cout << L.elem[i].stu_id << "\t" << L.elem[i].name << "\t" << L.elem[i].class_id << "\t"
    << L.elem[i].cpp_score << "\t" << L.elem[i].stru_score << endl;
}
//输出全部数据
void OutAllList(SqList L)
{
  int i = 0;
  for (i = 0; i < L.length; i++)
  {
    cout << L.elem[i].stu_id << "\t" << L.elem[i].name << "\t" << L.elem[i].class_id << "\t"
      << L.elem[i].cpp_score << "\t" << L.elem[i].stru_score << endl;
  }
}
//顺序查找
void SqSearch(SqList L)
{
  int i = 0;
  int flag = 0;
  cout << "请输入你要查找的学生姓名>:";
  char arr[10] = "\0";
  scanf("%s", arr);
  for (i = 0; i < L.length; i++)
  {
    if (strcmp(L.elem[i].name, arr) == 0)
    {
      flag = 1;
      cout << "该学生信息如下>:" << endl;
      OutList(L, i);
      break;
    }
  }
  if (flag == 0)
    cout << "未找到该学生!" << endl;
}
//二分查找
void binaryFld(SqList L)
{
  cout << "请输入你要查找的学生学号>:";
  int id = 0;
  cin >> id;
  int low = 0;
  int high = L.length - 1;
  int flag = 0;
  while (low <= high)
  {
    int mid = (low + high) / 2;
    if (L.elem[mid].stu_id < id)
    {
      low = mid + 1;
    }
    else if (L.elem[mid].stu_id > id)
    {
      high = mid - 1;
    }
    else
    {
      flag = 1;
      cout << "你要查找的学生信息如下>:" << endl;
      OutList(L, mid);
      break;
    }
  }
  if (flag == 0)
    cout << "未找到该学生!" << endl;
}
//直接插入排序
void Insert_sorting(SqList &L)
{
  int i = 0;
  for (i = 1; i < L.length; i++)
  {
    Stu t={0};
    if (strcmp(L.elem[i].name,L.elem[i - 1].name)<0)
    {
      t= L.elem[i];
      L.elem[i]= L.elem[i - 1];
      //寻找插入位置
      int j = 0;
      for (j = i - 1; strcmp(L.elem[j].name,t.name)>0 ; j--)
      {
        L.elem[j + 1]= L.elem[j];
      }
      L.elem[j + 1]= t; 
    }
  }
}
//冒泡排序
void Bubbling_sorting(SqList& L)
{
  int i = 0;
  int m = L.length - 1;
  int flag = 1;
  Stu tmp = { 0 };
  while (m > 0 && flag == 1)
  {
    flag = 0;
    for (i = 0; i < m; i++)
    {
      if (L.elem[i].cpp_score > L.elem[i + 1].cpp_score)
      {
        flag = 1;
        tmp = L.elem[i + 1];
        L.elem[i + 1] = L.elem[i];
        L.elem[i] = tmp;
      }
    }
    --m;
  }
}
//直接选择排序
void Choose_sorting(SqList& L)
{
  int i = 0;
  int k = 0;
  int j = 0;
  Stu tmp = {0};
  for (i = 0; i < L.length; i++)
  {
    k = i;
    for (j = i + 1; j < L.length; j++)
    {
      if (L.elem[k].stru_score > L.elem[j].stru_score)
      {
        k = j;
      }
    }
    if (k != i)
    {
      tmp = L.elem[i];
      L.elem[i] = L.elem[k];
      L.elem[k] = tmp;
    }
  }
}

3、主函数文件

#include"Search.h"
int main()
{
  SqList L;
  int input = 0;
  do
  {
    menu();
    printf("请选择>:");
    cin >> input;
    switch (input)
    {
    case 1:
      //信息初始化
      InitList(L);
      break;
    case 2:
      //顺序查找
      SqSearch(L);
      break;
    case 3:
      //二分查找
      binaryFld(L);
      break;
    case 4:
      //直接插入排序
      cout << "排序前表为>:" << endl;
      OutAllList(L);
      Insert_sorting(L);
      cout << "排序后表为>:" << endl;
      OutAllList(L);
      break;
    case 5:
      //冒泡排序
      cout << "排序前表为>:" << endl;
      OutAllList(L);
      Bubbling_sorting(L);
      cout << "排序后表为>:" << endl;
      OutAllList(L);
      break;
    case 6:
      //直接选择排序
      cout << "排序前表为>:" << endl;
      OutAllList(L);
      Choose_sorting(L);
      cout << "排序后表为>:" << endl;
      OutAllList(L);
      break;
    case 0:
      cout << "退出系统" << endl;
      break;
    }
  } while (input);
  return 0;
}

四、总结

简单的查找与排序相信大家都很容易理解,博主会持续更新查找排序算法,欢迎大家关注博主动态🔥🔥🔥

目录
打赏
0
0
0
0
1
分享
相关文章
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
155 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
C 408—《数据结构》图、查找、排序专题考点(含解析)
408考研——《数据结构》图,查找和排序专题考点选择题汇总(含解析)。
187 29
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
176 10
【C++数据结构——内排序】希尔排序(头歌实践教学平台习题)【合集】
本文介绍了希尔排序算法的实现及相关知识。主要内容包括: - **任务描述**:实现希尔排序算法。 - **相关知识**: - 排序算法基础概念,如稳定性。 - 插入排序的基本思想和步骤。 - 间隔序列(增量序列)的概念及其在希尔排序中的应用。 - 算法的时间复杂度和空间复杂度分析。 - 代码实现技巧,如循环嵌套和索引计算。 - **测试说明**:提供了测试输入和输出示例,帮助验证代码正确性。 - **我的通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了代码运行的测试结果。 通过这些内容,读者可以全面了解希尔排序的原理和实现方法。
124 10
|
6月前
|
【C++数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
快速排序是一种高效的排序算法,基于分治策略。它的主要思想是通过选择一个基准元素(pivot),将数组划分成两部分。一部分的元素都小于等于基准元素,另一部分的元素都大于等于基准元素。然后对这两部分分别进行排序,最终使整个数组有序。(第一行是元素个数,第二行是待排序的原始关键字数据。本关任务:实现快速排序算法。开始你的任务吧,祝你成功!
160 7
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问