一、实验目的:
1、掌握线性表的定义;
2、掌握线性表的基本操作,如建立、查找、插入和删除等。
二、实验内容:
定义一个包含学生信息(学号,姓名,成绩)的的顺序表和链表,使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
三、数据结构设计
四、代码
- SqList
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 //学生信息的定义 typedef struct { char no[8]; //8位学号 char name[20]; //姓名 int price; //成绩 }Student; //顺序表的定义 typedef struct { Student *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqList; //开始界面 void start(){ puts("1. 根据指定学生个数,逐个输入学生信息 "); puts("2. 逐个显示学生表中所有学生的相关信息"); puts("3. 根据姓名进行查找,返回此学生的学号和成绩"); puts("4. 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)"); puts("5. 给定一个学生信息,插入到表中指定的位置"); puts("6. 删除指定位置的学生记录"); puts("7. 统计表中学生个数"); puts("0. 退出"); } //初始化 void InitList(SqList &L){ L.elem=(Student*)malloc(MAXSIZE*sizeof(Student)); L.length=0; } //判断学号是否相同 bool check_same(SqList &L,char* _no){ for(int i=0;i<L.length;i++){ if(!strcmp(L.elem[i].no,_no)) return false; } return true; } //判断成绩是否符合要求 bool check_mark(int price){ if(price<0) return false; if(price>100) return false; return true; } //根据指定学生个数,逐个输入学生信息 void input(SqList &L){ int n; printf("输入要导入学生的个数:"); scanf("%d",&n); if(n+L.length>MAXSIZE){ printf("导入学生的个数过多\n"); return; } for(int i=0;i<n;i++){ printf("输入学生的学号:"); scanf("%s",L.elem[L.length].no); printf("输入学生的姓名:"); scanf("%s",L.elem[L.length].name); printf("输入学生的成绩:"); scanf("%d",&L.elem[L.length].price); L.length++; } printf("导入成功\n"); } //逐个显示学生表中所有学生的相关信息 void output(SqList &L){ if(!L.length) { printf("学生表为空\n"); return; } for(int i=0;i<L.length;i++){ printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",L.elem[i].no,L.elem[i].name,L.elem[i].price); } } //根据姓名进行查找,返回此学生的学号和成绩 void search(SqList &L){ char find_name[20]; printf("输入该同学的姓名:"); scanf("%s",find_name); for(int i=0;i<L.length;i++){ if(!strcmp(find_name,L.elem[i].name)){ printf("学号:%s\t\t成绩:%d\n",L.elem[i].no,L.elem[i].price); return; } } printf("查找不到此同学\n"); } //根据指定的位置可返回相应的学生信息(学号,姓名,成绩) void print(SqList &L){ int id; printf("输入要查找的位置:"); scanf("%d",&id); if(id>=L.length){ printf("此位置不存在\n"); return; } printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",L.elem[id].no,L.elem[id].name,L.elem[id].price); } //给定一个学生信息,插入到表中指定的位置 void ListInsert(SqList &L){ if(L.length==MAXSIZE){ printf("学生表已满\n"); return; } int i; printf("输入要插入的位置:"); scanf("%d",&i); if(i>=L.length+1){ printf("此位置不存在\n"); return; } char _no[8]; //8位学号 char _name[20]; //姓名 int _price; //成绩 printf("输入要插入学生的学号:"); scanf("%s",_no); if(!check_same(L,_no)){ puts("该学号已被使用"); return; } printf("输入要插入学生的姓名:"); scanf("%s",_name); printf("输入要插入学生的成绩:"); scanf("%d",&_price); if(!check_mark(_price)){ puts("成绩不符合要求"); return; } if(i<L.length){ //不在末尾 for(int k=L.length-1;k>=i;k--){ L.elem[k+1]=L.elem[k]; } } strcpy(L.elem[i].no,_no); strcpy(L.elem[i].name,_name); L.elem[i].price=_price; L.length++; printf("插入成功\n"); } //删除指定位置的学生记录 void ListDelete(SqList &L){ if(!L.length){ printf("学生表为空\n"); return; } int i; printf("输入要删除的位置:"); scanf("%d",&i); if(i>=L.length){ printf("此位置不存在\n"); return; } if(i<L.length){ //不在末尾 for(int k=i;k<L.length-1;k++){ L.elem[k]=L.elem[k+1]; } } L.length--; printf("删除成功\n"); } //统计表中学生个数 int ListLength(SqList &L){ return L.length; } int main(){ #ifdef DEBUG // freopen("F:/laji/1.in", "r", stdin); // freopen("F:/laji/2.out", "w", stdout); #endif start(); SqList L; InitList(L); int op; while(scanf("%d",&op),op){ if(op==1) input(L); else if(op==2) output(L); else if(op==3) search(L); else if(op==4) print(L); else if(op==5) ListInsert(L); else if(op==6) ListDelete(L); else if(op==7) printf("学生个数:%d\n",ListLength(L)); else puts("请输入正确的数"); } return 0; }
- LinkList
#include <stdio.h> #include <stdlib.h> #include <string.h> //学生信息的定义 typedef struct { char no[8]; //8位学号 char name[20]; //姓名 int price; //成绩 }Student; //链表的定义: typedef struct LNode{ Student data; //数据域 struct LNode *next; //指针域 }LNode,*LinkList; //开始界面 void start(){ puts("1. 根据指定学生个数,逐个输入学生信息 "); puts("2. 逐个显示学生表中所有学生的相关信息"); puts("3. 根据姓名进行查找,返回此学生的学号和成绩"); puts("4. 根据指定的位置可返回相应的学生信息(学号,姓名,成绩)"); puts("5. 给定一个学生信息,插入到表中指定的位置"); puts("6. 删除指定位置的学生记录"); puts("7. 统计表中学生个数"); puts("0. 退出"); } //初始化 void InitList(LinkList &L){ L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; } //判断学号是否相同 bool check_same(LinkList &L,char* _no){ LinkList p = L->next; while(p!=NULL){ if(!strcmp(p->data.no, _no)) return false; p = p->next; } return true; } //判断成绩是否符合要求 bool check_mark(int price){ if(price<0) return false; if(price>100) return false; return true; } //根据指定学生个数,逐个输入学生信息 void input(LinkList &L){ int n; printf("输入要导入学生的个数:"); scanf("%d",&n); LinkList p = L; while(p->next!=NULL){ p=p->next; } for(int i=0;i<n;i++){ LinkList q = (LinkList)malloc(sizeof(LNode)); printf("输入学生的学号:"); scanf("%s",q->data.no); printf("输入学生的姓名:"); scanf("%s",q->data.name); printf("输入学生的成绩:"); scanf("%d",&q->data.price); q->next = p->next; p->next = q; } printf("导入成功\n"); } //逐个显示学生表中所有学生的相关信息 void output(LinkList &L){ if(L->next==NULL) { printf("学生表为空\n"); return; } LinkList p = L->next; while(p!=NULL){ printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",p->data.no,p->data.name,p->data.price); p = p->next; } } //根据姓名进行查找,返回此学生的学号和成绩 void search(LinkList &L){ char find_name[20]; printf("输入该同学的姓名:"); scanf("%s",find_name); LinkList p = L; while(p!=NULL){ if(!strcmp(find_name,p->data.name)){ printf("学号:%s\t\t成绩:%d\n",p->data.no,p->data.price); return; } p = p->next; } printf("查找不到此同学\n"); } //根据指定的位置可返回相应的学生信息(学号,姓名,成绩) void print(LinkList &L){ int id,j=0; LinkList p = L->next; printf("输入要查找的位置:"); scanf("%d",&id); while(p!=NULL&&j<id){ p = p->next; j++; } if(p==NULL||j>id){ printf("此位置不存在\n"); return; } printf("学号:%s\t\t姓名:%s\t\t成绩:%d\n",p->data.no,p->data.name,p->data.price); } //给定一个学生信息,插入到表中指定的位置 void ListInsert(LinkList &L){ int i,j=0; LinkList p = L; printf("输入要插入的位置:"); scanf("%d",&i); while(p!=NULL&&j<i){ p = p->next; j++; } if(p==NULL||j>i){ printf("此位置不存在\n"); return; } char _no[8]; //8位学号 char _name[20]; //姓名 int _price; //成绩 printf("输入要插入学生的学号:"); scanf("%s",_no); if(!check_same(L,_no)){ puts("该学号已被使用"); return; } printf("输入要插入学生的姓名:"); scanf("%s",_name); printf("输入要插入学生的成绩:"); scanf("%d",&_price); if(!check_mark(_price)){ puts("成绩不符合要求"); return; } LinkList s=(LinkList)malloc(sizeof(LNode)); strcpy(s->data.no,_no); strcpy(s->data.name,_name); s->data.price=_price; s->next = p->next; p->next = s; printf("插入成功\n"); } //删除指定位置的学生记录 void ListDelete(LinkList &L){ int i,j=0; LinkList p = L; printf("输入要删除的位置:"); scanf("%d",&i); while(p->next!=NULL&&j<i){ p = p->next; j++; } if(p->next==NULL||j>i){ printf("此位置不存在\n"); return; } LinkList q = p->next; p->next = q->next; free(q); printf("删除成功\n"); } //统计表中学生个数 int ListLength(LinkList &L){ int ans=0; LinkList p = L->next; while(p!=NULL){ p=p->next; ans++; } return ans; } int main(){ #ifdef DEBUG // freopen("F:/laji/1.in", "r", stdin); // freopen("F:/laji/2.out", "w", stdout); #endif start(); LinkList L; InitList(L); int op; while(scanf("%d",&op),op){ if(op==1) input(L); else if(op==2) output(L); else if(op==3) search(L); else if(op==4) print(L); else if(op==5) ListInsert(L); else if(op==6) ListDelete(L); else if(op==7) printf("学生个数:%d\n",ListLength(L)); else puts("请输入正确的数"); } return 0; }