C语言链表实现学生信息管理系统程序设计

本文实例为大家分享了C语言链表实现学生信息管理系统的具体代码,供大家参考,具体内容如下

事先存入的数据:

菜单

创建链表并倒序输出

输出链表中的全部信息

写入信息并保存至文件中(覆盖原有文件)

随机读取

指定查找

添加信息

指定删除

特殊查找

特殊删除

退出系统

#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<iomanip>
#include<fstream>
#include<time.h>
int length=0;
using namespace std;
char a[10],b[10],c[10],d[10],e[10],f[10],g[10];
//定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩
typedef struct StuNode
{
    char grad[10];//学号
    char name[10];//姓名
    char spec[10];//专业
    char stu_class[10];//班级 
    int score1;
    int score2;
    int score3;
    struct StuNode *next;
}student, *StuLink;
 
void Sort(StuLink &head)//从小到大进行冒泡排序 
{
    StuLink tmp,pre,p,q;
    if (head->next)
    {
        p = head->next->next;
        head->next->next = NULL;
        while (p)
        {
            pre = head;  //pre是q的前驱
            q = pre->next; 
            while (q && strcmp(q->grad,p->grad)<0)//从链表第二个结点开始找比当前插入值大的结点
            {
                pre = pre->next;
                q = q->next; 
            }
            tmp = p->next;//将p插入到结点pre和q之间
            p->next = q;
            pre->next = p; 
            p = tmp;
        }
    }    
} 
 
student *CreateList()//初始化:创建链表 
{
    void Output(StuLink &p);
    StuLink head = (student*)malloc(sizeof(student));
    StuLink p,q;
    p = head;
    q = head;
    char grad[10];//学号
    char name[10];//姓名
    char spec[10];//专业
    char stu_class[10];//班级 
    int score1;
    int score2;
    int score3;
    FILE *r= fopen("2.txt","r");
    if(r==NULL)
    {
        printf("打开文件失败!");
        return NULL;
    }
    fscanf(r,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题 
    while(fscanf(r,"%s%s%s%s%d%d%d",grad,name,spec,stu_class,&score1,&score2,&score3)!=EOF)
    {
        q = (student*)malloc(sizeof(student));
        strcpy(q->grad,grad);
        strcpy(q->name,name);
        strcpy(q->spec,spec);
        strcpy(q->stu_class,stu_class);
        q->score1 = score1;
        q->score2 = score2;
        q->score3 = score3;
        p->next = q; 
        p = q;
        length++;
    }
    p->next = NULL;
    Sort(head);
    
    //倒序输出 
    StuLink k = head,t;
    while(k->next)  
        k = k->next;
    while(k!=head)
    {    //倒序输出 
        t = head;
        while(t->next!=k)
            t = t->next;//t为k前驱 
        k = t;
    }
    return head;
}
 
 
void Output(StuLink &p)//输出信息 
{
    printf("%5s %-5s %-3s %s %3d %3d %3d\n",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
}
 
void Print_List(StuLink &head)//打印整个链表 
{
    StuLink p = head->next;
    while(p)
    {
        Output(p);
        p = p->next;
    }
}
 
void Save(StuLink &head)//写入文件。
{    
    StuLink p = (student*)malloc(sizeof(student)),q = head->next;
    char grad[10],name[10],spec[10],stu_class[10];
    int score1,score2,score3;
    printf("请输入学生信息:\n");
    scanf("%s%s%s%s%d%d%d",p->grad,p->name,p->spec,p->stu_class,&p->score1,&p->score2,&p->score3); 
    FILE *w =fopen("2.txt","a");
    if(w==NULL)
    {
        printf("打开文件失败!\n");
        return;
    }
    else printf("写入成功!\n"); 
    fprintf(w,"\n%s %s      %s       %s  %d      %d         %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
    fclose(w);
    //存入链表 
    p->next = q;
    head->next = p;
    Sort(head);
}
 
void Fetch(StuLink &H)//随机读取某个学生的信息。 
{
    StuLink p = H->next;
    int i = time(NULL) % length;
    int j = i;
    while(j)
    {
        p = p->next;
        j--;
    }
    printf("第%d名学生\n",i+1);
    printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
    Output(p);
}
 
student *Search_num(StuLink &H) 
{    //查找指定学号的学生,返回指向该学生结点的指针。
    char grad[10];
    printf("请输入查询信息的学号:"); 
    scanf("%s",grad);
    StuLink p = H->next;
    while(p)
    {
        if(strcmp(p->grad,grad)==0) 
            return p;
        p = p->next;
    }
    return NULL;
}
 
void InsertList(StuLink &H)
{    //在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。 
    StuLink p = H->next, q = H;
    StuLink insert = (student*)malloc(sizeof(student));
    printf("请输入学生信息:\n");
    scanf("%s%s%s%s%d%d%d",insert->grad,insert->name,insert->spec,insert->stu_class,&insert->score1,&insert->score2,&insert->score3); 
    
    while(p)
    {
        if(strcmp(p->grad,insert->grad) > 0 ) 
        {
            q->next = insert;//应插入q和p之间
            insert->next = p;
            break;
        }
        q = q->next;//q是p的前驱 
        p = p->next;
    }    
    if(!p)//insert的学号大于所有已知值 
    {
        q->next = insert;
        insert->next = NULL;
    }
    p = H->next;
    printf("\n");
    Print_List(H);
}
 
void Delete_num(StuLink &H)//从链表中删除指定学号的学生。 
{
    StuLink p = H->next, q = H;
    char grad[10]; 
    printf("请输入想删除的学生的学号:\n");
    scanf("%s",grad); 
    while(p)
    {
        if(strcmp(p->grad,grad)==0)   
        {
            q->next = p->next;
            free(p);
            break;
        }
        q = q->next;
        p = p->next;
    }
    FILE *w =fopen("2.txt","w");
    p=H->next;
    while(p)
    {
        fprintf(w,"%5s %-5s %-3s %s %3d %3d %3d\n",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
        p = p->next;
    }
    fclose (w);
    Print_List(H);
}
 
student *Search_major_subject_score(StuLink &H)
{    //查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
    char spec[10];
    float score;
    StuLink p = H->next;
    int lesson;
    printf("请输入专业、课程序号和门限分数:\n"); 
    scanf("%s%d%f",spec,&lesson,&score);
    while(p)
    {
        if(strcmp(p->spec,spec)==0)
            if(lesson==1 && p->score1<score || lesson==2 && p->score2<score || lesson==3 && p->score3<score) 
                return p;
        p = p->next;
    }
    return NULL;
}
 
void Delete_major_subject(StuLink &H)
{    //从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
    char spec[10];
    float score;
    StuLink p = H->next, q = H;
    int lesson,flag = 0;
    printf("请输入专业、课程序号和门限分数:\n"); 
    scanf("%s%d%f",spec,&lesson,&score);
    while(p)
    {    
        if(strcmp(p->spec,spec)==0 && lesson == 1 && p->score1 < score) //  cs 1 94
        {
            Output(p);
            q->next = p->next;
            free(p); 
            p = q->next;
            flag = 1;
        }
        else if(strcmp(p->spec,spec)==0 && lesson == 2 && p->score2 < score) //  cs 1 94
        {
            Output(p);
            q->next = p->next;
            free(p); 
            p = q->next;
            flag = 1;
        }
        else if(strcmp(p->spec,spec)==0 && lesson == 3 && p->score3 < score) //  cs 1 94
        {
            Output(p);
            q->next = p->next;
            free(p); 
            p = q->next;
            flag = 1;
        }
        else
        {
            q = p;
            p = p->next;            
        }
    }
    if(flag==0) printf("不存在此学生!\n");    
    else printf("成功删除\n"); 
    FILE *w =fopen("2.txt","w");
    p=H->next;
    while(p)
    {
        fprintf(w,"%5s %-5s %-3s %s %3d %3d %3d\n",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
        p = p->next;
    }
    fclose (w);
    Print_List(H);
}
 
void write(StuLink &H)//写入其他文件 
{
    StuLink p = H->next;
    FILE *w = fopen("other.txt","w");
    fprintf(w,"%s %s %s %s %s %s %s",a,b,c,d,e,f,g);
    while(p)
    {
        fprintf(w,"\n%s %s      %s       %s  %d      %d         %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
        p = p->next;
    } 
    fclose(w);
    printf("写入成功!"); 
}
 
char menu()
{
    char ch1;
    printf("  \t\t\t\t        欢迎访问学生信息登记系统!                \n");
    printf("\t\t\t ___________________________________________________________\n");
    printf("\t\t\t\t\t 1  Creatlist 写入信息创建链表并倒序输出\n");
    printf("\t\t\t\t\t 2  Output 输出全部信息\n");
    printf("\t\t\t\t\t 3  save 保存文件\n");
    printf("\t\t\t\t\t 4  Fetch 随机读取\n");
    printf("\t\t\t\t\t 5  Search num 指定查找\n");
    printf("\t\t\t\t\t 6  Insertlist 添加信息 \n");
    printf("\t\t\t\t\t 7  Delete num 指定删除\n");
    printf("\t\t\t\t\t 8  Search_major _subject_score 特殊查找\n");
    printf("\t\t\t\t\t 9  Delete_major _subject_score 特殊删除\n");
    printf("\t\t\t\t\t 10 Exit 退出系统\n");
    printf("\t\t\t ___________________________________________________________\n");
}
 
void read(StuLink &head)//读取文件函数 
{
    StuLink p = (student*)malloc(sizeof(student)),q = head->next;
    char grad[10],name[10],spec[10],stu_class[10];
    int score1,score2,score3;
    FILE *w =fopen("2.txt","a");
    if(w==NULL)
    {
        printf("打开文件失败!\n");
        return;
    }
    else 
{
    StuLink p = head->next;
    while(p)
    {
        Output(p);
        p = p->next;
    }
    printf("输出成功!\n"); 
    fprintf(w,"\n%s %s      %s       %s  %d      %d         %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
}
    fclose(w);
    //存入链表 
}
 
int main()
{    
    StuLink H = CreateList(),temp;
    int k;
    menu();
    scanf("%d",&k);
    k = int(k);
    while(k)
    {
        k = int(k);
        switch(k)
        {
            case 0: 
                break;
            case 1: 
                {
                StuLink head = (student*)malloc(sizeof(student));
                StuLink p,q;
                p = head;
                q = head;
                char grad[10];//学号
                char name[10];//姓名
                char spec[10];//专业
                char stu_class[10];//班级 
                int score1;
                int score2;
                int score3;
                FILE *r= fopen("2.txt","r");
                if(r==NULL)
                {
                    printf("打开文件失败!");
                }
                fscanf(r,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题 
                while(fscanf(r,"%s%s%s%s%d%d%d",grad,name,spec,stu_class,&score1,&score2,&score3)!=EOF)
                {
                    q = (student*)malloc(sizeof(student));
                    strcpy(q->grad,grad);
                    strcpy(q->name,name);
                    strcpy(q->spec,spec);
                    strcpy(q->stu_class,stu_class);
                    q->score1 = score1;
                    q->score2 = score2;
                    q->score3 = score3;
                    p->next = q; 
                    p = q;
                    length++;
                }
                p->next = NULL;
                Sort(head); 
                StuLink k = head,t;
                while(k->next)  
                k = k->next;
                printf("倒序输出:\n 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
                while(k!=head)
            {    //倒序输出 
                t = head;
                while(t->next!=k)
                t = t->next;//t为k前驱 
                Output(k);
                k = t;
            }
        }
                menu();
                break;
            case 2:    
                Print_List(H);
                menu();
                break;
            case 3: 
                Save(H);
                menu();
                break;
            case 4: 
                Fetch(H);
                menu();
                break;
            case 5: 
                temp = Search_num(H);
                if(temp)
                    {    
                        printf("指针为:%d\n",temp); 
                        printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
                        Output(temp);
                    }
                else 
                    printf("不存在此学生!\n");
                menu();
                break;
            case 6: 
                InsertList(H);
                menu();
                break;
            case 7: 
                Delete_num(H);
                menu();
                break;
            case 8:
                temp = Search_major_subject_score(H);
                if(temp)
                    {
                        printf("指针为:%d\n",temp); 
                        printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
                        Output(temp);
                    }
                else 
                    printf("不存在此学生!\n");
                    menu();
                break;
            case 9:
                Delete_major_subject(H); 
                menu();
                break;
            case 99:
                read(H);
                menu();
                break;
            case 10:
                printf("\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");     //退出提示
                printf("             Goodbye!         \n");
                printf("    ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
                exit(0);//将程序退出 
            default:
                printf("输入有误,请重新输入!\n"); 
        } 
        printf("请输入选项:");
        scanf("%d",&k);
    }
    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言单链表版学生信息管理系统

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 代码: //以单链表作为存储结构,设计和实现课程成绩管理的完整程序. //程序包括如下功能. //1.建立学生成绩表,包含学生的学号.姓名和成绩. //2.可以显示所有学生成绩. //3.可以计算学生的总数. //4.可以按学号和序号查找学生. //5.可以在指定位置插入学生成绩数据. //6.可以删除指定位置的学生数据. //7.可以把学生成绩按从高到低的顺序排序. //作者: yinlinqvan //操作系统:

  • C语言实现学生信息管理系统(单链表)

    本文实例为大家分享了C语言实现学生信息管理系统的具体代码,供大家参考,具体内容如下 /*copyright(c)2016.烟台大学计算机学院 * All rights reserved, * 文件名称:text.Cpp * 作者:吴敬超 * 完成日期:2016年7月1日 * 版本号:codeblock * * 问题描述: 学生信息管理系统 * 输入描述: * 程序输出: 输出结果 */ #include <stdio.h> #include <stdlib.h> #include

  • c语言实现的货物管理系统实例代码(增加删除 查找货物信息等功能)

    复制代码 代码如下: #include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>        /*屏幕操作函数库*/ /*主管权限数据格式化*/#define HEADER1_zg "-----------------------------货物管理系统(主管)--------------------------------\n"#define H

  • C语言版学生信息管理系统

    本文实例为大家分享了C语言版学生信息管理系统的具体代码,供大家参考,具体内容如下 一.题目分析 1.功能概述 1)查询学生信息 2)添加学生信息 3)修改学生信息 4)删除学生信息 5)刷新学生信息 6)保存学生信息 7)输出当前学生信息 2.题目要求: 1)使用结构体建立学生信息体制 2)实现七大基本功能 3)采用文件存储学生信息 二.算法构造 1.难点解析----对文件的操作 1.1文件读取 FILE * fp; if ((fp = fopen(filename, "r")) ==

  • C语言职工信息管理系统源码

    本文实例为大家分享了C语言职工信息管理系统的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct worker { char ID[20];//工号 char name[20];//姓名 char sex[5];//性别 char born[20];//生日 char edu[20];//学历 char po

  • C语言学生信息管理系统设计与实现

    本文实例为大家分享了C语言学生信息管理系统的具体代码,供大家参考,具体内容如下 #include"stdio.h" //标准的输入输出函数文件头部说明 #include"math.h" // 数学函数头部说明 #include"string.h" #include"stdlib.h" //通过该函数头部里的函数,改变控制台的背景和颜色 #include"windows.h" //头文件声明,下文用到了改变控

  • 学生信息管理系统C语言版

    C语言学生信息管理系统包括以下功能: 1.学生信息的整体注册 2.学生信息的修改 3.学生成绩信息的录入 4.学生信息的添加 5.恢复误删的学生信息 6.学生信息的删除 7.密码修改保存函数 8.学生信息的查询 9.密码修改函数 10.学生信息管理系统的菜单函数 #include "stdio.h" #include "malloc.h" #include "string.h" #include "stdlib.h" #inc

  • C语言实现歌曲信息管理系统

    本文实例为大家分享了C语言实现歌曲信息管理系统的具体代码,供大家参考,具体内容如下 系统功能:该系统以菜单方式工作,歌曲信息包括:歌名.演唱者.作词.作曲.所属专辑.出版时间.出版公司.试设计一歌厅歌曲管理系统,使之能提供以下功能:歌曲信息录入.修改.插入.删除功能:歌曲排序浏览功能:按歌名查询.按演唱者查询等功能. 完整的实现代码如下: #include "stdio.h" #include "stdlib.h" #include "string.h&q

  • C语言学生信息管理系统小项目

    本文为大家分享了C语言学生信息管理系统小项目,供大家参考,具体内容如下 /* 运行环境:我是在linux里面用gcc编译的,在windows里应该也能运行,用的一些文件库函数都是c标准库,没有用linux的系统调用(纠正一下:system("clear")这个系统调用是linux的,windows里面用system("cls") ) (1)问题描述 学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等.试设计一学生信息管理系统,使之能提供以下功

  • C语言数据结构之学生信息管理系统课程设计

    本文实例为大家分享了学生信息管理系统设计的具体代码,供大家参考,具体内容如下 建立一个动态链表,链表中每一结点包括:学号.姓名.性别.年龄.成绩.程序能实现以下功能: 建立链表      显示链表      查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息.      删除链表中指定学号的结点.      在链表中指定的位置插入一个新结点(学号不能和其他结点重复). 要求:程序运行中,先显示实现以上功能所构成的菜单,然后根据选项调用相应程序

随机推荐