学生管理系统-链表

#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);
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的锦鲤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值