<数据结构与算法><C>单向链表结构设计学生信息管理系统——附:源码、简单的Makefile、思维导图

来源:互联网 发布:流星网络电视看不了 编辑:程序博客网 时间:2024/06/05 23:56

作者:wsg

时间:2017年8月26日


打包好的源码在资源页:http://download.csdn.net/download/wu9797/10043298


先来一张整体结构思维导图表达此系统的大致结构:

接下来是程序运行时的主界面:


此工程我拆分成了一个主函数源文件和若干函数的源文件,文件组织结构如下:


接下来是头文件sims.h源码:

#ifndef _SIMS_H_#define _SIMS_H_#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdbool.h>//0.设计节点typedef struct student{char id[20];   //学号char name[20]; //姓名int age;   //年龄char nu[13];  //电话float score;  //成绩struct student *next;  //指针}list_stu, *ptr_stu;//函数的声明ptr_stu init_list(void); //初始化ptr_stu creat_node(void); //创建节点void interface(void); //主界面void insert_node(ptr_stu head, ptr_stu new); //插入新结点void display_node(ptr_stu head); //显示链表void choice(ptr_stu head); //选择相应的功能void delete_node(ptr_stu head, char id_input[]); //删除节点void modify_node(ptr_stu head, char id_input[]); //更改信息bool is_empty(ptr_stu head); //判断空表void clear_list(ptr_stu head); //清空链表void find_node(ptr_stu head, char id_input[]); //查找节点 #endif


再者,附上简单的Makefile:

TARGET = ./bin/simsFROMA = ./usr/*.c ./src/*.cINC = -I./inc/ -L./lib/vpath %.c = src/:usr/vpath %.h = inc/CC = gccCS = -WallA = $(CS) $(INC)$(TARGET):$(FROMA)$(CC) $(FROMA) -o $@ $(A)clean:rm $(TARGET)do:./$(TARGET)

有点冗杂,但是确实是很简单的了。

①若输入make命令,则编译。

②若输入make clean命令,则恢复到编译前的状态。

③若输入make do命令,则执行这个程序


下面是主要的源码:

1、主函数源码<sims.c>:

#include "sims.h"/*====学生信息管理系统--单向链表结构============*//* *作者:wsg*时间:2017年8月26日 */int main(int argc, char *argv[]){printf("\n\t\t\033[1;32m学生信息管理系统\033[0;0m\n");ptr_stu head = init_list(); //链表初始化,创建无数据的头结点choice(head); //调用选择函数return 0;}/*  使用方法:"\033[40m   \033[0m"   *\033[0m   关闭所有属性  *\033[1m   设置高亮度  *\033[4m   下划线  *\033[5m   闪烁  *\033[7m   反显  *\033[nA   光标上移n行  *\033[nB   光标下移n行  *\033[nC   光标右移n行  *\033[nD   光标左移n行  *\033[y;xH设置光标位置  *\033[2J   清屏  *\033[K   清除从光标到行尾的内容  *\033[s   保存光标位置  *\033[u   恢复光标位置  *\033[?25l   隐藏光标  *\033[?25h   显示光标*背景色:*40: 黑色 black*41:深红 red*42:绿色 green*43:黄色 yellow*44:蓝色 blue*45:紫色 purple*46:青靛色 Indigo blue*47:白色 white*字体色:*30:黑色*31:红色*32:绿色*33:黄色*34:蓝色*35:紫色*36:青靛色*37:白色 */

2、<init.c>:

#include "sims.h"//1.初始化,创建头结点ptr_stu init_list(void){ptr_stu head = malloc(sizeof(list_stu));if(head != NULL){head->next = NULL;}return head;}
3、<creat.c>:

#include "sims.h"//2.创建一个节点ptr_stu creat_node(void)  {ptr_stu new = malloc(sizeof(list_stu));if (new != NULL){printf("请输入学号:");scanf("%s", new->id);printf("请输入姓名:");scanf("%s", new->name);printf("请输入年龄:");scanf("%d", &new->age);printf("请输入电话:");scanf("%s", new->nu);printf("请输入分数:");scanf("%f", &new->score);new->next = NULL;}return new;}

4、<insert.c>:

#include "sims.h"//3.插入结点void insert_node(ptr_stu head, ptr_stu new){if(new == NULL || head == NULL)return;ptr_stu p = head;while(p->next != NULL){if(strcmp(p->next->id, new->id) == 0) //判断学号是否有冲突{printf("\033[41m学号重复!录入失败!\033[0m\n");return;}p = p->next;}p->next = new;}
5、<display.c>:

#include "sims.h"//4.遍历显示void display_node(ptr_stu head){if(head->next == NULL){printf("\033[41m系统为空,无学生信息!\033[0m\n");return;}printf("\033[34m*********\033[0m \033[44m学生信息:\033[0m \033[34m*************\033[0m\n");printf("\033[40m学号\t     姓名\t  年龄\t电话\t     成绩\033[0m\n");ptr_stu p = head;while(p->next != NULL){p = p->next;printf("\033[31;40m%-12s\033[0m\033[40m %-12s %-4d  %-12s %-4.1f\033[0m\n", p->id, p->name, p->age, p->nu, p->score);}printf("\033[34m*********\033[0m \033[44m可爱的分割线!\033[0m \033[34m*********\033[0m\n");}
6、<interface.c>:

#include "sims.h"//主界面void interface(void){printf("\n===============\033[42m请选择功能(0-6):\033[0m===============\n");printf("\t \033[40;31m 1. \033[0m \033[33m新建一个学生的信息。\033[0m\n");printf("\t \033[40;31m 2. \033[0m \033[36m删除某个学生的信息。\033[0m\n");printf("\t \033[40;31m 3. \033[0m \033[32m显示全部学生的信息。\033[0m\n");printf("\t \033[40;31m 4. \033[0m \033[34m查找某个学生的信息。\033[0m\n");printf("\t \033[40;31m 5. \033[0m \033[35m修改某个学生的信息。\033[0m\n");printf("\t \033[40;31m 6. \033[0m \033[31m清空所有学生的信息。\033[0m\n");printf("\t \033[40;31m 0. \033[0m \033[37m退出系统。\033[0m\n");printf("\033[42m 请输入:\033[0m ");}
7、<choice.c>:

#include "sims.h"//功能选择void choice(ptr_stu head){while(1){interface(); //调用主界面函数char choice[10];   //scanf("%s", choice); printf("\033[37m===============================================\033[0m\n\n");if(strcmp(choice, "0") == 0) //退出系统{break;}else if(strcmp(choice, "1") == 0) //输入学生的信息{//建立一个新节点ptr_stu new = creat_node(); //将上一步建立的节点插入到链表中去insert_node(head, new);continue;}else if(strcmp(choice, "2") == 0) //删除某个学生的信息{if(is_empty(head)){printf("\033[41m系统为空,无学生信息!无法删除!\033[0m\n");continue;}char id_input[20];printf("请输入要删除学生的学号:");scanf("%s", id_input);delete_node(head, id_input);continue;}else if(strcmp(choice, "3") == 0) //显示学生的信息{display_node(head);continue;}else if(strcmp(choice, "4") == 0) //查找某个学生的信息(以学号){if(is_empty(head)) //为空链表的情况{printf("\033[41m系统为空,无学生信息!\033[0m\n");continue;}char id_input[20];memset(id_input, '\0', (sizeof(id_input)/sizeof(id_input[0])));printf("请输入学号查找:");scanf("%s", id_input);find_node(head, id_input);continue;}else if(strcmp(choice, "5") == 0) //修改某个学生的信息{if(is_empty(head)){printf("\033[41m系统为空,无学生信息!无法修改!\033[0m\n");continue;}char id_input[20];printf("请输入要修改学生的学号:");scanf("%s", id_input);modify_node(head, id_input);continue;}else if(strcmp(choice, "6") == 0){if(is_empty(head)){printf("\033[41m系统为空,无学生信息!无需清空!\033[0m\n");continue;}clear_list(head);printf("\033[1;32m已清空所有学生信息!\033[0m\n");}else //输入的数不在0-6之间{printf("\033[41m输入错误,请重新输入!\033[0m\n");continue;}}}
8、<delete.c>:
#include "sims.h"//5.删除某个学生的信息void delete_node(ptr_stu head, char id_input[]){ptr_stu p = head;while(p->next != NULL)  //p为要删除的节点的前一个节点{if(strcmp((p->next)->id, id_input) == 0) //strcmp相同为0{ptr_stu q = p->next;  //q为要删除的节点p->next = q->next;q->next = NULL;free(q);printf("\033[1;32m删除成功!\033[0m\n");  return;}p = p->next;}printf("\033[41m系统没有录入该学号!\033[0m\n");return;}

9、<modify.c>:

#include "sims.h"//6.信息修改void modify_node(ptr_stu head, char id_input[]){ptr_stu p = head;while(strcmp((p->next)->id, id_input) == 0){printf("\t\033[40m选择要更改的信息:\033[0m\n");printf("\t\033[40m1.更改姓名。\033[0m\n\t\033[40m2.更改年龄。\033[0m\n\t\033[40m3.更改电话。\033[0m\n\t\033[40m4.更改成绩。\033[0m\n\t\033[40m0.修改完成。\033[0m\n");ptr_stu q = p->next;char choice[10];printf("请输入(0-4):");scanf("%s", choice);if(strcmp(choice, "0") == 0)return;else if(strcmp(choice, "1") == 0){printf("将姓名%s改为:", q->name);memset(q->name, '\0', (sizeof(q->name)/sizeof(q->name[0])));scanf("%s", q->name);printf("\033[1;32m修改姓名成功!修改后的姓名为:%s\033[0m\n", q->name);continue;}else if(strcmp(choice, "2") == 0){printf("将年龄%d改为:", q->age);scanf("%d", &(q->age));printf("\033[1;32m年龄修改成功!修改后的年龄为:%d\033[0m\n", q->age);continue;}else if(strcmp(choice, "3") == 0){printf("将电话号码%s改为:", q->nu);memset(q->nu, '\0', (sizeof(q->nu)/sizeof(q->nu[0])));scanf("%s", q->nu);printf("\033[1;32m修改电话号码成功!修改后的电话号码为:%s\033[0m\n", q->nu);continue;}else if(strcmp(choice, "4") == 0){printf("将成绩%.1f改为:", q->score);scanf("%f", &(q->score));printf("\033[1;32m修改成绩成功!修改后的成绩为:%.1f\033[0m\n", q->score);continue;}else{printf("\033[41m输入错误,请重新输入!\033[0m\n");continue;}}//没有此学生信息printf("\033[41m系统没有录入该学号!\033[0m\n");return;}
10、<empty.c>:

#include "sims.h"//7.判断空表bool is_empty(ptr_stu head){return head->next == NULL;}
11、<clear.c>:

#include "sims.h"//8.清空链表void clear_list(ptr_stu head){while(head->next != NULL){ptr_stu q = head->next;head->next = head->next->next;free(q);}}
12、<find.c>:

#include "sims.h"//9.查询某个学生的信息void find_node(ptr_stu head, char id_input[]){ptr_stu p = head;while(p->next != NULL){ptr_stu q = p->next;if(strcmp(q->id, id_input) == 0){printf("\033[1;32m学号为%s的学生信息:\033[0m\n", q->id);printf("\033[40m学号\t     姓名\t  年龄\t电话\t     成绩\033[0m\n");printf("\033[31;40m%-12s\033[0m\033[40m %-12s %-4d  %-12s %-4.1f\033[0m\n", q->id, q->name, q->age, q->nu, q->score);return;}p = p->next;}//没有此学生信息printf("\033[41m系统没有录入该学号!\033[0m\n");return;}
代码至此完!!!!!

下面来看看完整的思维导图:


最后的最后,来几幅程序实际的效果图:


新建学生信息:



显示全部学生信息:


删除某个学生的信息:


查找某个学生:


修改某位学生信息:



清空数据:


阅读全文
0 0
原创粉丝点击