-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
学生信息顺序表
#include<iostream>
#include<fstream>
#include<string>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
#define MAXSIZE 100 //顺序表可能达到的最大长度
/*
struct Student {
string id;//学号
string name;//人名
int grade;//成绩
};
*/
typedef struct {
char id[12]; //12位学号
char name[20]; //姓名
int grade; //成绩
}Student;
typedef struct {
Student *elem; //存储空间的基地址
int length; //当前长度
} SqList;
Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化
//构造一个空的顺序表L
L.elem = new Student[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if (!L.elem)
exit(OVERFLOW); //存储分配失败退出
L.length = 0; //空表长度为0
return OK;
}
Status GetElem(SqList L, int i, Student &e) {//算法2.2 顺序表的取值
if (i < 1 || i > L.length)
return ERROR; //判断i值是否合理,若不合理,返回ERROR
e = L.elem[i - 1]; //elem[i-1]单元存储第i个数据元素
return OK;
}
int LocateElem_Sq(SqList L, int e) { //算法2.3 顺序表的查找
//顺序表的查找
for (int i = 0; i < L.length; i++)
if (L.elem[i].grade == e)
return i + 1;//查找成功,返回序号i+1
return 0;//查找失败,返回0
}
Status ListInsert_Sq(SqList &L, int i, Student e) { //算法2.4 顺序表的插入
//在顺序表L中第i个位置之前插入新的元素e
//i值的合法范围是1<=i<=L.length+1
if ((i < 1) || (i > L.length + 1))
return ERROR; //i值不合法
if (L.length == MAXSIZE)
return ERROR; //当前存储空间已满
for (int j = L.length - 1; j >= i - 1; j--)
L.elem[j + 1] = L.elem[j]; //插入位置及之后的元素后移
L.elem[i - 1] = e; //将新元素e放入第i个位置
++L.length; //表长增1
return OK;
}
Status ListDelete_Sq(SqList &L, int i) { //算法2.5 顺序表的删除
//在顺序表L中删除第i个元素,并用e返回其值
//i值的合法范围是1<=i<=L.length
if ((i < 1) || (i > L.length))
return ERROR; //i值不合法
for (int j = i; j <= L.length; j++)
L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
--L.length; //表长减1
return OK;
}
int main() {
SqList L;
int i = 0, temp, a, c, choose;
int grade;
Student e;
string head_1, head_2, head_3;
cout << "1. 建立\n";
cout << "2. 输入\n";
cout << "3. 取值\n";
cout << "4. 查找\n";
cout << "5. 插入\n";
cout << "6. 删除\n";
cout << "7. 输出\n";
cout << "0. 退出\n\n";
choose = -1;
while (choose != 0) {
cout << "请选择:";
cin >> choose;
switch (choose) {
case 1://创建顺序表
if (InitList_Sq(L))
cout << "成功建立顺序表\n\n";
else
cout << "顺序表建立失败\n\n";
break;
case 2: {//顺序表信息输入
i = 0;
L.elem = new Student[MAXSIZE];
if (!L.elem)
exit(OVERFLOW);
L.length = 0;
fstream file;
file.open("student.txt");
if (!file) {
cout << "错误!未找到文件!" << endl;
exit(ERROR);
}
file >> head_1 >> head_2 >> head_3;
while (!file.eof()) {
file >> L.elem[i].id >> L.elem[i].name >> L.elem[i].grade;
i++;
}
cout << "输入 student.txt 信息完毕\n\n";
L.length = i;
file.close();
}
break;
case 3://顺序表的取值
cout << "请输入一个位置用来取值:\n";
cin >> i;
temp = GetElem(L, i, e);
if (temp != 0) {
cout << "查找成功\n";
cout << "第" << i << "个学生的信息是:\n";
cout << left << setw(15) << e.id << "\t" << left << setw(50)
<< e.name << "\t" << left << setw(5) << e.grade << endl
<< endl;
} else
cout << "查找失败!位置超出范围\n\n";
break;
case 4: //顺序表的查找
cout << "请输入所要查找成绩:";
cin >> grade;
temp = LocateElem_Sq(L, grade);
if (temp != 0) {
cout << "查找成功\n";
cout << "该成绩对应的学生为:" << L.elem[temp - 1].name << endl << endl;
} else
cout << "查找失败!没有这个成绩对应的学生\n\n";
break;
case 5: //顺序表的插入
cout << "请输入插入的位置和学生信息,包括:学号 姓名 成绩(用空格隔开):";
cin >> a;
cin >> e.id >> e.name >> e.grade; //输入a和b,a代表插入的位置,b代表插入的数值(学生信息)
if (ListInsert_Sq(L, a, e))
cout << "插入成功.\n\n";
else
cout << "插入失败.\n\n";
break;
case 6: //顺序表的删除
cout << "请输入所要删除的学生的位置:";
cin >> c;
if (ListDelete_Sq(L, c))
cout << "删除成功.\n\n";
else
cout << "删除失败.\n\n";
break;
case 7: //顺序表的输出
cout << "当前学籍系统信息(顺序表)读出:\n";
for (i = 0; i < L.length; i++)
cout << left << setw(15) << L.elem[i].id << "\t" << left
<< setw(50) << L.elem[i].name << "\t" << left
<< setw(5) << L.elem[i].grade << endl;
cout << endl;
break;
}
}
return 0;
}
学生信息链表
#include<stdio.h>
#include<string.h>
typedef struct student
{
int num;
char name[10];
float score[3];
}DataType;
typedef struct LNode
{
DataType data;
struct LNode *next;
}LNode,*LinkList;
//建立带头链表-头插法
LNode* Creat_LinkList1()
{
LinkList L;//创建链表
LNode *p;//p作为待插入节点
int flag=0;
printf("请输入这五名学生的学号、姓名和三科成绩:\n");
L->next=NULL;
while(flag!=5)
{
flag++;
p=new LNode;
scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
p->next=L->next;
L->next=p;
}
return L;
}
//建立带头链表-尾插法
LNode* Creat_LinkList2()
{
LinkList L=new LNode;//创建链表
LNode *s,*p;//p作为待插入节点,s作为尾结点
int flag=0;
printf("请输入这五名学生的学号、姓名和三科成绩:\n");
L->next=NULL;
s=L;
while(flag!=2)
{
flag++;
p=new LNode;
scanf("%d %s %f %f %f",&p->data.num,p->data.name,&p->data.score[0],&p->data.score[1],&p->data.score[2]);
s->next=p;
s=p;
}
s->next=NULL;
return L;
}
//求链表的长度
int Length_LinkList(LinkList L)
{
LNode *p;
p=L;
int len=0;
while(p->next)
{
p=p->next;
len++;
}
return len;
}
//按序号查找
LNode* Get_LinkList(LinkList L,int i)
{
LNode *p;
int num=0;
p=L;
while((p->next)&& num<i)
{
p=p->next;
num++;
}
return p;
}
//按值查找
LNode* Locate_LinkList(LinkList L,DataType x)
{
LNode *p;
p=L;
while(p->next&&p->data.num!=x.num&&p->data.name!=x.name)
p=p->next;
return p;
}
//插入元素
int Insert_LinkList(LinkList L,int i,DataType x)
{
LNode *p,*s;//s是待插入的结点
p=Get_LinkList(L,i-1);//查找第i个元素的前驱
if(p==NULL)
return 0;//第i-1个结点不存在
else
{
s=new LNode;
s->data=x;
s->next=p->next;
p->next=s;
return 1;
}
}
//删除元素
int Delete_LinkList(LinkList L,int i)
{
LNode *p,*s;
p=Get_LinkList(L,i-1);
if(p==NULL)
return -1;
else
{
if(p->next==NULL)
return 0;
else
{
s=p->next;
p->next=s->next;//逻辑上删除
delete s;//物理上删除
return 1;
}
}
}
//链表倒置
void Reverse_LinkList(LinkList L)
{
LNode *p,*q;
p=L->next;
L->next=NULL;
while(p)
{
q=p;
p=p->next;
q->next=L->next;
L->next=q;
}
}
//删除链表中的重复结点
void Pur_LinkList(LinkList L)
{
LNode *p,*q,*r;
p=L->next;
while(p)
{
q=p;
while(q->next)
{
if(p->data.num==q->next->data.num&&p->data.name==q->data.name)
{
r=q->next;
q->next=r->next;
delete r;
}
else
q=q->next;
}
p=p->next;
}
}
//显示链表中的所有信息及所有的学生信息
void Print_LinkList(LinkList L)
{
printf("学号 姓名 A科成绩 B科成绩 C科成绩\n");
LNode *p;
p=L->next;
while(p)
{
printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]);
p=p->next;
}
}
//显示链表中结点的信息及某同学的信息
void Print_LNode(LNode *p)
{
printf("%d %7s %8.2f %9.2f %9.2f\n",p->data.num,p->data.name,p->data.score[0],p->data.score[1],p->data.score[2]);
}
int main()
{
LinkList L;
L=Creat_LinkList1();
Print_LinkList(L);
int flag;
printf("请输入你需要进行的操作:\n");
printf("1.统计学生总数\n");
printf("2.通过位置查找学生信息\n");
printf("3.通过学生学号和姓名查找学生信息\n");
printf("4.插入学生信息\n");
printf("5.删除学生信息\n");
printf("6.逆序学生信息\n");
printf("7.删除重复的学生信息\n");
scanf("%d",&flag);
if(flag==1)
{
printf("链表中存储了%d个学生的信息。\n",Length_LinkList(L));
}
if(flag==2)
{
printf("请输入你想查找学生信息的位置:\n");
int site;
scanf("%d",&site);
LNode *p;
p=Get_LinkList(L,site);
if(p==NULL)
printf("没有找到该学生的信息!");
else
{
printf("第%d位同学的学号、姓名及各课成绩为:\n",site);
Print_LNode(p);
}
}
if(flag==3)
{
LNode *p;
DataType d1;
printf("请输入学生的学号和姓名:\n");
scanf("%d %s",&d1.num,d1.name);
p=Locate_LinkList(L,d1);
if(p==NULL)
printf("没有找到该学生的信息!");
else
{
printf("这位同学的学号、姓名及各课成绩为:\n");
Print_LNode(p);
}
}
if(flag==4)
{
DataType d2;
int location,flag1=0;
printf("请输入你要插入的学生的位置和信息:\n");
scanf("%d %d %s %f %f %f",&location,&d2.num,d2.name,&d2.score[0],&d2.score[1],&d2.score[2]);
//flag1=Insert_LinkList(L,location,d2);
if(flag1==0)
printf("插入位置不合法!");
else
printf("插入成功!");
Print_LinkList(L);
}
if(flag==5)
{
int flag2,site1;
printf("请输入你想删除学生信息的位置:\n");
scanf("%d",&site1);
flag2=Delete_LinkList(L,site1);
if(flag2==-1||flag2==0)
printf("删除的位置不合法。\n");
else
printf("删除成功!\n");
Print_LinkList(L);
}
if(flag==6)
{
Reverse_LinkList(L);
Print_LinkList(L);
}
if(flag==7)
{
Pur_LinkList(L);
Print_LinkList(L);
}
return 0;
}
Metadata
Metadata
Assignees
Labels
No labels