当前位置: 首页 > 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—参考杨永明博客
  • [译]Python中的类属性与实例属性的区别
  • 【笔记】你不知道的JS读书笔记——Promise
  • 【刷算法】求1+2+3+...+n
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • maven工程打包jar以及java jar命令的classpath使用
  • Nodejs和JavaWeb协助开发
  • vue-cli在webpack的配置文件探究
  • 创建一种深思熟虑的文化
  • 给Prometheus造假数据的方法
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 回流、重绘及其优化
  • 看域名解析域名安全对SEO的影响
  • 坑!为什么View.startAnimation不起作用?
  • 在Unity中实现一个简单的消息管理器
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​​【收录 Hello 算法】9.4 小结
  • ​ArcGIS Pro 如何批量删除字段
  • ​configparser --- 配置文件解析器​
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #AngularJS#$sce.trustAsResourceUrl
  • (07)Hive——窗口函数详解
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (Python) SOAP Web Service (HTTP POST)
  • (笔试题)分解质因式
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)memcache、redis缓存
  • .gitignore文件设置了忽略但不生效
  • .NET CLR基本术语
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET Core中Emit的使用
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net6使用WebSocket与前端进行通信
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @取消转义
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [Angular 基础] - 指令(directives)
  • [C++]打开新世界的大门之C++入门