数据结构顺序表实用练习
都是基本的函数调用和排序,加了点小小的选项。就算对顺序表的结构熟悉练练手吧。。。。
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
struct stu
{
string name;
string num;
int m,e,c;
};
typedef stu ElemType;
#define LIST_INIT_SIZE 1000 // 线性表存储空间的初始分配量
#define LISTINCREMENT 1000 // 线性表存储空间的分配增量
struct SqList
{
ElemType elem[1000]; // 存储空间基址
int length; // 当前长度
int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
};
int InitList(SqList &L)
{
// 操作结果:构造一个空的顺序线性表
// L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW); // 存储分配失败
L.length=0; // 空表长度为0
L.listsize=LIST_INIT_SIZE; // 初始存储容量
return OK;
}
int ListLength(SqList L)///返回线性表元素个数
{
return L.length;
}
int LocateElem(SqList L,ElemType e,int(*compare)(ElemType,ElemType))///算法2.6 按compare()位序返回元素
{
// 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0)
// 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。
// 若这样的数据元素不存在,则返回值为0。
int i=0;
ElemType *p=L.elem;
while(i<=L.length&&!(*compare)(*p++,e))++i;
if(i<=L.length)return i;
else return 0;
}
int ListDelete(SqList &L,int i,ElemType &e) /// 算法2.5 删除元素
{
// 初始条件:顺序线性表L已存在,1≤i≤ListLength(L)
// 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1
if((i<1)||(i>L.length))return ERROR;
ElemType *p=&(L.elem[i-1]);
e=*p;
ElemType *q=L.elem+L.length-1;
for(++p; p<=q; ++p) *(p-1)=*p;
L.length--;
return OK;
}
int ListTraverse(SqList L,void(*vi)(ElemType&))///依次对L的每个数据元素调用函数vi()
{
// 初始条件:顺序线性表L已存在
// 操作结果:依次对L的每个数据元素调用函数vi()。一旦vi()失败,则操作失败
// vi()的形参 加'&',表明可通过调用vi()改变元素的值
ElemType *p;
int i;
p=L.elem;
for(i=1; i<=L.length; i++)
vi(*p++);
cout<<endl;//相当于c语言里面的printf("
")
return OK;
}
int EndInsert(SqList &L,ElemType e)///在顺序表L 尾部 插入新元素
{
// 初始条件:顺序线性表L已存在。操作结果:在L的尾部插入新的数据元素e,L的长度加1。
ElemType *p,*q,*newbase;
// if(L.length>=L.listsize)
// {
// if(!(newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType))))
// exit(OVERFLOW);
// L.elem=newbase;
// L.listsize+=LISTINCREMENT;
// }
q=L.elem+L.length;
*q=e;
L.length++;
return OK;
}
int DeleteElem_num(SqList &L,ElemType e)///按学号删除
{
// 删除表中值为e的元素,并返回TRUE;如无此元素,则返回FALSE
ElemType *p;
int flag=0;
for(p=L.elem; p<=L.elem+L.length-1; p++)
{
if((*p).num==e.num)
{
flag=1;
ElemType *q=L.elem+L.length-1;
ElemType *P=p;
for(++P; P<=q; ++P) *(P-1)=*P;
L.length--;
p--;
}
}
return flag?TRUE:FALSE;
}
int comp_num(ElemType c1,ElemType c2)
{
if(c1.num==c2.num)
return TRUE;
else
return FALSE;
}
int comp_name(ElemType c1,ElemType c2)
{
if(c1.name==c2.name)
return TRUE;
else
return FALSE;
}
void output(SqList L,int local)
{
cout<<L.elem[local].num<<"-----"<<L.elem[local].name<<"-----"<<L.elem[local].c<<"-----"<<L.elem[local].m<<"-----"<<L.elem[local].e<<endl;
return;
}
void add_or_del(SqList &L)
{
printf("1.增加学生信息
");
printf("2.删除学生信息
");
printf("请输入要执行的操作:");
int work,n;
ElemType tmp;
scanf("%d",&work);
if(work==1)
{
printf("请输入增加学生个数:
");
scanf("%d",&n);
for(int i=0; i<n; i++)
{
printf("请依次输入增加学生的姓名、学号:
",i);
cin>>tmp.name;
cin>>tmp.num;
printf("请依次输入增加学生的语文、数学、英语成绩:
");
scanf("%d%d%d",&tmp.c,&tmp.m,&tmp.e);
EndInsert(L,tmp);
}
printf("增加完毕
");
}
else
{
printf("请输入删除学生个数:
");
scanf("%d",&n);
for(int i=0; i<n; i++)
{
printf("请输入要删除学生的学号:
");
cin>>tmp.num;
DeleteElem_num(L,tmp);
}
printf("删除完毕
");
}
}
void check_stu(SqList &L)
{
int work,n;
ElemType tmp;
printf("1.输入学号查找
");
printf("2.输入姓名查找
");
printf("请输入操作类型:
");
scanf("%d",&work);
printf("请输入要查找的学生个数:");
scanf("%d",&n);
if(work==1)
{
for(int i=0; i<n; i++)
{
printf("请输入要查找的学号:");
cin>>tmp.num;
int local=LocateElem(L,tmp,comp_num);
if(local<=L.length)
output(L,local);
else printf("查无此人
");
}
}
else
{
for(int i=0; i<n; i++)
{
printf("请输入要查找的姓名:");
cin>>tmp.name;
int local=LocateElem(L,tmp,comp_name);
if(local<=L.length)
output(L,local);
else printf("查无此人
");
}
}
}
void check_mark(SqList &L)
{
int work,low,high;
ElemType tmp;
printf("1.语文
");
printf("2.数学
");
printf("3.英语
");
printf("请输入要查找的科目:");
scanf("%d",&work);
printf("请输入要查找的分数段:
");
scanf("%d%d",&low,&high);
if(work==1)
{
for(int i=0; i<L.length; i++)
if(L.elem[i].c>=low&&L.elem[i].c<=high)
output(L,i);
}
else if(work==2)
{
for(int i=0; i<L.length; i++)
if(L.elem[i].m>=low&&L.elem[i].m<=high)
output(L,i);
}
else
{
for(int i=0; i<L.length; i++)
if(L.elem[i].e>=low&&L.elem[i].e<=high)
output(L,i);
}
}
bool c_up(ElemType a,ElemType b)
{
return a.c<b.c;
}
bool c_down(ElemType a,ElemType b)
{
return a.c>b.c;
}
bool m_up(ElemType a,ElemType b)
{
return a.m<b.m;
}
bool m_down(ElemType a,ElemType b)
{
return a.m>b.m;
}
bool e_up(ElemType a,ElemType b)
{
return a.e<b.e;
}
bool e_down(ElemType a,ElemType b)
{
return a.e>b.e;
}
void Sort(SqList &L)
{
int work,up_down;
ElemType tmp;
printf("1.语文
");
printf("2.数学
");
printf("3.英语
");
printf("请输入排序作为关键字的科目:");
scanf("%d",&work);
printf("1.升序
");
printf("2.降序
");
printf("请输入升序或降序操作:");
scanf("%d",&up_down);
if(work==1)
{
if(up_down==1)sort(L.elem,L.elem+L.length,c_up);
else sort(L.elem,L.elem+L.length,c_down);
for(int i=0; i<L.length; i++)output(L,i);
}
else if(work==2)
{
if(up_down==1)sort(L.elem,L.elem+L.length,m_up);
else sort(L.elem,L.elem+L.length,m_down);
for(int i=0; i<L.length; i++)output(L,i);
}
else
{
if(up_down==1)sort(L.elem,L.elem+L.length,e_up);
else sort(L.elem,L.elem+L.length,e_down);
for(int i=0; i<L.length; i++)output(L,i);
}
}
int main()
{
SqList La;
InitList(La);
int n;
printf("请输入学生个数:");
scanf("%d",&n);
ElemType tmp;
for(int i=1; i<=n; i++)
{
printf("请依次输入第%d个学生的姓名、学号:
",i);
cin>>tmp.name;
cin>>tmp.num;
printf("请依次输入第%d个学生的语文、数学、英语成绩:
",i);
scanf("%d%d%d",&tmp.c,&tmp.m,&tmp.e);
EndInsert(La,tmp);
}
int work;
printf("1.增加、删除学生信息
");
printf("2.输入学号或姓名查询学生信息
");
printf("3.统计课程分数段信息
");
printf("4.将学生信息按课程分数进行排序
");
printf("请输入要执行的操作:");
while(scanf("%d",&work)!=EOF)
{
switch(work)
{
case 1:
add_or_del(La);
break;
case 2:
check_stu(La);
break;
case 3:
check_mark(La);
break;
case 4:
Sort(La);
break;
default:
printf("输入错误,请重新输入
");
}
}
}
/*
6
zhangruida 1604010901 23 56 89
aldjfjajo 1604010978 78 78 19
alkjdfiadf 160488405 78 98 29
wwwwwww 1604010902 56 73 45
eeeeeoooo 1604019013 79 48 15
qqqqqqppppp 1604018098 78 98 56
*/