通讯录的制作数据结构C语言版
- 格式:docx
- 大小:3.00 MB
- 文档页数:11
通讯录的制作数据结构C语言版
WTD standardization office【WTD 5AB- WTDK 08- WTD 2C】
通讯录的设计
一、设计思路:
经过一个学期的程序设计学习,我逐渐了解了计算机的基本原理和c语言的基本常识,并可以逐渐自己来实现一些简单的程序任务。此次程序设计我选择了通讯录设计,通过函数、结构体的定义以及一些基本操作运用,经过一个多月的编写、调试、测试,最终完成了该程序的设计。以下为我的设计思路:
首先,确定通讯录的功能,我初步设计了六项功能:输入(程序中对应 enter() )、删除(程序中对应delete() )、显示通讯录(程序中对应list() )、搜索(程序中对应search() )、保存(程序中对应save() )、装载(程序中对应 load() )。
其次,对于存储的数据结构,我则主要选择了一下几个方面的信息:姓名、性别年龄、籍贯、手机、下一个指针(用于链表的操作与实现)、当前指针(用于链表的操作与实现)。
二、程序源代码:#include <>
struct address{
/*创建一个address结构*/
char name[10]; /*姓名*/
char sex[2]; /*性别*/
char age[2]; /*年龄*/ char native[10]; /*籍贯*/
char telephone[12]; /*手机*/
struct address *next; /*下一个入口的指针 */
struct address *prior; /*当前记录的指针*/ } list_entry;
struct address *start; /*指向列表中第一个入口*/
struct address *last; /*指向列表中最后一个入口*/
void
enter(),display(),search(),save(),load();
menu_select(),list(),delet(),inputs();
main()
{
char s[20],choice;
struct address *info;
start=last=NULL; /*列表长度清零*/
for(;;) { /*列循环的一个用法*/
switch(menu_select()){
case 1: enter(); /*输入1,进入enter()程序,是输入通讯录*/ break;
case 2:delet(); /*输入2,进入delete()程序,是删除一个记录*/
break;
case 3:list(); /*输入3,进入list()程序,是列表显示通信录*/
break;
case 4:search(); /*输入4,进入search()程序,搜索一个街道*/
break;
case 5:save();
/*输入5,保存列表到磁盘文件*/
break;
case 6:load();
/*输入6,从磁盘文件读入列表*/
break;
case 7:return(0);
}
}
}
/*选择一个选项*/
menu_select()
{
char s[20];
int c;
printf("1.输入一个名字(直接回车则退出)\n");
printf("2.删除一个名字\n");
printf("3.列表显示\n");
printf("4.搜索查询\n");
printf("5.保存文件\n");
printf("6.装入文件\n");
printf("7.退出\n");
do{
printf("\n输入您的选择:");
gets(s);
c=atoi(s);
}while (c<0||c>7); return c;
}
/*输入名字和地址*/
void enter()
{
struct address
*info,*dls_store();
for(;;){
info=(struct address *)
malloc(sizeof(list_entry));
if (!info) {
printf("\n内存溢出");
return;
}
inputs("输入姓名:",info->name,10);
if (!info->name[0])
break; /*名字长度为0,停止输入*/
inputs("输入性别:",info->sex,2);
inputs("输入年龄:",info->age,2);
inputs("输入籍贯:",info->native,10);
inputs("输入电话:",info->telephone,12);
start=dls_store(info,start); /*保存在第一个记录里*/
} /*输入循环*/
}
inputs(prompt,s,count) /*这个函数用于输入长度为count的一个字符串,用于防止字符串长度超过它的空间,并提出警告*/
char *prompt;
char *s;
int count;
{
char p[255];
do{
printf(prompt); /*显示这个函数的字符串*/
gets(p);
/*从键盘获得255个输入*/
if(strlen(p)>count)
printf("n字符串超过长度!");
/*如果数组P中的长度超过调用函数中的参数count,提示*/
}while (strlen(p)>count);
/*如果输入的字符串长度超过count,循环重新输入,否则退出,返回调用者*/
strcpy(s,p); /*s是目标字符串,输出时字符串在s中*/
return(0);
}
/*产生一个又链接表,当一个新元素插入到列表的开始时,一个指向第一个元素的指针被返回*/
struct address *dls_store(i,top) /*存贮顺序*/
struct address *i;
/*新的元
素*/
struct address *top;
/*列表中的第一个元素*/
{
struct address *old,*p;
if(last==NULL) { /*列表中的第一个元素*/
i->next=NULL;
i->prior=NULL;
last=i;
return i;
}
p=top; /*从列表的顶部开始*/
old=NULL;
while(p){
if(strcmp(p->name,i->name)<0){
old=p;
p=p->next;
} else{
if (p->prior) {
p->prior->next=i;
i->next=p;
i->prior=p->prior;
p->prior=i;
return
top;
}
i->next=p;
/*新的第一个元素*/
i->prior=NULL;
p->prior=i;
return i;
}
}
old->next=i; /*设置未尾*/
i->next=NULL;
i->prior=old;
last=i;
return start;
}
/*从列表中删除一个元素*/
delet()
{
struct address *info,*find();
char s[10];
printf("输入姓名:");
gets(s);
info=find(s);
if(info){
if (start==info){
start=info->next;
if(start) start->prior=NULL;
else last=NULL;
}
else { info->prior->next=info->next;
if (info!=last)
info->next->prior=info->prior;
else
last=info->prior;
}
free(info); /*释放空间*/
}
return(0);
}
struct address *find(name)
/*一个查找姓名的结构*/
char *name;
{
struct address *info;
info=start;
while(info){
if(!strcmp(name,info->name)) return info;
info=info->next;
/*获得下一个地址*/
}
printf("姓名没有发现!\n");
return NULL; /*没有发现姓名*/
}
list() /*列表*/
{
register int t;
struct address *info;
info=start;
while(info){
display(info);
info=info->next;
/*获得下一个地址*/
}
printf("\n\n");
return(0); }
void display(info) /*显示通信录*/
struct address *info;
{
printf("%s\n",info->name);
printf("%s\n",info->sex);
printf("%s\n",info->age);
printf("%s\n",info->native);
printf("%s\n",info->telephone);
printf("\n\n");
}
void search() /*搜索一个名字*/
{
char name[10];
struct address *info,*find();
printf("输入查找的名字!");
gets(name);
if(!(info=find(name)))
printf("没有找到!\n");