学生管理表\通讯录(c语言静态顺序表)

此次写的成绩管理表采用的是顺序表。

特点

  1. 利用数据元素的存储位置表示线性表中相邻元素之间的前后关系,即线性表的逻辑结构与存储结构一致
  2. 访问线性表时,可以快速计算出任一个元素的存储地址。因此可以初略地认为访问每个元素所花费的时间相等

优点

  • 可存储度大
  • 可随机存取表中任意元素

缺点

  • 在插入和删除运算时需要移动大量元素
  • 数组容易浪费存储空间
  • 用数组存储属于静态存储形式,数据元素的个数不能自由扩充

前言

我将所有的管理表都认为是固定3部分:数据框架,数据处理,数据输出。框架和输出一般都很简单,所以在本文前面会集中讨论数据处理,最后在简单说下数据框架和输出。

思路

在我认为一些简单的数据处理分为4大类:增删查改。
小类:初始化,销毁清空,求总长度,判断是否为空

小类

初始化

  • 为储存体(结构体变量)分配内存
  • 设置长度为0
  • 异常处理(可选)

求总长度

  • 返回长度

判断是否为空

  • 判读长度是否为0

取值

  • 寻找位置
  • 获取信息

销毁清空

  • 判断是否存在
  • 释放内存
  • 重置长度为0

大类

  • 判断信息是否已满
  • 在顺序表中录入信息一般用数组(指针)存放。
  • 成功录入信息后长度增加。
  • 异常处理(可选)

一般录入信息的结构体由两部分组成
1.信息
2.长度
Tips:创建结构体是要分配内存(用malloc)

  • 可用遍历查找
  • 判读信息存在
  • 按某一信息查找
  • 返回某一信息

  • 确定插入位置
  • 插入位置是否合法
  • 储存空间是否已满

若插在最后:

可直接插入

若插在中间(开头):

将此位置后所有内容全部向后移

  • 表长加1

  • 确定删除位置
  • 删除位置是否合法

若删除最后一个

直接删

若删除中间(开头)

后面所有元素向前移

  • 表长减1

  • 确定修改位置
  • 修改位置是否合法
  • 重新输入覆盖原信息

代码

这里我只存储了姓名信息,要是相加信息,可直接加;

  • 主程序框架(test.c)
#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;
}
  • 头文件(表.h)
#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);
  • 功能实现(function.c)

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++)
这会让最后一个消失

你可能感兴趣的:(数据结构,笔记,c语言,数据结构,算法)