我在之前的基础上将联系人的表的分配方式改为动态内存分配,并使用了文档来保证管理系统的保存。完整工程文件链接如下 学生管理系统,比较简单,在日后会更新链表的版本。方便大家参考
manage.h
#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100 //数组最大元素个数
#define INIT 3//初始化分配空间个数
#define CATCH 2//不够再加
typedef struct Stu_Node//学生信息表(其余信息请自己添加)
{
char name[5];
int age;
char address[15];
char tel[12];
}Stu_Node;
//静态实现
//typedef struct Stu
//{
// Stu_Node stu_node[MAX];
// int num;//记录大小
//}Stu;
//动态实现
typedef struct Stu
{
int num;//记录长度
int sz;//记录最大大小
Stu_Node* stu_node;
}Stu;
void Initstu(Stu *pc);//初始化学生表信息
void Add(Stu* pc);//加入新的人员信息
int Find_Stu(Stu* pc, char name[]);//查询人员的内部逻辑
void Search(Stu* pc, char name[]);//查询人员
void Delete(Stu* pc, char name[]);//删除人员
void Sort(Stu* pc);//人员排序
void Modify(Stu* pc, char name[]);//修改指定人信息
void clear(Stu* pc);//清空表
void clear_list(Stu* pc);//删除所有联系人
manage_system.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"manage.h"
//静态实现
//void Initstu(Stu* pc)//初始化学生表
//{
// pc->num = 0;
// int i = 0;
// int size = sizeof(pc->stu_node[0]);
// memset(pc->stu_node, 0, size * 100);
//}
//动态实现
void Initstu(Stu* pc)
{
pc->num = 0;
pc->stu_node = (Stu_Node*)malloc(sizeof(Stu_Node) * INIT);
if (pc->stu_node==NULL)
{
perror("Initstu::malloc");
}
pc->sz = INIT;
//把数据导入
FILE* fp = fopen("contact.txt", "r");
if (fp == NULL)
{
perror("fopen::");
}
else
{
int i = 0;
while (fscanf(fp, "%s %d %s %s", pc->stu_node[i].address, &pc->stu_node[i].age, pc->stu_node[i].name, pc->stu_node[i].tel)!=EOF)
{
i++;
pc->num++;
if (pc->num == pc->sz)
{
Stu_Node* ptr = (Stu_Node*)realloc(pc->stu_node, sizeof(Stu_Node) * (pc->sz + CATCH));
if (ptr == NULL)
{
perror("realloc::fscanf::");
}
else
{
printf("增容成功!\n");
pc->stu_node= ptr;
pc->sz += 2;
}
}
}
fclose(fp);
fp = NULL;
}
}
//静态实现
//void Add(Stu* pc)//加入新的人员信息
//{
// int i = pc->num;
// if (i == MAX)
// {
// printf("信息表已满,无法继续填充信息!\n");
// }
// else
// {
// printf("请输入名字>");
// scanf("%s", pc->stu_node[i].name);
// printf("请输入年龄>");
// scanf("%d", &pc->stu_node[i].age);
// printf("请输入住址>");
// scanf("%s", pc->stu_node[i].address);
// printf("请输入电话>");
// scanf("%s", pc->stu_node[i].tel);
// }
// pc->num++;
//}
//动态实现
Stu_Node* catch (Stu* pc)
{
Stu_Node* ptr = (Stu_Node*)realloc(pc->stu_node, sizeof(Stu_Node) * (pc->sz + CATCH));
if (ptr == NULL)
{
perror("catch::realloc");
return ptr;
}
pc->sz = pc->sz + 2;
printf("添加成功,现在表最大:%d", pc->sz);
return ptr;
}
void Add(Stu* pc)
{
int i = pc->num;
if (i == pc->sz)
{
Stu_Node* ptr = catch (pc);
if (pc == NULL)
{
printf("添加失败!\n");
return;
}
else
{
printf("添加成功!\n");
pc->sz = pc->sz + 2;
printf("请输入名字>");
scanf("%s", pc->stu_node[i].name);
printf("请输入年龄>");
scanf("%d", &pc->stu_node[i].age);
printf("请输入住址>");
scanf("%s", pc->stu_node[i].address);
printf("请输入电话>");
scanf("%s", pc->stu_node[i].tel);
pc->num++;
}
}
else
{
printf("请输入名字>");
scanf("%s", pc->stu_node[i].name);
printf("请输入年龄>");
scanf("%d", &pc->stu_node[i].age);
printf("请输入住址>");
scanf("%s", pc->stu_node[i].address);
printf("请输入电话>");
scanf("%s", pc->stu_node[i].tel);
pc->num++;
}
}
void Print(Stu* pc)
{
int i = 0;
printf("%-5s%-6s%-15s%-12s\n", "名字", "年龄", "地址", "电话");
for (i = 0; i < pc->num;i++)
{
printf("%-5s%-6d%-15s%-12s\n", pc->stu_node[i].name, pc->stu_node[i].age,
pc->stu_node[i].address, pc->stu_node[i].tel);
}
}
int Find_Stu(Stu* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->num; i++)
{
if (strcmp(pc->stu_node[i].name, name) == 0)
return i;
}
return 0;
}
void Search(Stu* pc, char name[])//查询人员
{
int ret = Find_Stu(pc, name);
if (ret != 0)
{
printf("找到了\n");
printf("%-5s%-6d%-15s%-12s\n", pc->stu_node[ret].name, pc->stu_node[ret].age,
pc->stu_node[ret].address, pc->stu_node[ret].tel);
}
else
{
printf("该信息表里没有这个人!\n");
}
}
void Delete(Stu* pc, char name[])//删除人员
{
int ret = Find_Stu(pc, name);
pc->stu_node[ret] = pc->stu_node[pc->num - 1];
pc->num--;
}
int compare_age(const void* x, const void* y)
{
return ((Stu_Node*)x)->age -((Stu_Node*)y)->age;
}
int compare_name(const void* x, const void* y)
{
return strcmp(((Stu_Node*)x)->name,((Stu_Node*)y)->name);
}
void sort_menu()
{
printf("-----------------------------------------\n");
printf("** 1.按名字 2.按年龄 **\n");
printf("-----------------------------------------\n");
}
void Sort(Stu* pc)
{
int input = 0;
sort_menu();
printf("请输入你要按照排序的方式>");
scanf("%d", &input);
switch(input)
{
case 1:
qsort(pc->stu_node, pc->num, sizeof(Stu_Node), compare_name);
break;
case 2:
qsort(pc->stu_node, pc->num, sizeof(Stu_Node), compare_age);
break;
default:
printf("输入有误!\n");
break;
}
}
void Modify(Stu* pc, char name[])
{
int ret = Find_Stu(pc, name);
if (ret != 0)
{
printf("请输入名字>");
scanf("%s", pc->stu_node[ret].name);
printf("请输入年龄>");
scanf("%d", &pc->stu_node[ret].age);
printf("请输入住址>");
scanf("%s", pc->stu_node[ret].address);
printf("请输入电话>");
scanf("%s", pc->stu_node[ret].tel);
}
else
{
printf("该信息表里没有这个人!\n");
}
}
//静态
//void clear(Stu* pc)//删除所有联系人
//{
// pc->num = 0;
//}
//动态
void clear(Stu* pc)
{
FILE* fp = fopen("contact.txt", "w");
if (fp == NULL)
{
perror("fopen::");
}
else
{
int i = 0;
while(i!=pc->num)
{
fprintf(fp, "%s %d %s %s ", pc->stu_node[i].address, pc->stu_node[i].age, pc->stu_node[i].name, pc->stu_node[i].tel);
i++;
}
fclose(fp);
fp = NULL;
}
pc->num = 0;
pc->sz = 0;
free(pc->stu_node);
pc->stu_node = NULL;
}
void clear_list(Stu* pc)
{
pc->num = 0;
pc->sz = INIT;
pc->stu_node = (Stu_Node*)realloc(pc->stu_node, sizeof(Stu_Node) * INIT);
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"manage.h"
void menu()
{
printf("*****************************************\n");
printf("****** 1.新增人员 2.查询人员 **\n");
printf("****** 3.删减人员信息 4.排序 **\n");
printf("****** 5.打印人员信息 6.修改信息 **\n");
printf("****** 7.清空所有名单 0.退出 **\n");
printf("*****************************************\n");
}
int main()
{
int input = 0;
char name[20] = { 0 };
Stu stu;
Initstu(&stu);
do
{
menu();
printf("请输入要选择的功能>");
scanf("%d", &input);
switch (input)
{
case 1:
Add(&stu);
break;
case 2:
printf("请输入姓名>");
scanf("%s", name);
Search(&stu,name);
break;
case 3:
printf("请输入姓名>");
scanf("%s", name);
Delete(&stu, name);
break;
case 4:
Sort(&stu);
break;
case 5:
Print(&stu);
break;
case 6:
printf("请输入姓名>");
scanf("%s", name);
Modify(&stu,name);
break;
case 7:
clear_list(&stu);
break;
case 0:
clear(&stu);
printf("退出管理系统!");
break;
default:
printf("输入有误!请重新输入!\n");
break;
}
} while(input);
return 0;
}