一、 实验目的与要求:
实验报告
1、综合应用线性结构,树及图的有关知识,实现“学生数据结构成绩管理系统”的
分析、设计与实现;
2、掌握散列表冲突的解决方法及散列查找的实现;
3、掌握常见排序算法,实现系统学生成绩的排序;
二、 实验内容:
学生数据结构成绩管理系统
1、系统分析:
1.1.设计题目:学生数据结构成绩管理系统
1.2.设计内容:
设计一个简单的学生信息管理系统,使之能提供以下功能:学生信息及成绩
的录入,学生成绩的查询,学生成绩的分段统计和排序输出。
要求系统界面友好,使用方便。
1.3.系统功能需求分析:
(1)学生信息及成绩的录入
要求包括的学生信息有:学号,姓名,性别,出生日期,民族 及数据结构成
绩(具体内容可自行假设,至少录入 10 名以上学生).
所录入的学生按学号散列存储,采用拉链法解决冲突.
(2)学生成绩的查询
根据提供的学号完成学生成绩的查询(采用散列查找).
(3)学生成绩的分段统计和排序输出
统计出各分数段学生人数(60 分以下,60~70,71~80,81~90,91~100)
采用堆排序,将学生成绩从高到低排序输出.
(4)应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能
清晰美观。
1.4.数据结构设计:
struct student
{
unsigned long int num; /* 定义学号*/
char name[10];/*定义姓名*/
char sex[10];/*定义性别*/
char birth[10];/*定义出生日期*/
char nationality[10];/*定义民族*/
int score;/*定义分数*/
}
stu[SIZE]; /* 定义结构体数组,存贮多个学生的记录*/
typedef struct node{unsigned long int key;
struct node *link;}HNode;/* 散列表的节点类型定义*/
typedef struct{int key;/*排序码*/
float data;/*其他数据项*/}RecNode;
1.5.源程序代码:
#include
#include
#define SIZE 10
typedef struct node{unsigned long int key;
struct node *link;}HNode;
typedef struct{int key;/*排序码*/
float data;/*其他数据项*/}RecNode;
struct student
{
unsigned long int num;
char name[10];
char sex[10];
char birth[10];
char nationality[10];
int score;
}stu[SIZE];
void build()
{int i;
printf("\n*** No.
name
sex birth
nationality score ***\n");
for(i=0;i
HNode *p;
i=h(k);
if(t[i]==NULL)
{p=(HNode*)malloc(sizeof(HNode));
p->key=k;p->link=NULL;
t[i]=p;printf("\n inserted %lu\n ",k);
return(1);}
else
{p=t[i];
while(p!=NULL)
if(p->key==k)
{printf("\n retrieval %lu\n ",k);return(0);}
else if(p->link!=NULL) p=p->link;
else{p->link=(HNode*)malloc(sizeof(HNode));
p=p->link;p->key=k;p->link=NULL;
printf("\n inserted %lu\n ",k);return(1);
getch();}
}
}
HNode *linksearch(HNode *t[],unsigned long int k)
{/*在用拉链法处理冲突的散列表t中查找关键字为给定值k的记录*/
HNode *p;
int i;
i=h(k);
if(t[i]==NULL)return(NULL);
p=t[i];
while(p!=NULL)
if(p->key==k)
{printf("%lu\n",p->key);
return(p);}
else p=p->link;
return(NULL);
}
void statistics()
{
float k;
int A,B,C,D,E,i;
A=0;
B=0;
C=0;
D=0;
E=0;
for(i=0;i=90)
A=A+1;
else if(89>=k&&k>=80)
B=B+1;
else if(79>=k&&k>=70)
C=C+1;
else if(69>=k&&k>=60)
D=D+1;
else
E=E+1;
}
}
printf(" \n 90~100: %d\n",A);
printf(" \n 80~89:
%d\n",B);
printf(" \n 70~79:
%d\n",C);
printf(" \n 60~69:
%d\n",D);
printf(" \n <60:
%d\n",E);
getch();
}
void sift(RecNode r[],int t,int w)
{/*用筛选法调整堆*/
int i,j;
RecNode x;
i=t;
x=r[i];
j=2*i+1;
while(j<=w)
{if((jr[j+1].key))
j++;
if(x.key>r[j].key)
{r[i]=r[j];i=j;j=2*j+1;}
else break;
}
r[i]=x;
}
void heapsort(RecNode r[],int n)
{/*堆排序*/
int i;
RecNode x;
for(i=n/2-1;i>=0;i--)
sift(r,i,n-1);
for(i=n-1;i>0;i--)
{x=r[0];r[0]=r[i];
r[i]=x;
sift(r,0,i-1);
}
}
void sort()
{HNode *t[SIZE];
RecNode r[SIZE];
int i;
int s;unsigned long int k;
for(i=0;i
h(k);
linkinsert(t[SIZE],k);
}
printf("input what you want to search:\n");
scanf("%lu",&k);
h(k);
linksearch(t[SIZE],k);
for(i=0;i