数据结构课程设计完整版

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通讯录操作系统
一.需求分析
当今时代是飞速发展的信息时代。

在各行各业中离不开信息管理以及处理,这正是计算机被广泛应用于管理系统的原因。

计算机管理的好处在于利用它能够进行信息储存以及信息编辑。

用计算机储存和控制,大大提高了工作效率也减少了好多人的工作量。

通讯录信息系统不仅仅帮助了人们记忆,同时也为不少管理者提供了方便。

其设计理念较简单,将传统的纸张与笔录方式改为计算机自动化进行通讯录信息管理,既省时间又提高工作效率。

用c语言构建的通讯录系统设计,通过课上学到一些关于结构体、数组、指针、函数以及循环函数的运用和字符串的处理等基本知识可以初步的实现通讯录的输入、显示、查找、删除等简单实用功能,给人们带来更多的方便。

通讯录信息系统的主要功能清单如下:
1) 建立通讯录链表;
2) 通讯者结点的插入(按编号的次序插入有序通讯录表);
3) 通讯者信息的查询(按编号或姓名查找通讯者信息);
4) 通讯者信息的删除(按编号或姓名删除通讯者信息);
5) 通讯录的显示(显示所有通讯者信息列表);
6) 通讯录信息系统的退出
测试数据见调试分析。

二.详细设计
算法分析:
↓↓↓↓↓↓
主函数流程图:
主函数流程图创建函数流程图:
显示通讯录流程图:
查找函数流程图
(1)find函数:
find函数流程图
(2)search函数
Search函数流程图删除操作流程图:
插入函数流程图:
退出函数流程图:
图11退出函数流程图
3)调试分析及测试结果
进入系统后,系统会出现图所示菜单:
在主菜单中输入1后,系统会给出提示,如图所示:
在主菜单中输入3后,输入要找的姓名。

在系统没有要找信息时或链表为空时,系统会给出提示,确认用户是否继续查找,如图所示:
(链表为空时的查找)
若要继续查找则按1 ,不是则按0,如图所示:
(链表非空的查找)
在主菜单中输入0后,系统会给出提示,提示用户输入相关信息,如图所示:
依次输入提示信息
输入信息:
1
wuyifei
nv
139********
Wuhan
2
ww
nv
132********
Wuhan
再在主菜单输入1后,程序显示如图所示:
在主菜单中输入2后输入要删除的编号,系统便自动删除要删除的通讯录信息,如图15所示:
按1显示查看是否删除如图:
输入4进行插入操作,如图所示:插入信息如下2
wyf
nv
12345678912
wuhan
按1进行显示如下图:
现在如果没有其他的操作则可按5退出,操作如图所示:
实验心得:
通过这次课程设计,我熟练的掌握了结构体、数组、指针、函数以及循环函数的运用和字符串的处理,了解代码中出现错误寻找错误的方法,初步了解到了一个完整的应用程序,应该如何处理美观与实用之间的关系,如何处理实际需求与操作难度之间的关系,并让我深刻了解到数据结构这门课的重要性和实用性,在以后的学习中,我将更加努力的学习并动手实践这门课程。

4)用户手册
该设计主要运用C语言中的结构体、数组、链表、等数据结构,设计一个简单的管理系统应用程序。

本程序仅设计出了通讯录管理系统的基本功能以及简单的界面,使用的是数组的相关操作,包括结构体数组的输入、输出、查找、删除等。

用户仅需根据主菜单的提示操作进行创建新纪录、插入新记录、删除记录、显示记录信息、按姓名查找信息和退出系统等功能便可、操作较为简单,易于了解和操作。

5)附录
程序源代码:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define maxsize 100
#define NULL 0
#define LEN sizeof(struct record)
#define S "%ld %s %s %s %s"
struct record /*定义通讯链表的结构体类型*/
{
long num;
char name[20];
char sex[3];
char tel[12];
char address[40];
struct record *next;
};
int n;
/*----------------建立通讯链表-----------------*/
struct record *creat(void) /*定义create函数,作用:带回一个指向链表表头的指针*/
{
struct record *head;
struct record *p1,*p2;
n=0;
p1=p2=(struct record*)malloc(LEN);
printf("请依次输入编号,姓名,性别,电话,住址\n");
scanf(S,&p1->num,p1->name,p1->sex,p1->tel,p1->address);
head=NULL;
while(p1->num!=0)
{
n=n+1;
if(n==1)
head=p1;
else p2->next=p1;
p2=p1;
p1=(struct record*)malloc(LEN);
scanf(S,&p1->num,&p1->name,&p1->sex,&p1->tel,&p1->address);
}
p2->next=NULL;
return(head);
}
/*------------通讯链表的插入------------*/
struct record *insert(struct record *head,struct record *rec)
{
struct record *p0,*p1,*p2;
p1=head; /*p1指向第一个结点*/
p0=rec; /*p0指向待插入结点*/
printf("请输入要插入人员的编号,姓名,性别,电话,地址:\n");
scanf(S,&rec->num,rec->name,rec->sex,rec->tel,rec->address);
if(head==0) /*原来链表为空则p0指向结点作为头结点*/
{
head=p0;
p0->next=NULL;
return head;
}
else /*原链表不为空则进行比较插入*/
{
while ((p0->num>p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1)
head=p0;
else
{
p2->next=p0;
p0->next=p1;
}
}
else
{
p1->next=p0;
p0->next=NULL;
}
n=n+1;
return (head);
}
}
/*-----------通讯链表的删除-----------*/
struct record *del(struct record *head,long num)
{
struct record *p1,*p2;
if(head==NULL) /*查看通讯链表是否为空*/
{
printf("\n list null! \n");
}
p1=head;
while(num!=p1->num&&p1->next!=NULL) /*p1指向的不是所要找的结点,并且后面还有结点*/
{
p2=p1; /*p1后移一个结点*/
p1=p1->next;
}
if(num==p1->num) /*当所查结点找到时*/
{
if(p1==head) /*情况1:p1指向首结点,则把第二个结点地址给head*/
head=p1->next;
else p2->next=p1->next; /*情况2:将下一结点地址赋给前一结点地址中*/
printf("delete:%ld\n",num);
n=n-1;
}
else
printf("%ld notbeen found!\n",num);
return (head);
}
/*-------------通讯录的显示------------*/
void print(struct record *head)
{
struct record *p;
printf("\nNow,these %d records are :\n",n);
p=head;
if(head!=NULL)
do
{
printf("编号:%ld,姓名:%s,性别%s,电话号码:%s,家庭住址:%s\n",p->num,p->name,p->sex,p->tel,p->address);
p=p->next;
}
while(p!=NULL);
printf("\n");
}
/*----------通讯链表信息查询----------*/
int find(struct record rec[],int n)
{
int i;
char s[20];
printf("请输入的姓名\n");
scanf("%s",s);
for(i=0;i<n;i++)
if(strcmp(s,rec[i].name)==0) /*查看输入姓名和通讯录中姓名是否相同*/ return i;
else return -1;
}
void search(struct record rec[],int n)
{ int i,ch;
i=find(rec,n);
if(i==-1)
{
printf("没有找到要查找的记录,是否重新输入,是按1,否按0\n");
scanf("%d",&ch);
if(ch==1)
search(rec,n);
}
else
printf("编号:%ld,姓名:%s,性别%s,电话号码:%s,家庭住址:%s",rec[i].num,rec[i].name,rec[i].sex,rec[i].tel,rec[i].address);
}
/*-----------通讯录的退出-----------*/
int exit()
{
int n;
n=-1;
printf("~~~~~~~~~~~~~~~~~~~~~~谢谢使用~~~~~~~~~~~~~~~~~~~~~~~~~\n");
return n;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~主菜单~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int menu()
{int m;
printf("~~~~~~~~~~~~~~~~~~~~~~~~~欢迎使用通讯录管理系统~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~主菜单~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t 0.创建通讯录\n");
printf("\t 1.显示通讯录\n");
printf("\t 2.删除通讯录\n");
printf("\t 3.查找通讯录\n");
printf("\t 4.插入通讯录\n");
printf("\t 5.退出通讯录\n");
do {printf("\t\t\t 请输入选项0-5\n");
scanf("%d",&m);}
while(m<0||m>5);
return m;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~主函数~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int main()
{
struct record *creat(void);
struct record *insert(struct record *head,struct record *rec);
struct record *del(struct record *head,long num);
void print(struct record *head);
int find(struct record rec[],int n);
void search(struct record rec[],int n);
int num,m=0;
struct record *rec,*head=NULL;
while(m>=0)
{
switch (menu())
{
case 0:head=creat();break;
case 1:print(head);break;
case 2:
printf("请输入num值:\n");
scanf("%d",&num);
head=del(head,num);break;
case 3:search(head,n);break;
case 4:
rec=(struct record*)malloc(LEN);
head=insert(head,rec);break;
case 5:m=exit();break;
default:printf("输入错误,请重新输入\n");
}
}
return 0;
}。

相关文档
最新文档