数据结构第一次作业(学生信息管理系统-顺序表&&链表)
Posted 希声lx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构第一次作业(学生信息管理系统-顺序表&&链表)相关的知识,希望对你有一定的参考价值。
实验目的 :
1 、掌握线性表的定义;
2 、掌握线性表的基本操作,如建立、查找、插入和删除等。
实验内容:
定义一个包含学生信息(学号,姓名,成绩)的的 顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
参考信息 :
Definition of structure student :
typedef struct {
char no[8]; //8 位学号
char name[20]; // 姓名
int price; // 成绩
}Student;
Definition of sequential list:
typedef struct {
Student *elem; // 指向数据元素的基地址
int length; // 线性表的当前长度
}SqList ;
Definition of linked list :
typedef struct LNode{
Student data; // 数据域
struct LNode *next; // 指针域
}LNode,*LinkList;
实验要求 :
(1) 程序要添加适当的注释,程序的书写要采用 缩进格式 。
(2) 程序要具在一定的 健壮性,即当输入数据非法时, 程序也能适当地做出反应,如 插入删除时指定的位置不对等等。
(3) 程序要做到 界面友好,在程序运行时用户可以根据相应的提示信息进行操作。
(4) 上传源程序到课堂派。顺序表的源程序保存为SqList.cpp,链表的源程序保存为LinkList.cpp。
顺序表的源程序:
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100 typedef int Status; // 定义函数返回值类型 typedef struct { char no[10]; // 学号 char name[20]; // 姓名 int score; // 成绩 }student; typedef student ElemType; typedef struct { ElemType *elem; // 存储空间的基地址 int length; // 当前长度 }SqList; Status InitList(SqList *L) // 构造空的顺序表 L { L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE); if(!L->elem) exit(OVERFLOW); L->length=0; return OK; } ElemType GetElem(SqList &L,int i) // 访问顺序表,找到 i位置,返回给 e { return L.elem[i]; } int Search(SqList &L,char str[]) // 根据名字查找,返回该同学在顺序表中的编号 { for(int i=1;i<=L.length;i++) { if(strcmp(L.elem[i].name,str)==0) return i; } return 0; } Status ListInsert(SqList &L,int i,ElemType e) // 在 i位置插入某个学生的信息 { if((i<1)||(i>L.length+1)) return ERROR; if(L.length==MAXSIZE) return ERROR; for(int j=L.length;j>=i;j--) { L.elem[j+1]=L.elem[j]; } L.elem[i]=e; ++L.length; return OK; } Status ListDelete(SqList &L,int i) // 在顺序表中删除 i位置的学生信息 { if((i<1)||(i>L.length)) return ERROR; for(int j=i;j<=L.length;j++) { L.elem[j]=L.elem[j+1]; } --L.length; return OK; } void Input(ElemType *e) { printf("姓名:"); scanf("%s",e->name); printf("学号:"); scanf("%s",e->no); printf("成绩:"); scanf("%d",&e->score); printf("输入完成\n\n"); } void Output(ElemType *e) { printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2d\n\n",e->name,e->no,e->score); } int main() { SqList L; ElemType a,b,c,d; printf("------------10.2.34版-----------\n"); puts("1. 构造顺序表"); puts("2. 录入指定人数的学生信息"); puts("3. 显示学生表中的所有信息"); puts("4. 根据姓名查找该学生,并返回学号和成绩"); puts("5. 根据某指定位置显示该学生信息"); puts("6. 在指定位置插入学生信息"); puts("7. 在指定位置删除学生信息"); puts("8. 统计学生个数"); puts("0. 退出"); printf("------------------------\n"); int x,choose; while(1) { puts("请输入你要选择的功能前的序号:"); scanf("%d",&choose); if(choose==0) break; switch(choose) { case 1: if(InitList(&L)) printf("成功建立顺序表\n\n"); else printf("顺序表建立失败\n\n"); break; case 2: printf("请输入要录入学生的人数(小于100):"); scanf("%d",&x); for(int i=1;i<=x;i++) { printf("第%d个学生:\n",i); Input(&L.elem[i]); } L.length=x; puts(""); break; case 3: for(int i=1;i<=x;i++) { a=GetElem(L,i); Output(&a); } break; case 4: char s[20]; printf("请输入要查找的学生姓名:"); scanf("%s",s); if(Search(L,s)) Output(&L.elem[Search(L,s)]); else puts("对不起,查无此人"); puts(""); break; case 5: printf("请输入要查询的位置:"); int id1; scanf("%d",&id1); b=GetElem(L,id1); Output(&b); break; case 6: printf ("请输入要插入的位置:"); int id2; scanf("%d",&id2); printf("请输入学生信息:\n"); Input(&c); if(ListInsert(L,id2,c)) { x++; puts("插入成功"); puts(""); } else { puts("插入失败"); puts(""); } break; case 7: printf("请输入要删除的位置:"); int id3; scanf("%d",&id3); if(ListDelete(L,id3)) { x--; puts("删除成功"); puts(""); } else { puts("删除失败"); puts(""); } break; case 8: printf("已录入的学生个数为:%d\n\n",L.length); break; } } printf("\n\n谢谢您的使用,请按任意键退出\n\n\n"); system("pause"); return 0; }
链表的源程序:
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #include<iostream> using namespace std; typedef int Status; // 定义函数返回值类型 typedef struct { char no[10]; // 学号 char name[20]; // 姓名 double score; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表 L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK; } Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到 i位置的数据域,返回给 e { LinkList p; p=L->next; int j=1; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return ERROR; e=p->data; return OK; } Status Search(LNode L,char str[],LinkList &p) // 根据名字查找 { p=L.next; while(p) { if(strcmp(p->data.name,str)==0) return OK; p=p->next; } return ERROR; } Status ListInsert(LinkList L,int i,ElemType e) // 在 i个位置插入某个学生的信息 { LinkList p,s; p=L; int j=0; while(p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) return ERROR; s=(struct LNode*)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; return OK; } Status ListDelete(LinkList p,int i) // 删除 i位置的学生信息 { int j=0; while((p->next)&&(j<i-1)) { p=p->next; ++j; } if(!(p->next)||(j>i-1)) return ERROR; LinkList q; q=p->next; p->next=q->next; delete q; return OK; } void Input(ElemType *e) { cout<<"姓名:"; cin>>e->name; cout<<"学号:"; cin>>e->no; cout<<"成绩:"; cin>>e->score; cout<<"完成输入\n\n"; } void Output(ElemType *e) { printf("姓名:%-20s\n学号:%-10s\n成绩:%-10.2lf\n\n",e->name,e->no,e->score); } int main() { LNode L; LinkList p; ElemType a,b,c,d; cout<<"------------10.2.34版 -----------\n"; cout<<"1. 构造顺序表\n"; cout<<"2. 录入指定人数的学生信息\n"; cout<<"3. 显示学生表中的所有信息\n"; cout<<"4. 根据姓名查找该学生,并返回学号和成绩\n"; cout<<"5. 根据某指定位置显示该学生信息\n"; cout<<"6. 在指定位置插入学生信息\n"; cout<<"7. 在指定位置删除学生信息\n"; cout<<"8. 统计学生个数\n"; cout<<"0. 退出\n"; cout<<"------------------------\n"; int n,choose=-1; while(choose!=0) { puts("请输入你要选择的功能前的序号:"); cin>>choose ; if(choose==0) break; else if (choose==1) { if(InitList(p)) cout<<"建立顺序表成功\n"; else cout<<"建立顺序表失败\n"; } else if (choose==2) { cout<<"将要输入学生的人数:"; cin>>n; for(int i=1;i<=n;i++) { printf("第%d个学生:\n",i); Input(&a); ListInsert(&L,i,a); } } else if (choose==3) { for(int i=1;i<=n;i++) { GetElem(&L,i,b); Output(&b); } } else if (choose==4) { char s[20]; cout<<"请输入要查找的学生姓名:"; cin>>s; if(Search(L,s,p)) Output(&(p->data)); else cout<<"对不起,查无此人"; puts(""); } else if (choose==5) { cout<<"请输入要查询的位置:"; int id1; cin>>id1; GetElem(&L,id1,c); Output(&c); } else if (choose==6) { cout<<"请输入要插入的位置:"; int id2; cin>>id2; cout<<"请输入学生信息:\n"; Input(&d); if(ListInsert(&L,id2,d)) { n++; cout<<"插入成功"; ; puts(""); } else { cout<<"插入失败"; puts(""); } } else if (choose==7) { cout<<"请输入要删除的位置:"; int id3; cin>>id3; if(ListDelete(&L,id3)) { n--; cout<<"删除成功"; puts(""); } else { cout<<"删除失败"; puts(""); } } else if (choose==8) { cout<<"已录入的学生个数为:"<<n<<endl; break; } } cout<<"\n\n谢谢您的使用,请按任意键退出\n\n\n"; system("pause"); return 0; }
以上是关于数据结构第一次作业(学生信息管理系统-顺序表&&链表)的主要内容,如果未能解决你的问题,请参考以下文章