当前位置: 首页 > news >正文

C语言小程序-基于链表的学生信息管理

程序支持增加、查询、删除、存盘和读取操作

 

一 程序定义和函数声明

  头文件studentsys.h定义如下

/*  student management system by list  */
#ifndef _StudentSys_H
#define _StudentSys_H

#define MAX 25       /* lenth of name string */   
typedef struct _Grade Grade;;
typedef struct StdNode Std;;
typedef struct ListNode *List;

  全局结构体定义

/* 6 courses */
struct _Grade{
    int Chinese;
    int Math;
    int English;
    int Programming;
    int Physic;
    int Geology; 
};

/*  student info */    
struct StdNode {
    int Id;        /* student id */
    char name[MAX];/* student name */
    Grade grades;  /* student grades */
};

struct ListNode {
    Std info;
    List next;
};

 

  函数声明

  /* 1->Add   2->Find   3->Del   4->Brows   5->Store
     6->Read    7->DelAll   8->Cls    9->Quit  */    功能选择键

int AddStd( List L, int Id, char *name, Grade grades );
/* flag:0 by id, 1 by name */
int FindStd(List L, int flag, int Id ,char *name); 
int DeleteStd( List L, int Id );
void PrintInfo( List L );
void PrintAll( List L );
int StoreInfo( List L );
List ReadInfo( );
void DestoryInfo( List L ); 
int IsRepeat( List L, int Id );
void selectInfo();

 

二 源文件studentsys.c

  主体部分,由while循环下的switch分支进行功能选择

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "studentsys.h"

int main(void)
{
    List L; /* Head Node */
    L = (List)malloc(sizeof( struct ListNode ));
    L->next = NULL;
    
    int i, flag;  /*  flag做为查找方式标志, 0由Id, 1由姓名进行搜索  */
    int option, Id = 0; /* option选择功能, init info */
    char name[MAX]= "   ";
    Grade grades;

    printf("                       Starting                       \n");
    printf("          Student Management system, ver:0.101 \n");  
    printf("******************************************************\n");
    printf("                    学生管理系统\n");
    printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
    selectInfo();
    while ( 1 ) {
        scanf("%d", &option);
        switch ( option ) {
            case 1: printf("Please in put id, name, six grades:\n");
                    scanf("%d %s", &Id, name);
                    scanf("%d %d %d %d %d %d", &grades.Chinese, &grades.Math,
                         &grades.English, &grades.Programming,&grades.Physic, 
                         &grades.Geology );
                    if ( AddStd( L, Id, name, grades ) == 1 ) {
                        printf("Added student.\n");
                    } else {
                        printf("Sorry, can't add student\n");
                    }
                    break;
                    
            case 2:    printf("select method: 0 by Id, 1 by name\n");
                    scanf("%d", &flag);
                    printf("Please in put id, name\n");
                    scanf("%d %s", &Id, name); /* notice & */
                    if ( FindStd( L, flag, Id, name ) == 1 ) {
                        printf("found student\n");
                    } else {
                        printf("sorry, can't found student\n");
                    }
                    break;
                    
            case 3: printf("Which id you want ot del: ");
                    scanf("%d", &Id);
                    if ( DeleteStd( L, Id ) ) {
                        printf("Successfully Delete!\n");
                    } else {
                        printf(" Not found!\n");
                    }
                    break;        
                                
            case 4: PrintAll( L ); 
                    break;    
                    
            case 5: if ( StoreInfo( L ) ) {
                            printf("Write successfulluy!\n");
                    } else {
                        printf("Failed to read!\n");
                    } 
                    break;    
                    
            case 6: L = ReadInfo( ); 
                    break;                
            case 7: DestoryInfo( L ); 
                    break;
            case 8: system("cls");
                    selectInfo();
                    break;
            case 9: exit(0); 
                    break;
            default: printf("error!请重新输入!\n");
        }
    }
    return 0;    
}

  

  函数主体,由简单的链表的插入删除遍历实

int AddStd( List L, int Id, char *name, Grade grades ) 
{
List Head
= L; List Cur; if( IsRepeat( L, Id) == 1 ) { printf(" Id repeat!!!\n"); return 0; } /* 链表的插入 */ Cur = (List)malloc(sizeof( struct ListNode )); if ( Cur != NULL ) { Cur->info.Id = Id; strcpy( Cur->info.name, name); Cur->info.grades.Chinese = grades.Chinese; Cur->info.grades.Math = grades.Math; Cur->info.grades.English = grades.English; Cur->info.grades.Programming = grades.Programming; Cur->info.grades.Physic = grades.Physic; Cur->info.grades.Geology = grades.Geology; Cur->next = Head->next; Head->next = Cur; return 1; } else { printf("Failed to malloc!\n"); return 0; } } int FindStd( List L, int flag, int Id , char *name ) { List Cur = L->next; while ( Cur != NULL ) { if( flag == 1 ) { if ( strcmp( name, Cur->info.name ) == 0 ) { PrintInfo(Cur); break; } } else if ( flag == 0 ) { if ( Cur->info.Id == Id ) { PrintInfo(Cur); break; } } Cur = Cur->next; } if ( Cur == NULL ){ return 0; } else { return 1; } } int DeleteStd( List L, int Id ) { List Pre = L; List Cur = Pre->next; if( L->next == NULL ) { printf("Empty Node!\n"); return 0; } else { while ( Cur != NULL ) { if ( Cur->info.Id == Id ) { /* 找到对应编号 */ Pre->next = Cur->next; free(Cur); break; } Pre = Cur; Cur = Cur->next; } if ( Cur == NULL ) { return 0; } else { return 1; } } /* 1 else */ } void PrintInfo( List L ) { List Cur = L; if ( Cur != NULL ) { printf("ID: %d ", Cur->info.Id); printf("Name: %s\n", Cur->info.name); printf("Chinese :%d ", Cur->info.grades.Chinese); printf("Math :%d ", Cur->info.grades.Math); printf("English :%d\n", Cur->info.grades.English); printf("Programming:%d ", Cur->info.grades.Programming); printf("Physic :%d ", Cur->info.grades.Physic); printf("Geology :%d\n", Cur->info.grades.Geology); } } void PrintAll( List L ) { List Cur = L->next; int i = 0; while ( Cur != NULL ) { i++; printf("%d-->Student ", i); PrintInfo( Cur ); Cur = Cur->next; } } void DestoryInfo( List L ) { List Cur, Tmp; Cur = L->next; while ( Cur != NULL ) { Tmp = Cur->next; free( Cur ); Cur = Tmp; } L->next = NULL; printf("删除所有学生信息成功!\n"); } int IsRepeat( List L, int Id ) { List Cur = L->next; int flag = 0; while ( Cur != NULL ) { if ( Cur->info.Id == Id ) {
       flag = 1;
       break;    
     }
     Cur = Cur->next;

}
  return flag;
}

void selectInfo()
{
    printf("Stumansys 请选择:\n");
    printf("(1)---增加学生 (2)---查询学生 (3)---删除学生 \n");
    printf("(4)---查看全部 (5)---记录存盘 (6)---读取信息\n");
    printf("(7)---删除所有 (8)---清除屏幕 (9)---退出系统\n");    
}

 

  文件读写操作

    1. 链表写入文件,每次写一个结构体,直到链表尾。

    2. 文件读取,使用feof(fp)函数判断是否达到文件流尾,否则读取一个结构体,并尾插入链表。

int StoreInfo( List L )
{
    FILE *fp = fopen("student.data", "w");
    List H = L->next;
    const int size = 1;
    int ret = -1; /* default */
    
    if ( fp == NULL ) {
        printf("Failed to open file!\n");
    } else if( H == NULL ) {
        printf("Empty student info!\n");
    } else {        
        /* write list into fp */
        while ( H != NULL ) {
            ret = fwrite( H, sizeof(H->info), size, fp );
            H = H->next;    
        }
        ret = 1;
    }
    fclose( fp );
    return ret;
}

List ReadInfo( )
{
    int i = 0; /* count */
    List L, P, tmp;
    P = L = (List)malloc( sizeof(struct ListNode) );
    FILE *fp = fopen("student.data", "r");
    
    if ( fp == NULL ) {
        printf("Failed to read file!\n");
        return NULL;
    } 
    /* 假如文件为空,检查文件结束符 feof在到达文件流尾返回非零值 */
     if ( feof(fp) != 0 ) {
        tmp = (List)malloc( sizeof(struct ListNode) );
        fread( tmp, sizeof(tmp->info), 1, fp);
        if( feof(fp) ) {
            printf("读取失败!文件为空!\n");
            free(tmp);
        }
        return(NULL);
    }

    while ( feof(fp) == 0 ) {
        tmp = (List)malloc( sizeof(struct ListNode) ); 
        fread( tmp, sizeof(tmp->info), 1, fp);
        printf("正在读取第%d个数据\n", ++i);
        if ( feof(fp) != 0 ) {
            /* reached end */
            free(tmp); break;
        }
        /*  List tail insert */ 
        P->next = tmp;
        P = tmp;
        P->next = NULL;
    }
    fclose(fp);
    printf("Read successfulluy!\n");
    return L;
}

 

转载于:https://www.cnblogs.com/justLittleStar/p/10398659.html

相关文章:

  • js基础
  • 前嗅ForeSpider教程:创建模板
  • spring cloud构建互联网分布式微服务云平台-SpringCloud集成项目简介
  • MySQL无法启动几种常见问题小结
  • C语言笔记(第一章:C语言编程)
  • sqoop使用手册--mysql配置
  • width 值 max-content、fill-available、min-content 对应作用
  • multimap详讲
  • 剑指offer-树的子结构
  • JavaScript HTML DOM
  • js提交表单错误:document.form.submit() is not a function
  • React as a UI Runtime(五、列表)
  • 如何进阶一名有竞争力的程序员?
  • 实现简单的正则表达式引擎
  • 读写配置文件模块configparser—参考杨永明博客
  • 【5+】跨webview多页面 触发事件(二)
  • Angular6错误 Service: No provider for Renderer2
  • bootstrap创建登录注册页面
  • go append函数以及写入
  • Laravel核心解读--Facades
  • ng6--错误信息小结(持续更新)
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python实现BT种子转化为磁力链接【实战】
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • tensorflow学习笔记3——MNIST应用篇
  • Vue UI框架库开发介绍
  • 翻译--Thinking in React
  • - 概述 - 《设计模式(极简c++版)》
  • 规范化安全开发 KOA 手脚架
  • 记录一下第一次使用npm
  • 前端代码风格自动化系列(二)之Commitlint
  • 全栈开发——Linux
  • 听说你叫Java(二)–Servlet请求
  • 找一份好的前端工作,起点很重要
  • 转载:[译] 内容加速黑科技趣谈
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (动态规划)5. 最长回文子串 java解决
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (论文阅读11/100)Fast R-CNN
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)memcache、redis缓存
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)从 Java 代码到 Java 堆
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .jks文件(JAVA KeyStore)
  • .net 7 上传文件踩坑