You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
250 lines
6.2 KiB
250 lines
6.2 KiB
6 months ago
|
源.cpp
|
||
|
#include"标头.h"
|
||
|
int main()
|
||
|
{
|
||
|
cout << "实验完成者:陈贤奇" << endl;
|
||
|
cout << "-----------------------------------------"<<endl;
|
||
|
int n, m, ID, i, j;
|
||
|
Stulist L;
|
||
|
InitList(L);
|
||
|
cout << "输入要创建的学生人数:";
|
||
|
cin >> n;
|
||
|
CreatStu(n, L);
|
||
|
cout << "-----------------------------------------" << endl;
|
||
|
print(L);
|
||
|
cout << "-----------------------------------------"<<endl;
|
||
|
cout << "输入要插入的位置:";
|
||
|
cin >> i;
|
||
|
Insert(L,i);
|
||
|
print(L);
|
||
|
cout << "-----------------------------------------"<<endl;
|
||
|
cout << "输入要删除的位置:";
|
||
|
cin >> j;
|
||
|
j = j - 1;
|
||
|
Delete(L, j);
|
||
|
print(L);
|
||
|
cout << "-----------------------------------------"<<endl;
|
||
|
cout << "当前表长:" << L.length << endl;
|
||
|
cout << "-----------------------------------------" << endl;
|
||
|
cout << "输入你需要的排序方式(0.按姓名;1.按学号):";
|
||
|
cin >> m;
|
||
|
if (m == 0)
|
||
|
{
|
||
|
Sortname(L);
|
||
|
print(L);
|
||
|
}
|
||
|
else if (m == 1)
|
||
|
{
|
||
|
move1(L);
|
||
|
SortID(L);
|
||
|
move2(L);
|
||
|
print(L);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
cout << "输入错误";
|
||
|
return ERROR;
|
||
|
}
|
||
|
cout << "-----------------------------------------"<<endl;
|
||
|
cout << "输入你要查找的学号:";
|
||
|
cin >> ID;
|
||
|
if (FindID(L, ID) == 0)
|
||
|
{
|
||
|
cout << "查找失败,无该学生"<<endl;
|
||
|
}
|
||
|
else
|
||
|
cout << L.elem[FindID(L, ID)].name << " " << L.elem[FindID(L, ID)].score<<endl;
|
||
|
cout << "-----------------------------------------";
|
||
|
}
|
||
|
|
||
|
标头.h
|
||
|
#pragma once
|
||
|
#define OK 1
|
||
|
#define ERROR 0
|
||
|
#define MAXSIZE 100
|
||
|
#include<iostream>
|
||
|
#include<string.h>
|
||
|
using namespace std;
|
||
|
typedef struct student
|
||
|
{
|
||
|
char name[20];
|
||
|
int ID;
|
||
|
int score;
|
||
|
}stu;
|
||
|
typedef struct
|
||
|
{
|
||
|
stu* elem;
|
||
|
int length;
|
||
|
}Stulist;
|
||
|
int InitList(Stulist& L)//初始化
|
||
|
{
|
||
|
L.elem = new stu[MAXSIZE];
|
||
|
if (!L.elem)exit(ERROR);
|
||
|
L.length = 0;
|
||
|
return OK;
|
||
|
}
|
||
|
int CreatStu(int n, Stulist& L)
|
||
|
{
|
||
|
int i;
|
||
|
if (n >= MAXSIZE)
|
||
|
{
|
||
|
cout << "超过预设最大容量";
|
||
|
return ERROR;
|
||
|
}
|
||
|
for (i = 0;i < n;i++)
|
||
|
{
|
||
|
cout << "输入第"<<i+1<<"个"<<"学生姓名:";
|
||
|
cin >> L.elem[i].name;
|
||
|
cout << "输入第" << i+1 << "个" << "学生学号:";
|
||
|
cin >> L.elem[i].ID;
|
||
|
cout << "输入第" << i+1 << "个" << "学生分数:";
|
||
|
cin >> L.elem[i].score;
|
||
|
L.length++;
|
||
|
}
|
||
|
return OK;
|
||
|
}
|
||
|
int print(Stulist L)
|
||
|
{
|
||
|
int i;
|
||
|
for (i = 0;i < L.length;i++)
|
||
|
{
|
||
|
cout << L.elem[i].name << " " << L.elem[i].ID << " " << L.elem[i].score << " " << endl;
|
||
|
}
|
||
|
return OK;
|
||
|
}
|
||
|
int Insert(Stulist& L,int i)
|
||
|
{
|
||
|
if (L.length == MAXSIZE)
|
||
|
{
|
||
|
cout << "超过预设最大容量";
|
||
|
return ERROR;
|
||
|
}
|
||
|
if (i<1 || i>L.length+1)
|
||
|
{
|
||
|
cout << "插入位置非法"<<endl;
|
||
|
return ERROR;
|
||
|
}
|
||
|
int j;
|
||
|
for (j = L.length;j>i-1;j--)
|
||
|
{
|
||
|
L.elem[j] = L.elem[j-1];
|
||
|
}
|
||
|
cout << "输入插入学生的姓名:";
|
||
|
cin >> L.elem[i-1].name;
|
||
|
cout << "输入插入学生的学号:";
|
||
|
cin >> L.elem[i-1].ID;
|
||
|
cout << "输入插入学生的成绩:";
|
||
|
cin >> L.elem[i-1].score;
|
||
|
cout << "-----------------------------------------" << endl;
|
||
|
L.length++;
|
||
|
return OK;
|
||
|
}
|
||
|
int Delete(Stulist& L, int i)
|
||
|
{
|
||
|
if (i <= 0 || i >=L.length)
|
||
|
{
|
||
|
cout << "删除位置非法" << endl;
|
||
|
return ERROR;
|
||
|
}
|
||
|
if (L.length == 0)
|
||
|
{
|
||
|
cout << "当前存放学生信息个数为0,无法删除"<<endl;
|
||
|
return ERROR;
|
||
|
}
|
||
|
int j;
|
||
|
for (j =i;j<L.length;j++)
|
||
|
{
|
||
|
L.elem[j-1] = L.elem[j];
|
||
|
}
|
||
|
L.length--;
|
||
|
return OK;
|
||
|
}
|
||
|
int move1(Stulist& L)
|
||
|
{
|
||
|
int i;
|
||
|
for (i = L.length - 1;i >= 0;i--)
|
||
|
{
|
||
|
L.elem[i+1] = L.elem[i];
|
||
|
}
|
||
|
return OK;
|
||
|
}
|
||
|
int move2(Stulist& L)
|
||
|
{
|
||
|
int i;
|
||
|
for (i =0;i<L.length;i++)
|
||
|
{
|
||
|
L.elem[i] = L.elem[i+1];
|
||
|
}
|
||
|
return OK;
|
||
|
}
|
||
|
int Sortname(Stulist& L)//直接插入排序
|
||
|
{
|
||
|
move1(L);
|
||
|
int i,j;
|
||
|
for (i = 2;i <= L.length;i++)
|
||
|
if(strcmp(L.elem[i].name, L.elem[i-1].name)<0)
|
||
|
{
|
||
|
L.elem[0] = L.elem[i];
|
||
|
L.elem[i]= L.elem[i-1];
|
||
|
for (j = i - 2;strcmp(L.elem[0].name, L.elem[j].name)<0;j--)
|
||
|
{
|
||
|
L.elem[j + 1] = L.elem[j];
|
||
|
}
|
||
|
L.elem[j + 1] = L.elem[0];
|
||
|
}
|
||
|
move2(L);
|
||
|
return OK;
|
||
|
}
|
||
|
int Patition(Stulist& L, int low, int high)
|
||
|
{
|
||
|
//交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位置
|
||
|
//此时在它之前(后)的记录均不大于(小于)它
|
||
|
L.elem[0] = L.elem[low]; //用子表的第一个记录作枢轴记录
|
||
|
int pivotkey = L.elem[low].ID; //枢轴记录关键字
|
||
|
while (low < high)
|
||
|
{ //从表的两端向中间扫描
|
||
|
while (low < high && L.elem[high].ID >= pivotkey)
|
||
|
--high;
|
||
|
L.elem[low] = L.elem[high]; //将比枢轴小的记录移动到低端
|
||
|
while (low < high && L.elem[low].ID <= pivotkey)
|
||
|
++low;
|
||
|
L.elem[high] = L.elem[low]; //将比枢轴大的记录移动到高端
|
||
|
}
|
||
|
L.elem[low] = L.elem[0]; //枢轴记录到位
|
||
|
return low; //返回枢轴位置
|
||
|
}
|
||
|
|
||
|
void QSort(Stulist& L, int low, int high)
|
||
|
{
|
||
|
//对顺序表L中的子序列L.r[low...high]做快速排序
|
||
|
if (low < high)
|
||
|
{ //长度大于等于1
|
||
|
int pivotloc = Patition(L, low, high); //一分为二
|
||
|
QSort(L, low, pivotloc - 1); //对低子表递归排序
|
||
|
QSort(L, pivotloc + 1, high); //对高子表递归排序
|
||
|
}
|
||
|
}
|
||
|
void SortID(Stulist& L)
|
||
|
{
|
||
|
//对顺序表L做快速排序
|
||
|
QSort(L, 1, L.length);
|
||
|
}
|
||
|
int FindID(Stulist L, int ID)
|
||
|
{
|
||
|
int low = 1;
|
||
|
int high = L.length;
|
||
|
int mid;
|
||
|
while (low <= high)
|
||
|
{
|
||
|
mid = (low + high) / 2;
|
||
|
if (ID == L.elem[mid].ID)
|
||
|
return mid;
|
||
|
else if (ID < L.elem[mid].ID)
|
||
|
high = mid - 1;
|
||
|
else low = mid + 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|