#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct student
{
int xuehao;
char xingming[20];
float DS;
float DB;
float OS;
float zongfen;
}st,*tu;
typedef struct LNode{
st data;
struct LNode *next;
}LNode,*LinkList;
int count;
typedef struct Node{
st data;
struct Node *next;
}HNode;
HNode **HA;
void menu()
{
printf("**************************menu*************************\n");
printf("* 1:创建顺序表 *\n") ;
printf("* 2:增加学生信息 **\n");
printf("* 3:删除学生信息 **\n");
printf("* 4:修改学生信息 **\n");
printf("* 5:按姓名查找 **\n");
printf("* 6:按总成绩查找(链地址法) **\n");
printf("* 7:选择排序(根据学号升序) **\n");
printf("* 8:直接插入排序(根据姓名升序) **\n");
printf("* 9:打印学生表 **\n");
printf("* 0:exit **\n");
printf("********************************************************\n");
}
//打印链表中的元素
void printlk(LinkList L) {
LinkList p;
p=L->next;
while (p) {
printf("%d %s %f %f %f %f\n",p->data.xuehao,p->data.xingming, p->data.DS, p->data.DB,p->data.OS,p->data.zongfen);
p = p->next;
}
}
//生成一个空链表
LinkList initList()
{
LinkList L;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
void CreatList1(LinkList L)
{ //尾插法生成链表
LNode *p,*r;
int i;
printf("请输入链表中的元素个数:");
scanf("%d",&count);
r=L;
for(i=1;i<=count;i++){
p=(LinkList)malloc(sizeof(LNode));
printf("请输入第%d位学生的 学号 姓名 数据结构DS成绩 数据库DB成绩 操作系统OS成绩\n", i);
scanf("%d %s %f %f %f",&p->data.xuehao,&p->data.xingming,&p->data.DS,&p->data.DB,&p->data.OS);
p->data.zongfen = p->data.DB + p->data.DS + p->data.OS;
// stu[i].xuehao = i+1 ;
// printf("%s",stu[i].xingming);
printf("%f\n", p->data.zongfen);
r->next=p;
r=p;
}
r->next=NULL;//处理尾结点
// return 1;
}
void Insert(LinkList L,int i)
{ //在第i个位置插入学生信息
LinkList p,q;
int j=0;
if(i<1){
printf("插入位置不合法!");
return;
}
p=L;//让指针p指向头结点
while(p&&j<i-1) {
p=p->next ;
j++;//使指针p指向第i个元素的前驱
}
q=(LinkList)malloc(sizeof(LNode));
printf("请输入第%d位学生的 学号 姓名 数据结构DS成绩 数据库DB成绩 操作系统OS成绩\n", i);
scanf("%d %s %f %f %f",&q->data.xuehao,&q->data.xingming,&q->data.DS,&q->data.DB,&q->data.OS);
q->data.zongfen = q->data.DB + q->data.DS + q->data.OS;
// q->data=x;
q->next=p->next;
p->next=q;
printf("插入成功!\n");
return;
}
void delx(LinkList L,int x)
{//删除所有值为x的结点
LinkList p,q,t;//q指向p的前驱
p=L->next;
q=L;
if(p==NULL){
printf("表为空,无法执行删除");
return;//表为空
}
while(p!=NULL){
if(p->data.xuehao==x){
t=p;//t指向被删结点
p=p->next;
q->next=p;
free(t);
printf("删除成功!\n");
return ;
}
else{
q=p;
p=p->next;
}
}
}
void xiugai(LinkList L,int x){//根据学号修改
int m;
LinkList p;
p=L->next;//p指向首元结点
while(p&&p->data.xuehao!=x) {
p=p->next;
}
printf("请输入要修改的选项(学号1 姓名2 数据结构3 数据库4 操作系统5):");
scanf("%d",&m);
if(m==1){
printf("请输入新学号:");
scanf("%d",&p->data.xuehao);
printf("修改成功!\n");
}
if(m==2){
printf("请输入新姓名:");
scanf("%s",&p->data.xingming);
printf("修改成功!\n");
}
if(m==3){
printf("请输入数据结构成绩:");
scanf("%f",&p->data.DS);
p->data.zongfen = p->data.DB + p->data.DS + p->data.OS;
printf("修改成功!\n");
}
if(m==4){
printf("请输入数据库成绩:");
scanf("%f",&p->data.DB);
p->data.zongfen = p->data.DB + p->data.DS + p->data.OS;
printf("修改成功!\n");
}
if(m==5){
printf("请输入操作系统成绩:");
scanf("%f",&p->data.OS);
p->data.zongfen = p->data.DB + p->data.DS + p->data.OS;
printf("修改成功!\n");
}
}
void finddata(LinkList L,char name[20])
{ //查找学号为X的学生
LinkList p;
p=L->next;//p指向首元结点p->data.xuehao!=x
while(p&& strcmp(p->data.xingming,name)!=0) {
p=p->next;
}
if(p==NULL)
printf("该学生表中不存在姓名为%s的学生",name);
printf("%d %s %f %f %f %f\n",p->data.xuehao,p->data.xingming, p->data.DS, p->data.DB,p->data.OS,p->data.zongfen);
}
void InitHash(int length){
int i;
for ( i = 0; i < length; i++) {
HA[i]=(HNode *) malloc(sizeof (HNode));
HA[i]->data.zongfen=i;
HA[i]->next=NULL;
}
}
void SearchHash(HNode **Q,float k,int length){
int key;
HNode *p;
int m;
m=(int)k;
key=m%length;
if(Q[key]->next==NULL)
printf("学生表为空!\n");
else
{
p=Q[key]->next;
while (p!=NULL)
{
if(p->data.zongfen==k){
printf("查找成功!该学生的信息为:\n");
printf("%d %s %f %f %f %f \n",p->data.xuehao,p->data.xingming,p->data.DB, p->data.DS, p->data.OS,p->data.zongfen);
return;
}
p=p->next;
}
printf("学生表中不存在分数为%f的学生\n",k);
}
}
void prtLH(HNode **Q,int m){
HNode *p;
printf("链地址法所建链表为:\n");
for (int i = 0; i < m; i++) {
p=Q[i]->next;
printf("第%d个链表",i+1);
while (p!=NULL){
printf("->%f",p->data.zongfen);
p=p->next;
}
printf("\n");
}
}
void InsertHash(HNode **Q,st k,int length){
int key,m;
HNode *p,*q;
m=(int)k.zongfen;
key=m%length;
if(Q[key]->next!=NULL){
p=Q[key]->next;
while(p->next!=NULL)
p=p->next;
q=(HNode *) malloc(sizeof (HNode));
q->data=k;
q->next=NULL;
p->next=q;
}
else
{
q=(HNode *) malloc(sizeof (HNode));
q->data=k;
q->next=NULL;
Q[key]->next=q;
}
}
void crateH(LinkList L,int p){
LinkList q;
q=L->next;
while (q) {
InsertHash(HA,q->data,p);
q = q->next;
}
}
LinkList getmin(LinkList L){//取得从指针L开始的链表中记录的最小值
LinkList min;
min=L;
while(L->next){
if(min->data.xuehao>(L->next->data.xuehao)){
min=L->next;
}
L=L->next;
}
return min;//返回较小值的指针
}
//选择排序
void selectsort(LinkList L)//简单选择排序--单链表
{
LinkList j,i=L->next;
int temp;
for(;i->next!=NULL;i=i->next){
j=getmin(i);
if(i->data.xuehao!=j->data.xuehao){
temp=i->data.xuehao;
i->data.xuehao=j->data.xuehao;
j->data.xuehao=temp;
}
}
}
void insertsort(LinkList L)
{
LinkList p,q,pre;
p = L->next->next;
L->next->next = NULL;
while(p)
{
q = p->next;
pre = L;
while(pre->next != NULL &&(strcmp(pre->next->data.xingming,p->data.xingming)<0))
pre = pre->next;
p->next = pre->next;
pre->next = p;
p = q;
}
}
int main(){
char n[20];
int k=100,w,p;
float f;
LinkList L;
menu() ;
while(k!=0) {
printf("请输入选择:");
scanf("%d" ,&k);
if (k == 1) {
L=initList();
printf("初始化成功!\n");
CreatList1(L);
printf("创建成功!\n");
printf("学生表如下:\n");
printlk(L);
}
if (k == 2) {
printf("请输入要插入的位置:");
scanf("%d", &w);
Insert(L, w);
}
if (k == 3) {
printf("请输入要删除的位置:");
scanf("%d", &w);
delx(L, w);
}
if (k == 4) {
printf("请输入要修改的学生的学号:");
scanf("%d", &w);
xiugai(L, w);
}
if (k == 5) {
printf("请输入要查找的学生的姓名:");
scanf("%s", &n);
finddata(L, n);
}
if (k==6) {
printf("哈希函数为hash(key)=key mod p,请输入p的值:");
scanf("%d", &p);
HA = (HNode **) malloc(sizeof(HNode *) * p);
InitHash(p);
crateH(L,p);
prtLH(HA, p);
printf("请输入需要查找的学生的总成绩:");
scanf("%f",&f);
SearchHash(HA,f,p);
}
if (k==7)
{
printf("选择排序(根据学号升序)\n");
selectsort(L);
}
if(k==8){
printf("直接插入排序(根据姓名升序)\n");
insertsort(L);
}
if(k==9){
printf("学生表如下:\n");
printlk(L);
}
}
}
学生管理系统-链表
最新推荐文章于 2024-07-13 16:00:03 发布