文档库 最新最全的文档下载
当前位置:文档库 › 数据结构课程设计 通讯录管理

数据结构课程设计 通讯录管理

实验课程名称数据结构课程设计

专业班级计科(2)班

学生姓名黄家元

学号 10410902031 指导教师冯韵

2012至2013 学年第1学期第1 至2周

目录

1 概述 (3)

1.1 现状分析 (3)

1.2 存在问题 (3)

1.3 实现的意义 (3)

2 系统分析 (3)

2.1 用户需求分析 (3)

2.2 管理员需求分析 (3)

3 概要设计 (4)

4 详细设计 (4)

4.1 通讯录建立模块设计 (4)

4.2 通讯录插入模块设计 (5)

4.3 通讯录查询模块设计 (5)

4.4 通讯录删除模块设计 (6)

4.5 通讯录输出模块设计 (6)

5 运行与测试 (8)

5.1 主界面输出显示 (8)

5.2 通讯录建立模块的输出 (8)

5.3 通讯录插入模块的输出 (8)

5.4 通讯录查询模块的输出 (9)

5.4.1 按编号查询 (9)

5.4.2 按姓名查询 (9)

5.5 通讯录删除模块的输出 (9)

5.5.1 按编号删除 (10)

5.5.2 按姓名删除 (10)

5.6 显示通讯录中所有成员 (10)

6 总结与心得 (11)

7参考文献: (11)

8、附加程序代码 (11)

1 概述

1.1 现状分析

此系统利用线性表中的链表来建立一个通讯录,通讯录包括通讯者的编号、姓名、性别、电话及地址等信息,管理员对通讯录中的每一个通讯者的信息可以作插入、查询、删除、更新、排序操作。同样每一个通讯者对自己的信息进行插入、查询、删除、修改等操作。

1.2 存在问题

利用线性表中的链表怎样建立一个通讯录?

在通讯录中管理员和通讯者对此各有的相关操作?

1.3 实现的意义

通过这个实验更加较熟练掌握C语言的基本内容及程序设计的基本方法。通过设计一个完整程序,当中运用了数据结构的算法知识,并运用C语言上机调试的基本方法,更加掌握数据结构中链表的相关知识。

2 系统分析

2.1 用户需求分析

每一个用户能在通讯录对自己的信息进行建立、插入、查找、删除等相关操作。实现方便用户随时登陆进行相关操作。

2.2 管理员需求分析

管理员能很方便地对通讯录的所有用户进行管理,能在通讯录中进行建立、插入、查找、删除等相关操作。

3 概要设计

4 详细设计

4.1 通讯录建立模块设计

通讯录的建立通过链表来实现,先分配新的结点,向通讯录中建立新的成员的详细信息,然后按头插入法继续建立新的成员的详细信息。

程序代码如下:

LinkList CreateList(void)

{

LinkList head=(ListNode *)malloc(sizeof(ListNode));

ListNode *p,*rear;

int flag=0;

rear=head;

while(flag==0)

{

p=(ListNode *)malloc(sizeof(ListNode));

printf("编号(4)姓名(8)性别(2)电话(11)地址(31)\n");

printf("*****************************\n");

scanf("%s%s%s%s%s",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,,p->data.sex,p->data.phone,p->data.addr);

rear->next =p;

rear=p;

printf("结束建表吗?(1/0):");

scanf("%d",&flag);

}

rear->next=NULL;

return head;

}

4.2 通讯录插入模块设计

在链表中采用头插入法,向通信录中添加新的成员的详细信息

程序代码如下:

void InsertNode(LinkList head,ListNode *p)

{

ListNode *p1,*p2;

p1=head;

p2=p1->next;

while(p2!=NULL&&strcmp(p2->data.num,p->data.num)<0)

{

p1=p2;

p2=p2->next;

}

p1->next=p;

p->next=p2;

}

4.3 通讯录查询模块设计

通过顺序查找的方法进行查找,采用了按编号、姓名查找两种方法。程序代码如下:

ListNode * ListFind(LinkList head)

{// 有序通讯录链表上的查找

ListNode *p;

char num[5];

char name[9];

int xz;

printf("===============\n");

printf(" 1. 按编号查询\n");

printf(" 2. 按姓名查询\n");

printf("=================\n");

printf(" 请选择: ");

p=head->next; //假定通讯录表带头结点

scanf("%d",&xz);

if(xz==1){

printf("请输入要查找者的编号:");

scanf("%s",num);

while(p && strcmp(p->data.num,num)<0)

p=p->next;

if(strcmp(p->data.num,num)==0)

printf("%s,%s,%s,%s,%s\n",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,, p->data.sex,p->data.phone,p->data.addr);

if(p==NULL||strcmp(p->data.num,num)>0)

p=NULL;//没有查到要查找的通讯者

}

else

if(xz==2){

printf("请输入要查找着的姓名:");

scanf("%s",name);

while(p && strcmp(p->https://www.wendangku.net/doc/7013436904.html,,name)!=0)

p=p->next;

}

return p;

}

4.4 通讯录删除模块设计

先对所要删除的成员在通讯录中进行查找,再将其删除。采用了按编号、姓名删除程序代码如下:

void DelNode(LinkList head)

{

char k;

ListNode *p,*q;

p=ListFind(head); //调用查找函数

if(p==NULL)

{

printf("没有查到要删除的通讯着!\n");

return;

}

printf("真的要删除改结点嘛?(y/n) : ");

scanf("%c",&k);

if(k=='y'||k=='Y')

{

q=head;

while(q!=NULL && q->next!=p)

q=q->next;

q->next=p->next;//删除结点

free(p); //释放被删除的结点空间

printf("通讯者已被删除!\n");

}

4.5 通讯录输出模块设计

采用顺序操作的方法进行收索,并输出所收索的成员。

void PrintList(LinkList head)

{

ListNode *p;

p=head->next;//使p指向链表开始结点

printf("编号姓名性别联系电话地址\n");

printf("--------------------------------------------\n");

while(p!=NULL)

{

printf("%s,%s,%s,%s,%s\n",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,,

p->data.sex,p->data.phone,p->data.addr);

printf("--------------------------------------------\n");

p=p->next; //后移一个结点

}

整个过程的流程图

5 运行与测试

5.1 主界面输出显示

将程序进行编译、运行

图5.1 运行显示

5.2 通讯录建立模块的输出

输入1,建立通讯录中成员信息

图5.2 通讯录建立显示5.3 通讯录插入模块的输出

输2,向通讯录插入新的成员信息

图5.3 插入新成员显示

5.4 通讯录查询模块的输出

输入3,则向通讯录链表进行成员的查询,采用按编号、姓名查询两种方法

5.4.1 按编号查询

图5.4 按编号查询显示

5.4.2 按姓名查询

图5.5 按姓名查询显示

5.5 通讯录删除模块的输出

输入4,先对所要删除的成员进行查找,再对查找到得成员进行删除操作,也采用了按编号、姓名两种方法进行操作

5.5.1 按编号删除

图5.6 按编号删除显示5.5.2 按姓名删除

图5.7 按姓名删除显示5.6 显示通讯录中所有成员

图5.8 通讯录所有成员显示

6 总结与心得

通过为期一周的课程设计、对论文的不断改进和反复的修改,我们对《C语言》这门课程有了更深一步的了解。它是计算机程序设计的重要理论技术基础,在我们计算科学专业的学习中占据着十分重要的地位。同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西,运用《C语言》中的算法思想作数据结构,结合C语言基本知识,编写一个通讯录管理系统。

通过完成本课题,进一步熟悉C语言的基本知识,并掌握数据结构的一些基本算法思想,掌握C语言的文件操作(包括从磁盘读入和向磁盘写入内容),进一步熟悉指针的用法,数组的建立运用和函数的调用等,还掌握了设计一篇论文的格式和基本要求,这也是本次实验最重要的收获,为以后作毕业设计打下坚实的基础。

7参考文献:

[1] 严蔚敏吴伟民数据结构(c语言版)[M] 北京:清华大学出版社,2007

[2] 何钦铭,冯雁,陈越. 数据结构课程设计浙江:浙江大学出版社,2007

[3] 李春葆,陶红艳,金晶,赵丙秀. 数据结构与算法教程. 北京:清华大学出版社,2007

[4] 赵文静. 数据结构与算法[M]. 北京: 科学出版社, 2007.8: 41-64

[5] 傅清祥,王晓东. 数据结构与算法设计[M]. 北京: 电子工业出版社, 2006.3: 31-46 8、附加程序代码

# include

# inclu de

# include

typedef struct

{

char num[5];

char name[9];

char sex[3];

char phone[13];

char addr[31];

}DataType;

typedef struct node

{

DataType data;

struct node * next;

}ListNode;

typedef ListNode * LinkList;

LinkList head;

ListNode *p;

int menu_select();

LinkList CreateList(void);

void InsertNode(LinkList head,ListNode *p);

ListNode *ListFind(LinkList head);

void DelNode(LinkList head);

void PrintList(LinkList head);

void main()

{

for( ; ; )

{

switch(menu_select())

{

case 1:

printf("*****************************\n");

printf("* 通讯录链表的建立*");

printf("*******************************\n");

head=CreateList();

break;

case 2:

printf("*****************************\n");

printf("* 通信者信息的添加*\n");

printf("*****************************\n"); printf("编号(4)姓名(8)性别(2)电话(11)地址(31)\n");

printf("*****************************\n");

p=(ListNode *)malloc(sizeof(ListNode));

scanf("%s%s%s%s%s",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,,p->data.sex,p->data.phone,p->data.addr);

InsertNode(head,p);

break;

case 3:

printf("*****************************\n");

printf("* 通信者信息的查询*\n");

printf("*****************************\n");

p=ListFind(head);

if(p!=NULL)

{

printf("编号姓名性别联系电话地址\n");

printf("*****************************\n");

scanf("%s,%s,%s,%s,%s",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,,p->data.sex,p->data.phone,p->data.addr);

printf("*****************************\n");

}

else

printf("没查到要查询的通信者!\n");

break;

case 4:

printf("*****************************\n");

printf("* 通信者信息的删除*\n");

printf("*****************************\n");

DelNode(head);

break;

case 5:

printf("*****************************\n");

printf("* 通讯录链表的输出*\n");

printf("*****************************\n");

PrintList(head);

break;

case 0:

printf("\t 再见!\n");

return ;

}

}

}

int menu_select()

{

int sn;

printf("* 通讯录管理系统*\n");

printf("===============================\n");

printf("* 1.通讯录链表的建立*\n");

printf("* 2.通信者结点的插入*\n");

printf("* 3.通信者结点的查询*\n");

printf("* 4.通信者结点的删除*\n");

printf("* 5.通讯录链表的输入*\n");

printf("0.退出管理系统\n");

printf("===============================\n");

printf("请输入0--5:");

for( ; ; )

{

scanf("%d",&sn);

if(sn<0||sn>5)

printf("\n\t输入错误,重选0--5:");

else

break;

}

return sn;

}

LinkList CreateList(void)

{

LinkList head=(ListNode *)malloc(sizeof(ListNode));

ListNode *p,*rear;

int flag=0;

rear=head;

while(flag==0)

{

p=(ListNode *)malloc(sizeof(ListNode));

printf("编号(4)姓名(8)性别(2)电话(11)地址(31)\n");

printf("*****************************\n");

scanf("%s%s%s%s%s",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,,p->data.sex,p->data.phone,p->data.addr);

rear->next =p;

rear=p;

printf("结束建表吗?(1/0):");

scanf("%d",&flag);

}

rear->next=NULL;

return head;

}

void InsertNode(LinkList head,ListNode *p)

{

ListNode *p1,*p2;

p1=head;

p2=p1->next;

while(p2!=NULL&&strcmp(p2->data.num,p->data.num)<0)

{

p1=p2;

p2=p2->next;

}

p1->next=p;

p->next=p2;

}

ListNode * ListFind(LinkList head)

{// 有序通讯录链表上的查找

ListNode *p;

char num[5];

char name[9];

int xz;

printf("===============\n");

printf(" 1. 按编号查询\n");

printf(" 2. 按姓名查询\n");

printf("=================\n");

printf(" 请选择: ");

p=head->next; //假定通讯录表带头结点

scanf("%d",&xz);

if(xz==1){

printf("请输入要查找者的编号:");

scanf("%s",num);

while(p && strcmp(p->data.num,num)<0)

p=p->next;

if(strcmp(p->data.num,num)==0)

printf("%s,%s,%s,%s,%s\n",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,, p->data.sex,p->data.phone,p->data.addr);

if(p==NULL||strcmp(p->data.num,num)>0)

p=NULL;//没有查到要查找的通讯者

}

else

if(xz==2){

printf("请输入要查找着的姓名:");

scanf("%s",name);

while(p && strcmp(p->https://www.wendangku.net/doc/7013436904.html,,name)!=0)

p=p->next;

}

return p;

}

void DelNode(LinkList head)

{

char k;

ListNode *p,*q;

p=ListFind(head); //调用查找函数

if(p==NULL)

{

printf("没有查到要删除的通讯着!\n");

return;

}

printf("真的要删除改结点嘛?(y/n) : ");

scanf("%c",&k);

if(k=='y'||k=='Y')

{

q=head;

while(q!=NULL && q->next!=p)

q=q->next;

q->next=p->next;//删除结点

free(p); //释放被删除的结点空间

printf("通讯者已被删除!\n");

}

}

void PrintList(LinkList head)

{

ListNode *p;

p=head->next;//使p指向链表开始结点

printf("编号姓名性别联系电话地址\n");

printf("--------------------------------------------\n");

while(p!=NULL)

{

printf("%s,%s,%s,%s,%s\n",p->data.num,p->https://www.wendangku.net/doc/7013436904.html,,

p->data.sex,p->data.phone,p->data.addr);

printf("--------------------------------------------\n");

p=p->next; //后移一个结点

}

}

相关文档
相关文档 最新文档