用顺序表做一个电话簿

先看看结构体定义

#define MAXSIZE 50   //表最大容量

//定义联系人信息 备注,电话,年龄,该声明要在顺序表结构体之前声明
typedef struct person
{
	char remark[20];
	char telephone[20];
	int age;
};

//定义顺序表结构体
typedef struct 
{
	struct person data[MAXSIZE]; //顺序表元素为结构体元素
	int last; 					 //表尾指针
}seqlist;
seqlist *L;                     //定义一个全局变量表

我们会构建的函数

void menu();    	//菜单
void KeyDown();		//按键功能
seqlist *create_list(void);             //创建顺序表
void clear_list(seqlist *L);			//释放顺序表
int is_empty_list(seqlist *L);			//判断表是否为空
int is_full_list(seqlist *L);			//判断表是否为满
int get_list_len(seqlist *L);			//获取表的长度
void insert_list(seqlist *L,int pos,struct person datax); //在表中pos位置插入数据
void show_list(seqlist *L);								  //显示表中的内容
void deleta_list(seqlist *L,struct person datax);		  //删除表中pos的数据
int searchName_list(seqlist *L,struct person datax);	  //查询表中元素的位置
void change_list(seqlist *L,struct person datax);		  //更改某个元素的信息,这里我用的是名字查询。读者可以在函数体中自行修改
void quick_sort(seqlist *L,int begin,int end);			  //按照联系人的年龄进行排序
void saveToFile(seqlist *L,const char *fileName);		  //保存表到文件
void readFromFile(seqlist *L,const char *fileName);		  //从文件中读取表

1.菜单

//这个直接在网上找一个美观的就行了
void menu()
{
    printf("********************************************************\n");
    printf("****************         通讯录         ****************\n");
    printf("********************************************************\n");
    printf("********         1.添加          2.删除         ********\n");
    printf("********         3.查找          4.修改         ********\n");
    printf("********         5.显示          6.清空         ********\n");
    printf("********         7.排序          0.退出         ********\n");
    printf("********************************************************\n");
}

2.按键功能

void KeyDown()
{
	int key_value=0;
	int len = get_list_len(L);
	struct person temp;
	scanf("%d",&key_value);

	switch(key_value)
	{
		case 0:
				exit(0);  //结束进程
		case 1:
			puts("请输入要添加的联系人信息中间以空格分开(name telephone age):\n");
			scanf("%s %s %d",temp.remark,temp.telephone,&temp.age);
			insert_list(L,0,temp);
			saveToFile(L,"person.txt");  
			break;
		case 2:
			printf("请输入要删除的联系人姓名:\n");
			scanf("%s",temp.remark);
			deleta_list(L,temp);
			saveToFile(L,"person.txt");
			break;
		case 3:
			printf("请输入要查询联系人的姓名:\n");
			scanf("%s",temp.remark);
			searchName_list(L,temp);
			break;
		case 4:
			printf("请输入要修改的联系人姓名");
			scanf("%s",temp.remark);
			printf("请输入要该联系人的信息(name telephone age):\n");
			scanf("%s %s %d",temp.remark,temp.telephone,&temp.age);
			change_list(L,temp);
			saveToFile(L,"person.txt");
			break;
		case 5:
			show_list(L);
			break;
		case 6:
			clear_list(L);
			break;
		case 7:
			quick_sort(L,0,len);
			break;
		default :
			printf("输入有误请重新输入\n");
			break;

	}
}

3.

/****************************************
* 保存表到文件
* 1.定义i用来遍历表长
* 2.定义文件指针,以只写或建立一个文本文件,只允许写数据;
* 3.遍历将数据写进表中
* 4.关闭文件
****************************************/
void saveToFile(seqlist *L,const char *fileName)
{
	int i=0;
	FILE *fp = fopen(fileName,"w");

	while(i<=L->last)
	{
		fprintf(fp,"%s\t%s\t%d\n",L->data[i].remark,\
                L->data[i].telephone,L->data[i].age);
		i++;
	}
	fclose(fp);
}

4.读文件

/***********************************
* 读取文件
* 1.定义i用来遍历表长
* 2.定义一个临时联系人信息
* 3.定义文件指针,以只读开打一个文本文件,只允许读数据
* 4.如果该文件为空,则可读可写
* 5.从文件中导出数据
***********************************/
void readFromFile(seqlist *L,const char *fileName)
{
	int i=0;
	struct person temp;
	FILE *fp = fopen(fileName,"r");
	if(fp == NULL)
	{
		fp=fopen(fileName,"w+"); 
	}
	while(fscanf(fp,"%s %s %d",temp.remark,temp.telephone,&temp.age)!=EOF)
	{
		insert_list(L,0,temp);
	}
}

5.排序


/************************************
* 快速排序
* 排序算法会在后期更新,大家在这里可以用冒泡排序
************************************/
void quick_sort(seqlist *L,int begin,int end)
{
	int i,j;
	struct person temp,chan;

	if(begin > end)
	{
		return ;
	}
	
	i = begin;
	j = end;
	temp = L->data[begin];

	while(i!=j)
	{
		while( (L->data[j].age>=temp.age)&&j>i )
			j--;
		while( (L->data[i].age<=temp.age)&&j>i )
			i++;

		if(j>i)
		{
			chan = L->data[i];
			L->data[i] = L->data[j];
			L->data[j] = chan; 
		}
	}
	L->data[begin] = L->data[i];
	L->data[i] = temp;
	quick_sort(L,begin,i-1);
	quick_sort(L,i+1,end);
}

end.最后是整个代码,关于顺序表操作的讲解我在上一个章节已经讲过了,有忘记的小伙伴去我主页看

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define MAXSIZE 50   

//定义联系人信息 备注,电话,年龄,该声明要在顺序表结构体之前声明
typedef struct person
{
	char remark[20];
	char telephone[20];
	int age;
};

//定义顺序表结构体
typedef struct 
{
	struct person data[MAXSIZE]; //顺序表元素为结构体元素
	int last; 					 //表尾指针
}seqlist;
seqlist *L;                     //定义一个全局变量表
void menu();    	//菜单
void KeyDown();		//按键功能
seqlist *create_list(void);             //创建顺序表
void clear_list(seqlist *L);			//释放顺序表
int is_empty_list(seqlist *L);			//判断表是否为空
int is_full_list(seqlist *L);			//判断表是否为满
int get_list_len(seqlist *L);			//获取表的长度
void insert_list(seqlist *L,int pos,struct person datax); //在表中pos位置插入数据
void show_list(seqlist *L);								  //显示表中的内容
void deleta_list(seqlist *L,struct person datax);		  //删除表中pos的数据
int searchName_list(seqlist *L,struct person datax);	  //查询表中元素的位置
void change_list(seqlist *L,struct person datax);		  //更改某个元素的信息,这里我用的是名字查询。读者可以在函数体中自行修改
void quick_sort(seqlist *L,int begin,int end);			  //按照联系人的年龄进行排序
void saveToFile(seqlist *L,const char *fileName);		  //保存表到文件
void readFromFile(seqlist *L,const char *fileName);		  //从文件中读取表





int main()
{
	L = create_list();
	readFromFile(L,"person.txt");
	while(1)
	{
		menu();
		KeyDown();

		system("pause");
		system("cls");
	}
	

	return 0;
}

/****************************************
* 保存表到文件
* 1.定义i用来遍历表长
* 2.定义文件指针,以只写或建立一个文本文件,只允许写数据;
* 3.遍历将数据写进表中
* 4.关闭文件
****************************************/
void saveToFile(seqlist *L,const char *fileName)
{
	int i=0;
	FILE *fp = fopen(fileName,"w");

	while(i<=L->last)
	{
		fprintf(fp,"%s\t%s\t%d\n",L->data[i].remark,L->data[i].telephone,L->data[i].age);
		i++;
	}
	fclose(fp);
}

/***********************************
* 读取文件
* 1.定义i用来遍历表长
* 2.定义一个临时联系人信息
* 3.定义文件指针,以只读开打一个文本文件,只允许读数据
* 4.如果该文件为空,则可读可写
* 5.从文件中导出数据
***********************************/
void readFromFile(seqlist *L,const char *fileName)
{
	int i=0;
	struct person temp;
	FILE *fp = fopen(fileName,"r");
	if(fp == NULL)
	{
		fp=fopen(fileName,"w+"); 
	}
	while(fscanf(fp,"%s %s %d",temp.remark,temp.telephone,&temp.age)!=EOF)
	{
		insert_list(L,0,temp);
	}
}

/************************************
* 快速排序
* 排序算法会在后期更新,大家在这里可以用冒泡排序
************************************/
void quick_sort(seqlist *L,int begin,int end)
{
	int i,j;
	struct person temp,chan;

	if(begin > end)
	{
		return ;
	}
	
	i = begin;
	j = end;
	temp = L->data[begin];

	while(i!=j)
	{
		while( (L->data[j].age>=temp.age)&&j>i )
			j--;
		while( (L->data[i].age<=temp.age)&&j>i )
			i++;

		if(j>i)
		{
			chan = L->data[i];
			L->data[i] = L->data[j];
			L->data[j] = chan; 
		}
	}
	L->data[begin] = L->data[i];
	L->data[i] = temp;
	quick_sort(L,begin,i-1);
	quick_sort(L,i+1,end);
}


int get_list_len(seqlist *L)
{
	return (L->last);
}

seqlist *create_list(void)
{
	seqlist *L;
	L = (seqlist *)malloc(sizeof(seqlist));
	if(L == NULL)
	{
		puts("malloc failed");
		return NULL;
	}
	L->last = -1;
	return L;
}

void clear_list(seqlist *L)
{
	if(L == NULL)
	{
		puts("seqlist is NULL\n");
		return ;
	}
	free(L);
	L = NULL;
	return ;
}

int is_empty_list(seqlist *L)
{
	if(L == NULL)
	{
		puts("seqlist is NULL\n");
	}
	return (L->last == -1);
}

int is_full_list(seqlist *L)
{
	if(L == NULL)
	{
		puts("seqlist is NULL\n");
	}
	return (L->last == MAXSIZE-1);
}

void insert_list(seqlist *L,int pos,struct person datax)
{
	int i=0;
	if( is_full_list(L)||pos<0||pos>L->last+1)
	{
		printf("input argv is invalid\n");
	}
	for(i=L->last;i>=pos;i--)
	{
		L->data[i+1] = L->data[i];
	}
	strcpy(L->data[pos].remark,datax.remark);
	strcpy(L->data[pos].telephone,datax.telephone);
	L->data[pos].age=datax.age;
	L->last++;
}

int searchName_list(seqlist *L,struct person datax)
{
	int i=0;
	for(i=0;i<=L->last;i++)
	{
		if(strcmp(L->data[i].remark,datax.remark)==0)
		{
			return i;
		}
	}
	return -1;
}

void deleta_list(seqlist *L,struct person datax)
{
	int i=0;
	int pos=0;
	pos = searchName_list(L,datax);
	for(i=pos;i<=L->last;i++)
	{
		L->data[i] = L->data[i+1];
	}
	L->last--;
}

void change_list(seqlist *L,struct person datax)
{
	int pos=0;
	pos = searchName_list(L,datax);
	L->data[pos].age = datax.age;
	strcpy(L->data[pos].remark,datax.remark);
	strcpy(L->data[pos].telephone,datax.telephone);
}


void show_list(seqlist *L)
{
	int i=0;
	while(i<=L->last)
	{
		printf("%s\t%s\t%d\n",L->data[i].remark,L->data[i].telephone,L->data[i].age);
		i++;
	}
}

void menu()
{
    printf("********************************************************\n");
    printf("****************         通讯录         ****************\n");
    printf("********************************************************\n");
    printf("********         1.添加          2.删除         ********\n");
    printf("********         3.查找          4.修改         ********\n");
    printf("********         5.显示          6.清空         ********\n");
    printf("********         7.排序          0.退出         ********\n");
    printf("********************************************************\n");
}


void KeyDown()
{
	int key_value=0;
	int len = get_list_len(L);
	struct person temp;
	scanf("%d",&key_value);

	switch(key_value)
	{
		case 0:
				exit(0);
		case 1:
			puts("请输入要添加的联系人信息中间以空格分开(name telephone age):\n");
			scanf("%s %s %d",temp.remark,temp.telephone,&temp.age);
			insert_list(L,0,temp);
			saveToFile(L,"person.txt");
			break;
		case 2:
			printf("请输入要删除的联系人姓名:\n");
			scanf("%s",temp.remark);
			deleta_list(L,temp);
			saveToFile(L,"person.txt");
			break;
		case 3:
			printf("请输入要查询联系人的姓名:\n");
			scanf("%s",temp.remark);
			searchName_list(L,temp);
			break;
		case 4:
			printf("请输入要修改的联系人姓名");
			scanf("%s",temp.remark);
			printf("请输入要该联系人的信息(name telephone age):\n");
			scanf("%s %s %d",temp.remark,temp.telephone,&temp.age);
			change_list(L,temp);
			saveToFile(L,"person.txt");
			break;
		case 5:
			show_list(L);
			break;
		case 6:
			clear_list(L);
			break;
		case 7:
			quick_sort(L,0,len);
			break;
		default :
			printf("输入有误请重新输入\n");
			break;

	}
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值