先看看结构体定义
#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;
}
}