此次写的成绩管理表采用的是顺序表。
- 利用数据元素的存储位置表示线性表中相邻元素之间的前后关系,即线性表的逻辑结构与存储结构一致
- 访问线性表时,可以快速计算出任一个元素的存储地址。因此可以初略地认为访问每个元素所花费的时间相等
我将所有的管理表都认为是固定3部分:数据框架,数据处理,数据输出。框架和输出一般都很简单,所以在本文前面会集中讨论数据处理,最后在简单说下数据框架和输出。
在我认为一些简单的数据处理分为4大类:增删查改。
小类:初始化,销毁清空,求总长度,判断是否为空
小类
:
初始化
求总长度
判断是否为空
取值
销毁清空
大类
:
增
一般录入信息的结构体由两部分组成
1.信息
2.长度
Tips:创建结构体是要分配内存(用malloc)
查
插
若插在最后:
可直接插入
若插在中间(开头):
将此位置后所有内容全部向后移
删
若删除最后一个
直接删
若删除中间(开头)
后面所有元素向前移
改
这里我只存储了姓名信息,要是相加信息,可直接加;
#include"表.h";
void menu()
{
printf("****1.添加信息 2.删除信息***\n ");
printf("***3.查找信息 4.修改信息***\n ");
printf("***5.展示信息 6.插入信息***\n ");
printf("***0.退出管理系统 \n ");
printf("*******************************\n ");
}
int main()
{
int input = 0;
CONTACT a;
init(&a);
do
{
menu();
printf("请选择 >");
scanf("%d", &input);
switch (input)
{
case ADD:
add(&a);
break;
case DEL:
del(&a);
break;
case SEARCH:
search(&a);
break;
case MODIFY:
modify(&a);
break;
case SHOW:
show(&a);
break;
case INSERT:
insert(&a);
break;
case EXIT:
printf("退出通讯录\n");
break;
default:
printf("选择错误,请选择0-6间的数\n");
break;
}
} while (input);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include"stdlib.h"
#define MAX_NAME 20
#define MAX 1000
enum Option
{//枚举法增加代码可读性(避免case123456看不懂)
EXIT,//0 枚举默认从0开始
ADD,//1
DEL,//2
SEARCH,//3
MODIFY,//4
SHOW,//5
INSERT,//6
};
struct Info
{
char name[MAX_NAME];
};
//通讯录类型
typedef struct Contact
{
struct Info date[MAX];//存放MAX个信息
int length;//记录当前长度
}CONTACT;
void modify(CONTACT* a);
void init(CONTACT* a);
void add(CONTACT* a);
void search(CONTACT* a);
void show(CONTACT* a);
void del(CONTACT* a);
void insert(CONTACT* a);
1.初始化
void init(CONTACT* a)
{
memset(a->date, 0, sizeof(a->date));//分配内存
a->length = 0;
}
memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。
也可用
(struct PeopleInfo *)malloc(sizeof(struct PeopleInfo));
来分配内存
2.添加`
void add(CONTACT* a)
{
if (a->length == MAX)
printf("此表已满\n");
else
{
printf("请输入姓名\n");
scanf("%s", a->date[a->length].name);
a->length++;
printf("输入成功\n");
}
3.展现`
void show(CONTACT* a)
{
if (a->length == 0)
printf("空\n");
else
{
int i = 0;
printf("%-20s\n", "姓名");
for (i = 0; i < a->length; i++)
{
printf("%-20s\n", a->date[i].name);
}
}
}
4通过名字查找(子程序)(个人认为这是最最重要的)
通过比较名字来返回此元素在表中位置
后面的函数都是基于此子程序
static int find(const CONTACT* a, char name[MAX_NAME])
{
int i = 0;
for (i = 0; i < a->length;i++)
{
if (0 == strcmp(a->date[i].name, name))
return i;
}
return -1;
}
为什么不把find添加到contact.h中?
增加,删除,修改,显示这些函数是总功能
而find是子功能
为什么用static?
static表示这个find只能在contact.c中看到、用到
5.删除
void del(CONTACT* a)
{
char name[MAX_NAME];
printf("输入名字:>");
scanf("%s", name);
if (find(a,name) == -1)
printf("查无此人\n");
else
{
int j = 0;
for (j = find(a, name); j < a->length - 1; j++)
{
a->date[j] = a->date[j+1];
}
a->length--;//不能用lengrh - 1
printf("删除成功\n");
}
}
其实我也有个问题想问问大家:结尾将长度减少为什么不能用length-1?
6.查找
void search(CONTACT* a)
{
char name[MAX_NAME];
printf("输入名字:>");
scanf("%s", name);
if (find(a, name) == -1)
printf("查无此人\n");
else
{
printf("%-20s\n", "姓名");
printf("%-20s\n", a->date[find(a,name)].name);
}
}
7.修改
void modify(CONTACT* a)
{
char name[MAX_NAME];
printf("输入名字:>");
scanf("%s", name);
if (find(a, name) == -1)
printf("查无此人\n");
else
{
printf("请输入修改姓名:>");
scanf("%s", a->date[find(a, name)].name);
printf("修改成功\n");
}
}
8.插入
void insert(CONTACT* a)
{
char name[MAX_NAME];
printf("请输入学生名字:>");
scanf("%s", name);
if (find(a, name) == -1)
printf("查无此人\n");
else
{
int i;
for (i = find(a, name); i < a->length; i++)
a->date[i + 1] = a->date[i];
printf("请输入插入的信息(在此学生之前):>");
scanf("%s", a->date[find(a, name)].name);
a->length++;
}
}
若for (i = find(a, name); i < a->length-1; i++)
这会让最后一个消失