数据结构课程设计

首先是心得体会:

老实说做完这个真的是有心无力啊,原本计划使用java来实现的,本人自学了半个学期的java,感觉比学了一年的C语言更加有把握,但是,在java领域不知道如何使用链表的知识来完成通讯录的功能,其实我用java已经完成了该通讯录的功能了,但是不会引用链表的知识,最后只能选择用C++了,但是C++我把握得很不好,理解的还不够透切,原本在java里面我已经弄好界面和插入,登录,显示,功能了。这份设计我觉得最大的遗憾就是只能做出这样,远没有达到我想要的效果,没有界面,只有一个黑白的控制台是我十分不爽的。单纯地只有那五个功能,还不能满足我们对于通讯录的需求、

我最大的体会是,其实知识真的是很有魅力的,当我上网百度查找我期望的功能时,我就觉得,自己也能够做出来是多么值得骄傲和高兴的意见事情哦,原本以为是海市蜃楼,现在明明就在我的手指中实现、有人说学编程是一条死胡同,但我真的很享受,这段时间几乎每天都在熬夜做设计,我感觉也不错,真的学了好多东西,这些是在课堂上真的无法学到的,虽然有点累,但是那种喜悦的感觉真的倍儿爽,或许这就是知识点魅力吧。最后,感谢课程设计,感谢老师,感谢知识,但对不起了身子,不过,值了,真的值了

接下来是正文啦:

第一部分  绪论

1.1 课程设计的目的..................................................................................................... 3 

1.2 课程设计的背景与意义....................................................................................... 3

1.3 课程设计的环境...................................................................................................... 3 

第二部分  需求分析 

2.1 问题论述.................................................................................................................... 3 

2.2 功能要求................................................................................................................... 3 

 第三部分  系统设计

   3.1 项目说明,包括...........................................3

  3.2 设计的思路和关键数据结构............................................................................... 4

 第四部分   实现功能........................................... 4

第五部分   设计心得和体会                                      5

第一部分  绪论

1.1  课程设计的目的

通过设计一个较为简单的管理系统设计,进一步熟悉和了解数据结构的概念、实现方式。了解系统开发的需求分析、类层次设计、模块分析、编码测试、模块组装与整体调试的全过程,加深对C++的理解与VisualC++环境的使用;逐步熟悉程序设计的方法,并养成良好的编程习惯。

1.2  课程设计的背景与意义

    数据结构是一门实践性和抽象性很强的学科,光靠读书听课是学不好的。衡量学习好坏的标准并不是听不听得懂,作业会不会做,因此在强调多编程多实践。所以课程设计的目的,要熟练掌握数据结构的知识,C++语言的知识和基本技能,利用所学的知识解决面向对象的基本问题,这也是一个巩固基本知识的好的途径。

1.3  课程设计的环境

       本通讯录信息管理系统用计算机管理电子通讯录的一种计算机应用技术,在计算机还未普及之前通讯管理都是由联系人采用名片,笔录手工记帐的方式来操作的.现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理。通讯录管理系统是典型的信息管理系统,要求应用程序功能完备,易使用等特点。

本次课程设计通讯录管理系统采用的是Microsoft Visual C++6.0 编写程序

第二部分  需求分析

2.1   问题论述

     为方面大家整理自己的联系人,告别杂乱无章的生活。简单整洁的通讯录是现在大众所需的必要产品。

  

2.2   功能要求

实现通讯录管理系统的基本功能,可以实现电话用户的查询、电话号码的查询、电话号码的添加及删除等功能,以方便人们的记录和通讯,极大地方便人们的生活

 第三部分   系统设计

3.1 项目说明

(1)技术可行性:处理速度快、准确通过权限的设置,数据的安全性好、方便查询、借阅管理等。  

(2)经济可行性:系统建设不需要很大的投入、可缩减人力投入。

(3)运行上可行性

(4)从各种社会因素可行性分析:可降低工作人员工作强度,提高效率,同时会

得到学校工作人员的一致同意的。

综上所述通过可行性分析认为新系统的开发方案切实可行,可进行开发。

3.2 设计的思路和关键数据结构

 .程序流程

系统的执行应从功能菜单选择开始,依据用户的选择来进行后续的处理,直到用户选择退出系统为止,其间应对用户的选择做出判断及异常处理。系统的流程图如图所示

 第四部分   实现功能

 

1、      通讯录信息添加功能

查询这个方面:用户可以输入联系人的姓名、电话号码及住址,联系方式等。

进入主菜单界面,按照提示,输入1,进入通讯录添加功能模块。 输入你想要搜索通讯人的姓名  屏幕输出所搜索通讯人相关信息。  出现提示信息,是否继续,选1,回到主菜单, 选择0,退出程序。

2、      通讯录信息删除功能

在删除功能模板里面,用户只需要输入所需要删除的联系人的名字,就可以删除该联系人的所有信息,包括住址,联系方式等等。

3、通讯录信息查找功能

     在这个功能模板里面,用户只需要知道想要查找的联系人的名字,就可以查找到该联系人的所有的信息。

3、      通讯录信息显示功能

在通讯录信息显示功能模板,用户可以显示出之前所有输入的联系人的所有的信息,包括姓名,联系方式,家庭住址等等

5、用户登录

       登陆界面,用户必须输入正确的密码用用户账号才可以登陆通信录管理系统,其他外来用户无法进入本系统,保护了用户的信息安全。    

第五部分   心得体会

#include

#include

#include"windows.h"

using namespace std;

 

struct Phone

{

 charname[10];            //姓名

 charnumber[12];         //电话号码

 charadd[30];           //住址

 charpost[20];         //邮编

 intage;              //年龄

 charsex[2];         //性别

 charQQ[11];        //QQ

 charweixin[11];   //微信

 charbirth[20];   //生日

 struct Phone *next;

};

 

typedef struct Phone Node;

typedef Node *pNode;

 

void Check(pNode pHead)

{

 pNode ptr;

 ptr=pHead;

 charckName[10];

 cout<<"请输入您要查询人的姓名:"<

 cin>>ckName;

 while (ptr)

 {

  if(strcmp(ptr->name,ckName)==0)//strcmp是比较两个字符串是否相等

  {

  cout<<"您要查询的人的号码是:"<number<

  cout<<"您要查询的人的地址是:"<add<

  cout<<"您要查询的人的邮编是:"<post<

  cout<<"您要查询的人的年龄是:"<age<

  cout<<"您要查询的人的性别是:"<sex<

  cout<<"您要查询的人的QQ是:"<QQ<

  cout<<"您要查询的人的微信是:"<weixin<

  cout<<"您要查询的人的生日是:"<birth<

  break;

  }

 else

  {

  ptr=ptr->next;

  cout<<"您要查询的人的号码不存在!"<

  }

 

 }

}

 

void AddNewItem(pNode &pHead)

{

 pNode ptr;

 pNode newnode=new Node;

 ptr=NULL;

 

 cout<<"请输入您要添加人的姓名:"<

 cin>>newnode->name;

 cout<<"请输入您要添加人的电话号码:"<

 cin>>newnode->number;

 cout<<"请输入您要添加人的地址:"<

 cin>>newnode->add;

 cout<<"请输入您要添加人的邮编:"<

 cin>>newnode->post;

 cout<<"请输入您要添加人的年龄:"<

 cin>>newnode->age;

 cout<<"请输入您要添加人的性别:"<

 cin>>newnode->sex;

 cout<<"请输入您要添加人的QQ:"<

 cin>>newnode->QQ;

 cout<<"请输入您要添加人的微信:"<

 cin>>newnode->weixin;

  cout<<"请输入您要添加人的生日:"<

 cin>>newnode->birth;

 

 if(pHead)

 {

 ptr=pHead;

 while (ptr->next)

  {

  ptr=ptr->next;

  }

 newnode->next=NULL;

 ptr->next=newnode;

 }

 else

 {

 newnode->next=pHead;

 pHead=newnode;

 ptr=pHead;

 }

 cout<<"添加成功!"<

}

 

void view(pNode pHead)

{

 pNode ptr;

 ptr=pHead;

 while (ptr)

 {

 cout<name<<"\n"<number<<"\n"<add;

 cout<<"\n"<post<<"\n"<age<<"\n"<sex;

 cout<<"\n"<QQ<<"\n"<weixin<<"\n"<birth<

 ptr=ptr->next;

 }

}

 

void DeleteItem(pNode &pHead)

{

 pNode ptr,pBefore;

 ptr=pBefore=pHead;

 charckName[10];

 cout<<"请输入您要删除人的姓名:"<

 cin>>ckName;

   while (ptr!=NULL)

    {

  if(strcmp(ptr->name,ckName)==0)

  {

  break;

  }

 else

  {

  pBefore=ptr;

  ptr=ptr->next;

  }

    }

 

 if(ptr)

 {

  if(ptr==pHead)

  {

  pHead=ptr->next;

  delete ptr;

  }

 else

  {

  pBefore->next=ptr->next;

  delete ptr;

  }

 cout<<"删除成功!"<

 }

}

 

 intmain()

{

 

  inta=2;

  intb;

 char *user; //账号

 user=new char[10];

 char *password;  //密码

   password=new char[10];

 system("cls");

 cout<

 cout<

   cout<

   cout<

   cout<

   cout<

   cout<

   cout<

pr1:cout<<" 请输入管理员账号:";

 cin>>user;

   cout<<" 请输入管理员密码:";

 cin>>password;

 if(strcmp(user,"00000")==0&&strcmp(password,"00000")==0)

   {

 

   cout<

 Sleep(3000);

     system("cls");

 

      pNode pHead;

 pHead=NULL;

 intiChoice;

 cout<<"   |---------------------------------------|"<

 cout<<"1)."<<"|-----------------添加------------------|"<

 cout<<"2)."<<"|-----------------查看------------------|"<

 cout<<"3)."<<"|-----------------查询------------------|"<

 cout<<"4)."<<"|-----------------删除------------------|"<

 cout<<"5)."<<"|-----------------退出------------------|"<

 cout<<"   |----------请选择您要做的操作-----------|"<

 cout<<"  |---------------------------------------|"<

 while (cin>>iChoice)

 {

 switch (iChoice)

  {

 case 1:

  AddNewItem(pHead);//添加记录

  break;

 case 2:

  cout<<"您要查看的记录有:"<

  view(pHead);//显示记录

  break;

 case 3:

  Check(pHead);//查找记录

  break;

 case 4:

  DeleteItem(pHead); //删除记录

  break;

 case 5:

  cout<<"退出成功!"<

  return 0;

  }

 cout<<"  |---------------------------------------|"<

 cout<<"1)."<<"|-----------------添加------------------|"<

 cout<<"2)."<<"|-----------------查看------------------|"<

 cout<<"3)."<<"|-----------------查询------------------|"<

 cout<<"4)."<<"|-----------------删除------------------|"<

 cout<<"5)."<<"|-----------------退出------------------|"<

 cout<<"   |----------请选择您要做的操作-----------|"<

 cout<<"  |---------------------------------------|"<

 }

  }

 else

    {

      if (a==0)

      {

      cout<

      exit(0);

      }

      else

   cout<<" 登陆失败!请重新输入管理员帐号/密码,您还有"<

      a--;

   goto pr1;

   return false;

    }

   return 0;

}

 


 

 

源代码:

头文件:

#include

#include

#include

#include

#include

struct data                     //数据

{     

       charname[20];   //姓名

       chartel[20];   //电话

       intage;       //年龄

};

class node       //节点

{           

       friendclass link; //友远类

       private:         

       dataperson;    //数据

       node* next;

       node* pre;

       public:

       voidshow()           //显示数据信息

       {

              cout<<"姓名:"<

              cout<<"电话:"<

              cout<<"年龄:"<

       }

       node(char*name0="",char*tel0="",intage0=0)           //构造函数

       {

       strcpy(person.name,name0);

       strcpy(person.tel,tel0);

       person.age=age0;

       next=NULL;

       pre=NULL;

       }

       node(node&n)        拷贝构造

       {

              strcpy(person.name,n.person.name);

              strcpy(person.tel,n.person.tel);

              person.age=n.person.age;

 

       }

};

class link{             //双向链表

       node* head;   //头指针

       node* rear;    //尾指针

       node* findbyname(char*name0,node *temp )            //查找姓名返回地址

       {

              temp=head;

              if(!head)         //空链表

              {

                     cout<<"通讯录中没有信息"<

                     returnNULL;

              }

              node* p=head;

              while(p){

              if(strcmp(p->person.name,name0)==0)        //已找到

              returnp;

              p=p->next;

              }

              while(temp){

              if(Cmpstr(temp->person.name,name0))

              {

                     cout<

                     temp->show();

              }

              temp=temp->next;

              }

                     //if(temp)

                     //     cout<<"查无此人"<

              returntemp;

       }

              node* findbyname(char*name0)         //查找姓名返回地址

       {

              if(!head)         //空链表

              {

                     cout<<"通讯录中没有信息"<

                     returnNULL;

              }

              node* p=head;

              while(p){

              if(strcmp(p->person.name,name0)==0)        //已找到

              returnp;

              p=p->next;

              }

              if(!p)

           cout<<"查无此人"<

 

              returnNULL;//未找到

              }

       intlength()     //返回链表长度

       {

              if(!head)

                     return0;

              node*p;

              intn=1;

              p=head;

              if(p->next)

              {

                     p=p->next;

                     n++;

              }

              returnn;

       }

       node* findbynum(int num)   //根据序号查找

       {

              intl=length();               //l为总长

              if(!head)                //空链表

              {

                     cout<<"通讯录中没有信息"<

                     returnNULL;

              }

              if(num>l)              //数据越界

              {

                     cout<<"通讯录里没有"<

                     returnNULL;

              }

              node* p=head;

              while(--num)

                     p=p->next;

              returnp;         //返回指针

}

void change(node*p)//修改对应指针信息

{

       chartel0[20];

       intage0,cho;

       cout<<"请输入新的电话号码"<

       cin>>tel0;

       cout<<"请输入新的年龄"<

       cin>>age0;

       cout<<"姓名:"<person.name<

       cout<<"原电话号码:"<person.tel<

       cout<<"原年龄:"<person.age<

       cout<<"新电话号码:"<

       cout<<"新年龄:"<

       cout<<"1.确认              2.取消"<

       cin>>cho;

       if(cho==1)

       {

              strcpy(p->person.tel,tel0);

              p->person.age=age0;

              cout<<"已修改成功"<

       }

}

void del(node *p)   //删除一个节点

{

       if(!head)         //空链表

              {

                     cout<<"通讯录中没有信息"<

                     return;

              }

       if(p==head)                  //删除头结点

       {    

              p->next->pre=NULL;

              head=p->next;

              deletep;

              return;

       }

       if(p==rear)            //删除尾节点

       {

              p->pre->next=NULL;

              rear=p->pre;

              deletep;

              return;

       }

       p->next->pre=p->pre;    //删除中间节点

       p->pre->next=p->next;

       deletep;

}

void delall()           //删除整个链表

{

       node*p;

       while(head)

       {

              p=head;

              head=head->next;

              deletep;

       }

       head=rear=NULL;

}

public:

       link()             //构造函数

       {

              head=rear=NULL;

       }

       ~link(){         //析构函数,同时释放链表空间

       delall();

       }

       node* cinnode()           //从键盘输入生成一个节点

       {

              charname[20],tel[20];

              intage;

              node*p;

              p=newnode;

              cout<<"请输入姓名"<

              cin>>name;

              cout<<"请输入电话号码"<

              cin>>tel;

              cout<<"请输入年龄"<

              cin>>age;

              *p=node(name,tel,age);

              returnp;

       }

       voidinsert(node *p)             //将节点插入链表

       {

              node*p1,*p2;

              if(head==0)                  //空链表

              {  

                     p->next=0;

                     p->pre=0;

                     head=rear=p;

                     return;

       }

       if(strcmp(head->person.name,p->person.name)>0)

       {

              p->next=head;

              head->pre=p;

              p->pre=0;

              head=p;

              return;

       }

       if(strcmp(rear->person.name,p->person.name)<0)

       {

              p->pre=rear;

              rear->next=p;

              p->next=0;

              rear=p;

              return;

       }

       p1=p2=head;

       while(strcmp(p2->person.name,p->person.name)<0)

       {

              p1=p2;

              p2=p2->next;

       }

       p->next=p2;                  //插入链表中间

       p2->pre=p;

       p1->next=p;

       p->pre=p1;

}

void showfromhead()            //从前向后输出链表

{

       if(!head)                       //空链表

              cout<<"通讯录无信息"<

       else{

              intc=0;

              node*p;

              p=head;

              while(p)

              {

                     p->show();            //调用函数显示信息

                     p=p->next;

                     c++;

                     //if(c%5==0)         //控制每输出 5 个暂停一次

                     //system("pause");

              }

              cout<<"所有信息输出完成"<

             

       }

}

void showfromrear()             //从后向前输出链表

{

       if(!rear)

              cout<<"通讯录无信息"<

       else

       {

              int c=0;

              node*p;

              p=rear;

              while(p)

              {

                     p->show();

                     p=p->pre;

                     c++;

                     if(c%6==0)

                            system("pause");

              }

              cout<<"所有信息输出完成"<

       }

}

 

void showbyname(node *temp)     //根据姓名显示信息

{

       charname[20];

       cout<<"请输入欲查找的姓名"<

       cin>>name;

       node*p;

       p=findbyname(name,temp);          //查找姓名所对应的指针

       if(p)

              p->show();

 

}

void changebyname()            //根据姓名修改信息

{

       charname[20];

       cout<<"请输入欲修改的姓名"<

       cin>>name;

       node*p;

       p=findbyname(name);

       if(p)

              change(p);

}

void delbyname()          //根据姓名删除信息

{

       charname[20];

       if(!head)         //空链表

              {

                     cout<<"通讯录中没有信息"<

                     return;

              }

       cout<<"请输入欲删除的姓名"<

       cin>>name;

       node*p;

       p=findbyname(name);

       if(p)

              del(p);

       cout<<"已删除选定信息"<

}

void showbynum() //根据序号显示信息

{

       intnum;

       if(!head)         //空链表

              {

                     cout<<"通讯录中没有信息"<

                     return;

              }

       cout<<"请输入欲查找编号"<

       cin>>num;

       node*p;

       p=findbynum(num);      //根据序号查找指针

       if(p)

              p->show();

}

void delbynum()                  //根据序号删除信息

{

       intnum;

       if(!head)         //空链表

              {

                     cout<<"通讯录中没有信息"<

                     return;

              }

       cout<<"请输入欲删除编号"<

       cin>>num;

       node*p;

       p=findbynum(num);

       if(p)

              del(p);

       cout<<"已删除选定信息"<

}

void changebynum()      //根据序号修改信息

{

       intnum;

       if(!head)         //空链表

              {

                     cout<<"通讯录中没有信息"<

                     return;

              }

       cout<<"请输入欲修改编号"<

       cin>>num;

       node*p;

       p=findbynum(num);

       if(p)

              change(p); 

}

 bool Cmpstr(char*name_node,char*name_search)//

       {

              if(name_search[0]=='*') 

                     returntrue;

              charname1[20],name2[20];

              strncpy(name1,name_node,20);

              strncpy(name2,name_search,20);

              intsize1=strlen(name1),size2=strlen(name_search);

              for(inti=0;i

              {

                     if(name2[i]>='A'&&name2[i]<='Z')

                            name2[i]+=32;

              }

              for(inti1=0;i1

              {

                     if(name1[i1]>='A'&&name1[i1]<='Z')

                            name1[i1]+=32;

              }

                            for(inti2=0;i2

              {

                     if(name_search[i2]=='*')//通配符*,通配任意字符串,

                     {

                            for(intj=0;j

                            {

                                   if(name1[j]!=name2[j])

                                          returnfalse;

                            }

                            returntrue;

                     }

              }

              if(size1!=size2)           {

                     returnfalse;

              }

              for(inti3=0;i3

              {

                     if(name2[i3]=='?')/

                            continue;

                     if(name1[i3]!=name2[i3])

                            returnfalse;

              }

              returntrue;

       }

 

};

主函数:

#include "node.h"

void main();

char buffer[100];

 

void show_data(link &a){

           char c;

              cout<<"查看全部数据"<

              cout<<"1.顺序   2.逆序"<

              cin>>c;

              if(c=='1')

              { 

                     a.showfromhead();

                     system("pause");

                     cout<

                    system("cls");

                     return;

                    

              }

              if(c=='2')

              {

                     a.showfromrear();

                     system("pause");

                     cout<

                     system("cls");

                  return;

              }

              if(c!='1'&&c!='2')

              {

                     cout<<"inputerror"<

                     system("pause");

                     cout<

                     system("cls");

                     voidshow_data(link &a);

                return;

              }

};

void delet_data(link &a){

           char c;

              cout<<"删除数据"<

              cout<<"1.根据序号删除数据       2.根据姓名删除数据"<

              cin>>c;

              if(c=='1')

              {

                     a.delbynum();

                     system("pause");

                     cout<

                     system("cls");

                    

              }

              if(c=='2')

              {

                     a.delbyname();

                     system("pause");

                     cout<

                     system("cls");

                    

              }

              if(c!='1'&&c!='2')

              {

                     cout<<"inputerror"<

                     system("pause");

                     cout<

                     system("cls");

       voiddelet_data(link &a);

              }

};

void insert_data(link &a){

           cout<<"添加数据"<

              a.insert(a.cinnode());

              system("pause");

              cout<

              system("cls");

};

void updata(link &a){

           char c;

           cout<<"修改数据"<

              cout<<"1.根据序号修改数据       2.根据姓名修改数据"<

              cin>>c;

              if(c=='1')

              {

              a.changebynum();

              system("pause");

              cout<

              system("cls");

 

              }

              if(c=='2')

              {

                     a.changebyname();

                     system("pause");

                     cout<

                     system("cls");

 

              }

           if(c!='1'&&c!='2')

              {

                     cout<<"inputerror"<

                     system("pause");

                     cout<

                     system("cls");

              voidupdata(link &a);

              }

 

};

void search_data(link &a){

           char c;

              node*temp;

           cout<<"查找数据"<

              cout<<"1.根据序号查找数据       2.根据姓名查找数据(支持*与?的通配)"<

              cin>>c;

              if(c=='1')

              {

                    

                     a.showbynum();

                     system("pause");

                     cout<

                     system("cls");

 

              }

              if(c=='2')

              {

                     a.showbyname(temp);

                     system("pause");

                     cout<

                     system("cls");

              }

              if(c!='1'&&c!='2')

              {

                     cout<<"inputerror"<

                     system("pause");

                     cout<

                     system("cls");

              voidsearch_data(link &a);

      

              }

 

};

 

link a;

void menu(){

      

       charc;

       cout<<"\t\t通讯录管理系统"<

       cout<<"1.查看全部数据"<

       cout<<"2.删除数据"<

       cout<<"3.添加数据"<

       cout<<"4.修改数据"<

       cout<<"5.查找数据"<

       cout<<"请输入您需要的功能"<

       cin>>c;

      

       switch(c)

       {

       case'1':

               show_data(a);

                    menu();

                     break;

       case'2':

               delet_data(a);

                    menu();

                     break;

       case'3':

               insert_data(a);

                    menu();

                     break;

       case'4':

               updata(a);

                    menu();

                     break;

       case'5':

            search_data(a);

                    menu();

                  break;

       case'6':

              cout<<"从文件输入数据"<

              a.inputnode();

              system("pause");

              cout<

              system("cls");

              menu();

                     break;

       case'7':

               output_data(a);

                    menu();

                  break;

       case'8':

              cout<<"谢谢使用"<

              return;

       default:{

       cin.clear();

              cin.getline(buffer,100);

         cout<<"input error  "<

         system("pause");

         system("cls");

         menu();

             

              }

       }

return;

}

 

void main()           //显示菜单,并调用对应函数

{

 

   menu();  

}

你可能感兴趣的:(数据结构课程设计)