学生成绩管理系统(链表的实现)

/*所使用的头文件*/
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>

/*所调用的函数*/
struct LINK_NODE *creat(struct LINK_NODE *head);    //创建新结点
int Count_Node(struct LINK_NODE *head);     //结点计数
void Delete_Node_Num(struct LINK_NODE *head);    //删除第某个结点
//void Delete_Node_Data(struct LINK_NODE *head);    //按数据删除结点
void Cut_Node_In(struct LINK_NODE *head);     //插入结点
void Display_Node(struct LINK_NODE *head);     //显示当前的结点内容
void fun();     /*综合功能函数*/
/*结构体*/
struct LINK_NODE
{
    long id;
    char name[10];
    float yuwen;
    float shuxue;
    float yingyu;
    struct LINK_NODE *next;
};
/*主函数*/
int main()
{
    int ID;
    int keywords;
    printf("\t请输入用户名:");
    scanf(" %d",&ID);
    printf("\t请输入用户密码:");
    scanf(" %d",&keywords);
    if(ID == 123 && keywords == 123)
    {
        fun();
    }
    else
    {
        printf("\a用户名或密码错误!系统拒绝访问!\n\n请按任意键退出!\n\n");
    }
    system("pause");
    return 0;
}

/*综合功能函数*/
void fun()
{
    int c;
    char ch;
    struct LINK_NODE *head = NULL;
    system("cls");
    while(1)
    {
        printf("\n\t\t--\t      欢迎使用学生成绩管理系统        \t --\n");
        printf("\t\t---------------------------------------------------\n");
        printf("\t\t|\t\t  0.输入学生信息\t\t  |\n\n");
        printf("\t\t|\t\t  1.删除数据信息\t\t  |\n\n");
        printf("\t\t|\t\t  2.插入学生信息\t\t  |\n\n");
        printf("\t\t|\t\t  3.显示学生信息\t\t  |\n\n");
        printf("\t\t|\t\t  4.------------\t\t  |\n\n");
        printf("\t\t|\t\t  5.------------\t\t  |\n\n");
        printf("\t\t|\t\t  6.------------\t\t  |\n\n");
        printf("\t\t|\t\t  7.------------\t\t  |\n\n");
        printf("\t\t|\t\t  8.------------\t\t  |\n\n");
        printf("\t\t|\t\t  9.--- 退出 ---\t\t  |\n");
        printf("\t\t---------------------------------------------------\n");
        printf("请选择栏目(输入序号):");
        scanf(" %d",&c);
        getchar();
        switch(c)
        {
        case 0:
            system("cls");
            head = creat(head);
            printf("是否输入数据?(y/n):");
            scanf(" %c",&ch);     //%c前加空格
            while(ch == 'y'||ch == 'Y')     //用于循环输入数据
            {
                head = creat(head);
                printf("是否输入数据?(y/n):");
                scanf(" %c",&ch);     //%c前加空格
            }
            system("pause");
            system("cls");
            break;
        case 1:
            Delete_Node_Num(head);
            system("cls");
            break;
        case 2:
            Cut_Node_In(head);
            system("pause");
            system("cls");
            break;
        case 3:
            system("cls");
            Display_Node(head);
            system("pause");
            system("cls");
            break;
        case 4:
            system("pause");
            system("cls");
            break;
        case 5:
            system("pause");
            system("cls");
            break;
        case 6:
            system("pause");
            system("cls");
            break;
        case 7:
            system("pause");
            system("cls");
            break;
        case 8:
            system("pause");
            system("cls");
            break;
        case 9:
            system("cls");
            printf("\n\t感谢您的使用!\n\n");
            system ("pause");
            exit(0);
        }
    }
}

/*创建新的结点*/
struct LINK_NODE *creat(struct LINK_NODE *head)
{
    char s[10];
    long i;
    float score1,score2,score3;
    struct LINK_NODE *p1 = NULL,*p2 = head;
    p1 = (struct LINK_NODE *)malloc(sizeof(struct LINK_NODE));     //动态申请(分配)内存,用来建立新的结点
    if(!head)     //检查头结点指针是否为空
    {
        head = p1;
        head->next = NULL;
        return head;
    }
    else
    {
        while(p2->next != NULL)
        {
            p2 = p2->next;
        }
        p2->next = p1;
        p1->next = NULL;
        printf("请输入学号:");
        scanf(" %d",&i);     //%d前加空格
        p1->id = i;
        getchar();
        printf("请输入姓名:");
        gets(p1->name);
        printf("请输入数学成绩:");
        scanf(" %f",&score1);     //%d前加空格
        p1->shuxue = score1;
        printf("请输入语文成绩:");
        scanf(" %f",&score2);     //%d前加空格
        p1->yuwen = score2;
        printf("请输入英语成绩:");
        scanf(" %f",&score3);     //%d前加空格
        p1->yingyu = score3;
    }
    return head;
}

/*结点计数*/
int Count_Node(struct LINK_NODE *head)
{
    int i = 1;     //结点数从1开始,是因为头结点不录入数据
    struct LINK_NODE *p = head;
    do
    {
        p = p->next;
        ++i;
    }
    while(p->next != NULL);      //直到指针指向最后一个结点时,停止移动
    return i;     //返回结点个数给函数
}

/*删除第某个结点*/
void Delete_Node_Num(struct LINK_NODE *head)
{
    int i, Count;
    int a = 1;
    struct LINK_NODE *p1 = head,*p2 = NULL;
    system("cls");
    Display_Node(head);
    Count = Count_Node(head);
    printf("\n请输入想要删除第几个数据信息:");
    scanf(" %d",&i);     //%d前加空格
    if(i <= 0)     //头结点不允许删除,若删除将影响接下来的链
    {
        printf("头结点不可删除!!\n");
    }
    else if(i >= Count)     //所要删除的结点数不可以大于链表的长度
    {
        printf("输入结点数有误!!\n");
    }
    else if(i == Count)     //若删除的是尾结点,则将倒数第二个的 next 赋值为 NULL
    {
        while(p1->next)
        {
            p1 = p1->next;
        }
        p2 = head;
        while((p2->next)!=p1)
        {
            p2 = p2->next;
        }
        p2->next = NULL;
        free(p1);     //删除结点后,释放之前所占用的内存
    }
    else     //所删除的结点在链表中(非首非尾)
    {
        while(!(i==a))
        {
            p1 = p1->next;
            ++a;
        }
        p2 = p1->next;
        p1->next = p2->next;
        free(p2);     //删除结点后,释放之前所占用的内存
    }
    printf("操作成功!!\n");
    Display_Node(head);
    system("pause");
}

/*按数据删除结点*/   //功能未建设完全,存在BUG
void Delete_Node_Data(struct LINK_NODE *head)
{
    int num = 0,i = -1;
    struct LINK_NODE *p1 = head, *p2 = NULL;
    printf("\n请输入要删除的数据:");
    scanf(" %d",&num);
    if(head->next == NULL)
    {
        printf("\n链表中不存在任何数据!!\n");
        exit(0);
    }
    p2 = p1->next;
    while(p2->next != NULL)
    {
        p2 = p1->next;
        i = p2->id;
        if(p2->id == num )
        {
            break;
        }
    }
    if(i != num)
    {
        printf("\n链表中没有您要删除的数据!!\n");
        exit(0);
    }
    p1->next = p2->next;
    free(p2);     //结点删除后要释放掉所删除结点占用的内存空间,达到节约内存的目的
}

/*插入结点*/
void Cut_Node_In(struct LINK_NODE *head)
{
    int n = -1, i, Count = Count_Node(head),a;
    float score1,score2,score3;
    system("cls");
    Display_Node(head);
    struct LINK_NODE *p1 = head, *p2 = NULL;
    p2 = (struct LINK_NODE *)malloc(sizeof(struct LINK_NODE));
    if(p2 == NULL)
    {
        printf("内存空间不够,无法添加新的数据!!\n");
        exit(0);
    }
    else
    {
        printf("请输入学号:");
        scanf(" %d",&i);     //%d前加空格
        p2->id = i;
        getchar();
        printf("请输入姓名:");
        gets(p2->name);
        printf("请输入语文成绩:");
        scanf(" %f",&score2);     //%d前加空格
        p2->yuwen = score2;
        printf("请输入数学成绩:");
        scanf(" %f",&score1);     //%d前加空格
        p2->shuxue = score1;
        printf("请输入英语成绩:");
        scanf(" %f",&score3);     //%d前加空格
        p2->yingyu = score3;
        printf("将数据插入为第哪个数:");
        scanf(" %d",&n);
        if(n <= 0)
        {
            printf("此处不可插入数据!!\n");
            exit(0);
        }
        else if(n > Count)
        {
            printf("此处不可插入数据!!\n");
            exit(0);
        }
        for(i = 0; i <= Count; )
        {
            i++;
            if(i == n)
            {
                p2->next = p1->next;
                p1->next = p2;
                break;
            }
            else
            {
                p1 = p1->next;
            }
        }
        printf("操作成功!!\n");
        Display_Node(head);
    }
}

/*显示当前的结点内容*/
void Display_Node(struct LINK_NODE *head)
{
    int i = 1;     //回避头结点(不打印头结点)
    struct LINK_NODE *p = head;
    if(head == NULL)     //若传进来的链表头指针为 NULL,则做出错误判断
    {
        printf("\n用户尚未录入任何数据!!\n");
    }
    else if( p->next == NULL)
    {
        printf("\该系统内未找到任何数据!!\n");
    }
    else
    {
        system("cls");
        printf("当前全部学生信息如下:\n");
        do     //1传进来的链表头指针不为 NULL,则挨个打印,直到尾结点
        {
            p = p -> next;
            printf("\t%d------------------------\n",i);
            printf("\t 学号:%d\n",p->id);
            printf("\t 姓名:%s\n",p->name);
            printf("\t 语文:%.2f\n",p->yuwen);
            printf("\t 数学:%.2f\n",p->shuxue);
            printf("\t 英语:%.2f\n",p->yingyu);
            i++;
        }
        while(p -> next != NULL);
    }
}

猜你喜欢

转载自blog.csdn.net/qinghong_xiao/article/details/51248044