成绩管理小软件

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct stu
{  
         int num;               //学生的学号
         char name[10];         //学生的姓名
         float score;           //学生的成绩
 }STUDENT;                      //存放单个学生信息的结构体类型

typedef struct node
   { 
      STUDENT  data;       //结点的值
      struct node  *next;//指向下一个结点的地址
   }SNODE;

void showmenu()
{          //显示菜单
    printf("    欢迎使用成绩管理小软件\n");
    printf("\t1、创建学生信息\n");
    printf("\t2、插入学生信息\n");
    printf("\t3、删除学生信息\n");
    printf("\t4、显示学生信息\n");
    printf("\t5、退出程序\n");   
}

SNODE *listcreate(SNODE *head,int n)        //n为该班级的实际人数
{                                         //建立班级学生信息
    int i; 
    SNODE *p=NULL,*q=NULL;
    p=head;
    for(i=1;i<=n;i++)       //循环插入n个学生
    {
        printf("\n请输入第%d位学生的信息:\n",i);
        q=(SNODE *)malloc(sizeof(SNODE));
        printf("学号=");scanf("%d",&q->data.num);     
        printf("姓名=");scanf("%s",q->data.name);     
        printf("成绩=");scanf("%f",&q->data.score);   
        q->next=NULL;
        p->next=q;
        p=q;
        head->data.num++;
    }
    return head;
}

//学生结点的插入
SNODE * listinsert(SNODE * pHead,int pos)
{
    SNODE * cur = NULL;
    SNODE * prev = pHead;
    int i;
    cur = (SNODE * )malloc(sizeof(SNODE));
    if(NULL == cur)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    else
    {
        while(pos<1||pos>pHead->data.num+1)
        {
            printf("插入的位置非法,请从新输入!\n");
            printf("有效插入位置为1至班级学生人数+1!\n");
            scanf("%d",&pos);
        }
        printf("请输入学生信息:\n");
        printf("学号=");
        scanf("%ld",&cur->data.num);
        printf("姓名=");
        scanf("%s",cur->data.name);
        printf("分数=");
        scanf("%f",&cur->data.score);
        for(i = 1;i<pos;i++)
        {
            prev = prev->next;
        }
        if(prev->next==NULL)
        {
            prev->next = cur;
            cur->next = NULL;
            pHead->data.num ++;
        }
        else
        {
            cur->next = prev ->next;
            prev->next = cur;
            pHead->data.num++;
        }   
    }
    return pHead;
}

//学生结点的删除
SNODE * listdel(SNODE * pHead,int  pos)
{
    SNODE * prev;
    SNODE * cur;
    int i;
    prev = pHead;
    while(pos<1||pos>pHead->data.num)
    {
        printf("您的输入有误,请从新输入!\n");
        printf("有效删除位置为1至班级学生人数!\n");
        scanf("%d",&pos);
    }
    for(i = 1;i<pos;i++)
    {
        prev = prev->next;
    }
    cur = prev->next;
    if(NULL == cur->next )
    {
        prev->next = NULL;
        free(cur);
        pHead->data.num--;
    }
    else
    {
        prev->next = cur->next;
        free(cur);
        pHead->data.num--;
    }
    return pHead;
}

void listdisplay(SNODE *head)
{
     //显示所有学生信息
    SNODE *p;
    p=head->next;
    printf("班级学生信息如下:\n");
    printf("      学号      姓名      成绩\n");
    while(p!=NULL)
        {
         printf("%10d%10s%10.2f\n",p->data.num,p->data.name,p->data.score);
         p=p->next;
        }
    return;
}

void main()      
{
    SNODE *head=NULL;
    int no,stu_count,pos;
    head=(SNODE *)malloc(sizeof(SNODE));//动态建立第一个结点,作为头结点,head指针指向它,
    head->data.num=0;                  //链表为带头结点的单链表
    head->next=NULL;
    while(1)
    {
        showmenu();
        printf("    请输入你的选择:");
        scanf("%d",&no);
        switch(no)
        {
            case 1: printf("班级信息初始化,按任意键继续……\n");
                    getch();
                    printf("请输入班级学生原始人数:");
                    scanf("%d",&stu_count);
                    head=listcreate(head,stu_count);
                    system("cls");
                    showmenu();
                    listdisplay(head);
                    printf("班级信息初始化已经完成,按任意键继续……\n");
                    getch();
                    system("cls");
                    break;
            case 2:printf("插入前班级信息:\n");
                   listdisplay(head);
                   printf("请输入插入位置:");
                   scanf("%d",&pos);                  
                   head=listinsert(head,pos);
                   printf("插入后班级信息:\n");
                   listdisplay(head);
                   printf("插入已经完成,按任意键继续……\n");
                   getch();
                   system("cls");
                   break;
            case 3:printf("删除前班级信息:\n");
                   listdisplay(head);
                   printf("请输入删除位置:");
                   scanf("%d",&pos);
                   head=listdel(head,pos);
                   printf("删除后班级信息:\n");
                   listdisplay(head);
                   printf("删除已经完成,按任意键继续……\n");
                   getch();
                   system("cls");
                   break;
            case 4:listdisplay(head);
                   printf("显示结果如上所示,按任意键继续……\n");
                   getch();
                   system("cls");
                   break;
            case 5:return;
        }
    }   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值