C语言课程设计通讯录.docx
- 文档编号:14708368
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:30
- 大小:263.89KB
C语言课程设计通讯录.docx
《C语言课程设计通讯录.docx》由会员分享,可在线阅读,更多相关《C语言课程设计通讯录.docx(30页珍藏版)》请在冰点文库上搜索。
C语言课程设计通讯录
实现通讯录管理系统
任务:
自学C语言中有关链表及外部文件的内容,设计出通讯录管理系统。
要求如下所述:
◆建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;;
◆能够提供添加、删除和修改通讯录信息的功能;
◆能够提供按不同方式查询的功能;如按姓名或年龄、电话等查询;
◆将通讯录保存在文件中;
◆能够按表格方式输出通讯录信息。
要求:
1根据以上功能需求,自己定义单链表结点的存储结构;
2为了保证所有的数据可以长期被使用,要求程序能将相关数据存储在外部数据文件中,具体数据格式和文件名、路径等自定;
3提供友好的用户界面,方便用户操作。
设计目的
随着信息社会的高速发展,人与人之间的联系越来越频繁,通讯方式越来越多样化,如何保证与朋友、同学、同事、领导、亲戚等之间的联系,并能方便快捷的查找、记录、修改其相关通讯信息。
仅靠以前单独的手工记录已远远不能满足当前的需要。
开发一个通讯录管理系统,借助计算机可以方便、快捷、灵活的管理个人的朋友及相关人员的通讯信息,了解友人相关信息,帮助与友人保持联络。
所以设计一个通讯录管理系统管理各人的通讯信息是是非必要的。
系统功能概要
通讯录管理系统是基于链表设计而成的信息管理系统。
该系统通过对程序进行模块化,建立添加、显示、修改、查找和删除功能的函数,各函数中运用链表存储数据。
从主函数开始执行,调用各函数,并运用文件相关知识将信息存入磁盘中。
统功能模块图如图1
图1系统功能模块图
数据结构及原理
(1)为存储通讯录信息,需定义一个结构体类型,成员包括姓名、编号、年龄、通讯地址、电话、电子邮箱等,结构体定义如下:
structstudent
{
charnum[20];
charname[10];
charage[10];
chartel[20];
charadress[50];
charemail[20];
structstudent*next;/*建立通讯录信息结构体;*/
};
(2)以列表的形式输出文件。
(3)分别建立具有添加、删除、修改、查询等功能的子函数,完成相应功能,对程序实现模块化。
这其中要用到对链表的删除、插入等知识。
删除时用一结构体指针指向链表的第一个结点,检查该节点的值是否等于输入的要删除的信息,若相等就删除,不相等则后移指针,直至表尾。
插入时也要先找到相应结点,再添加。
查询功能要设置姓名、编号等多种方式。
(4)为实现存储功能,需用到文件的相关函数,打开文件,将添加、修改或删除的信息存入磁盘中。
详细设计:
1.信息的建立
开辟一个新的结点,并使p1,p2指向它
读入一个学生的数据给p1所指的结点
当读入的p1->num不是结束
n=n+1
n等于1?
真
假
head=p1(把p1所指的结点做为第一结点)
p2->next=p1(把p1所指的结点链接到表尾)
p2=p1(p2移到表尾)
在开辟一个新结点,使p1指向它
读入一个学生数据给p1所指结点
表尾结点的指针变量置NULL
structstudent*creat(void)
{
charstring[]={"结束"};
structstudent*head;
structstudent*p1,*p2;
n=0;
p1=p2=(structstudent*)malloc(LEN);
printf("请输入编号\n");
scanf("%s",&p1->num);
printf("请输入姓名\n");
scanf("%s",&p1->name);
printf("请输入年龄\n");
scanf("%s",&p1->age);
printf("请输入电话号码\n");
scanf("%s",&p1->tel);
printf("请输入通讯地址\n");
scanf("%s",&p1->adress);
printf("请输入电子邮箱\n");
scanf("%s",&p1->email);
head=NULL;
while(strcmp(p1->num,string)!
=0)
{
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
printf("请输入编号\n");
scanf("%s",&p1->num);
printf("请输入姓名\n");
scanf("%s",&p1->name);
printf("请输入年龄\n");
scanf("%s",&p1->age);
printf("请输入电话号码\n");
scanf("%s",&p1->tel);
printf("请输入通讯地址\n");
scanf("%s",&p1->adress);
printf("请输入电子邮箱\n");
scanf("%s",&p1->email);
}
p2->next=NULL;
return(head);
}
2.信息的删除
链表是个空表
真
假
输出
“空表”
p1=head
当num不等于p1->num以及p1所指的结点不是表尾结点
p2=p1(p2后移一个位置)
p1=p1->next(p1后移一个位置)
p1是要删除的结点
是
否
p1所指是头指针
输出“找不到”的信息
是
否
head=p1->next(删除头结点)
p2->next=p1->next(删除一个结点)
structstudent*del(structstudent*head,charnum[20])
{
structstudent*p1,*p2;
if(head==NULL){printf("\nlistnull!
\n");returnhead;}
p1=head;
while(strcmp(p1->num,num)!
=0&&p1->next!
=NULL)
{
p2=p1;p1=p1->next;
}
if(strcmp(p1->num,num)==0)
{
if(p1==head)head=p1->next;
elsep2->next=p1->next;
n=n-1;
}
elseprintf("%snotbeenfound!
\n",num);
return(head);
}
3.信息的添加
P1=head,p0=stud
原来的链表是空表
是
否
将p0所
指的结点
作为唯一
结点
当p0->num>p11->num以及
P1所指的不是表尾结点
P2指向p1位置
P1向后移一个结点
P0->num<=p1->num
是
否
P1指向头结点
P1->next=p0
P0->next=NULL
(插到表尾之后)
是
否
Head=p0
P0->next=p1
(插到表头之前)
P2->next=p0
P0->next=p1
(插到中间)
N=n+1
structstudent*insert(structstudent*head,structstudent*stud)
{
structstudent*p0,*p1,*p2;
p0=p1=p2=(structstudent*)malloc(LEN);
p1=head;
p0=stud;
if(head==NULL)
{head=p0;p0->next=NULL;}
else
{while((p0->num>p1->num)&&(p1->next!
=NULL))
{p2=p1;p1=p1->next;}
if(p0->num<=p1->num)
{
if(head==p1)head=p0;
elsep2->next=p0;
p0->next=p1;
}
else{p1->next=p0;p0->next=NULL;}
}
n=n+1;
return(head);
}
4.信息的查询
该系统提供了两种查询方式:
第一种是按姓名查找;第二种是按编号查找。
(1)按姓名查找(structstudent*namesearch(structstudent*head))
按姓名查找通讯信息的功能,是按照用户输入的姓名进行通讯信息的查找,将第一个与用户输入的姓名匹配的那条信息输出。
流程图如图5:
定义结点p,查找姓名信息与输入姓名一致的结点
找到匹配的结点p
否是
输出结点信息
structstudent*namesearch(structstudent*head)
{
structstudent*p;
p=(structstudent*)malloc(LEN);
charname[10];
p=head;
printf("请输入姓名\n");
scanf("%s",name);
while(p!
=NULL&&strcmp(p->name,name)!
=0)
p=p->next;
printf("编号姓名年龄电话号码通讯地址电子邮箱\n");
printf("%s%s%s%s%s%s\n",p->num,p->name,p->age,p->tel,p->adress,p->email);
return(head);
}
(2)按编号查找(structstudentnumsearch(structstudent*head))
按编号查找通讯信息的功能,是按照用户输入的编号进行通讯信息的查找,系统将所有编号信息与用户输入的信息匹配的通讯信息全部输出。
流程图如图6:
定义结点p,查找编号信息与输入编号一致的结点
找到匹配的结点p
否是
输出结点信息
structstudent*numsearch(structstudent*head)
{
structstudent*p;
p=(structstudent*)malloc(LEN);
charnum[20];
p=head;
printf("请输入编号\n");
scanf("%s",num);
while(p!
=NULL&&strcmp(p->num,num)!
=0)
p=p->next;
printf("编号姓名年龄电话号码通讯地址电子邮箱\n");
printf("%s%s%s%s%s%s\n",p->num,p->name,p->age,p->tel,p->adress,p->email);
return(head);
}
5.信息的显示
定义一个节点p,指向第一个元素节点
P指向的不是尾结点
真假
输出p所指的结点
P指向下一个结点
当p指向的不是表尾
voidprint(structstudent*head)
{
structstudent*p;
p=head;
printf("编号 姓名 年龄 电话 通讯地址 电子邮箱\n");
if(head!
=NULL)
do
{
printf("%s %s %s %s %s%s\n",&p->num,&p->name,&p->age,&p->tel,&p->adress,&p->email);
p=p->next;
}while(p!
=NULL);
}
其他功能
该系统还有修改信息、将信息存盘以及退出系统等功能。
(1)修改
定义结点p,查找编号信息与输入编号一致的结点
找到匹配的结点p
否是
修改信息
tructstudent*messagechange(structstudent*head)
{
structstudent*p;
p=(structstudent*)malloc(LEN);
charname[10];
p=head;
printf("请输入姓名\n");
scanf("%s",name);
while(p!
=NULL&&strcmp(p->name,name)!
=0)
p=p->next;
printf("请输入编号\n");
scanf("%s",&p->num);
printf("请输入姓名\n");
scanf("%s",&p->name);
printf("请输入年龄\n");
scanf("%s",&p->age);
printf("请输入电话号码\n");
scanf("%s",&p->tel);
printf("请输入通讯地址\n");
scanf("%s",&p->adress);
printf("请输入电子邮箱\n");
scanf("%s",&p->email);
return(head);
}
(2)存盘
存盘功能(voidsave(structstudent*head))是将用户建立的通讯录信息系统以文件的形式存入磁盘,需要用到文件的相关知识。
流程图如图8:
定义结点p
打开只写文件stu_list成功
否是
退出
p指向第一个元素结点
p等于head
否是
写入通讯信息
提示错误
保存并关闭文档
(3)退出系统
退出功能(voidquit(void)),使用完毕后,可退出该系统。
运行结果:
进入界面选择
输入信息
显示信息
编号查找
姓名查找
添加信息
修改信息
删除信息
存盘
退出
总结
通过这次课程设计,我对C语言以及数据结构有了更深刻的了解,增强了程序的编写能力,巩固了专业知识,对程序的模块化观念也又模糊逐渐变的清晰了。
在程序的运行与调试过程中出现了很多错误,通过反复地复习课本上的相关知识,不停地修改与调试,我终于完成了这段程序。
在调试过程中,我认识到了数据结构的灵活性与严谨性,同一个功能可以由不同的语句来实现,但编写程序时要特别注意细节方面的问题,因为一个小小的疏忽就能导致整个程序不能运行。
我也认识到了自己的薄弱之处,如对链表相关知识的欠缺,文件运用的不熟练,在以后的学习中我要集中精力、端正态度,争取把知识学得更扎实、更全面。
完整程序清单
#include
#include
#include
#include
#defineNULL0
#defineLENsizeof(structstudent)
structstudent
{
charnum[20];
charname[10];
charage[5];
chartel[20];
charadress[50];
charemail[20];
structstudent*next;
};
intn;
structstudent*creat(void)
{
charstring[]={"结束"};
structstudent*head;
structstudent*p1,*p2;
n=0;
p1=p2=(structstudent*)malloc(LEN);
printf("请输入编号\n");
scanf("%s",&p1->num);
printf("请输入姓名\n");
scanf("%s",&p1->name);
printf("请输入年龄\n");
scanf("%s",&p1->age);
printf("请输入电话号码\n");
scanf("%s",&p1->tel);
printf("请输入通讯地址\n");
scanf("%s",&p1->adress);
printf("请输入电子邮箱\n");
scanf("%s",&p1->email);
head=NULL;
while(strcmp(p1->num,string)!
=0)
{
n=n+1;
if(n==1)head=p1;
elsep2->next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
printf("请输入编号\n");
scanf("%s",&p1->num);
printf("请输入姓名\n");
scanf("%s",&p1->name);
printf("请输入年龄\n");
scanf("%s",&p1->age);
printf("请输入电话号码\n");
scanf("%s",&p1->tel);
printf("请输入通讯地址\n");
scanf("%s",&p1->adress);
printf("请输入电子邮箱\n");
scanf("%s",&p1->email);
}
p2->next=NULL;
return(head);
}
structstudent*del(structstudent*head,charnum[20])
{
structstudent*p1,*p2;
if(head==NULL){printf("\nlistnull!
\n");returnhead;}
p1=head;
while(strcmp(p1->num,num)!
=0&&p1->next!
=NULL)
{
p2=p1;p1=p1->next;
}
if(strcmp(p1->num,num)==0)
{
if(p1==head)head=p1->next;
elsep2->next=p1->next;
n=n-1;
}
elseprintf("%snotbeenfound!
\n",num);
return(head);
}
structstudent*insert(structstudent*head,structstudent*stud)
{
structstudent*p0,*p1,*p2;
p0=p1=p2=(structstudent*)malloc(LEN);
p1=head;
p0=stud;
if(head==NULL)
{head=p0;p0->next=NULL;}
else
{while((p0->num>p1->num)&&(p1->next!
=NULL))
{p2=p1;p1=p1->next;}
if(p0->num<=p1->num)
{
if(head==p1)head=p0;
elsep2->next=p0;
p0->next=p1;
}
else{p1->next=p0;p0->next=NULL;}
}
n=n+1;
return(head);
}
structstudent*namesearch(structstudent*head)
{
structstudent*p;
p=(structstudent*)malloc(LEN);
charname[10];
p=head;
printf("请输入姓名\n");
scanf("%s",name);
while(p!
=NULL&&strcmp(p->name,name)!
=0)
p=p->next;
printf("编号姓名年龄电话号码通讯地址电子邮箱\n");
printf("%s%s%s%s%s%s\n",p->num,p->name,p->age,p->tel,p->adress,p->email);
return(head);
}
structstudent*numsearch(structstudent*head)
{
structstudent*p;
p=(structstudent*)malloc(LEN);
charnum[20];
p=head;
printf("请输入编号\n");
scanf("%s",num);
while(p!
=NULL&&strcmp(p->num,num)!
=0)
p=p->next;
printf("编号姓名年龄电话号码通讯地址电子邮箱\n");
printf("%s%s%s%s%s%s\n",p->num,p->name,p->age,p->tel,p->adress,p->email);
return(head);
}
structstudent*messagechange(structstudent*head)
{
structstudent*p;
p=(structstudent*)malloc(LEN);
charname[10];
p=head;
printf("请输入姓名\n");
scanf("%s",name);
while(p!
=NULL&&strcmp(p->name,name)!
=0)
p=p->next;
printf("请输入编号\n");
scanf("%s",&p->num);
printf("请输入姓名\n");
scanf("%s",&p->name);
printf("请输入年龄\n");
scanf("%s",&p->age);
printf("请输入电话号码\n");
scanf("%s",&p->tel);
printf("请输入通讯地址\n");
scanf("%s",&p->adress);
printf("请输入电子邮箱\n");
scanf("%s",&p->email);
return(head);
}
voidprint(structstudent*head)
{
structstudent*p;
p=head;
printf("编号 姓名 年龄 电话 通讯地址 电子邮箱\n");
if(head!
=NULL)
do
{
printf("%s%s%s %s %s%s\n",&p->num,&p->name,&p->age,&p->tel,&p->adress,&p->email);
p=p->next;
}while(p!
=NULL);
}
voidsave(structstudent*head)
{
FILE*fp;
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 通讯录