数据结构课程设计 第四题

这篇博客介绍了广东海洋大学数据结构课程设计的一个项目,旨在设计一个管理客户电话的程序。作者使用C++,基于单链表实现客户信息的输入、查找、删除和清空等功能,并提供了完整的程序代码和运行结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


广东海洋大学

 

 

 

 

                                    数据结构程序设计

                                                              





                
                                                                       班级:物联1131

                                                                       学号:201311672129
   
                                                                       姓名:赵晓兰
                                                                        
                                                                       老师:易学明        









一、实验目的

     通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。

 



二、设计题目

     赵斌是一个信管专业的学生,大学四年顺利毕业了。在毕业季,他也像其他学子一样,投身于求职大军,投出一份又一份求职简历,在苦苦地等待之后,他接到了中国移动通信公司广东分司的面试通知书,通知他于本月1号10点到公司面试。当天,晴空万里,艳阳高照,他身着西装,高兴地早早来到公司楼下等待。10点钟整,他和其他新人一起,坐到公司的面试现场。他领取的一一份程序设计题:假如你是我公司一名客服技术人员,现请你选择自己熟悉的语言,来设计一个程序,管理客户向公司打进来的咨询电话。

 




三、要求

   1. 选择自己熟悉的语言,来设计一个程序

    2.写好份完整的程序,并实例测试求图

 



四、分析

1.使用方法:题目要求使用数据结构的知识来设计一个程序管理客户打进公司的电话,那么管理就应该包括客户信息的输入、查找、删除、清空输入记录等功能。而单链表可以实现上述的功能,因此可以使用从单链表中学到的知识、结合结构体与类来设计一个程序,完成对客户打进公司的电话的管理。

2.编程软件:Microsoft Visual C++ 6.0

 


五、实现代码

1.新建工程与头文件:在编程软件VC++ 6.0中新建一个空的工程,将其命名为“sjjg”,然后再在该工程里新建一个头文件“link_number.h”,该头文件包含以下代码:

 


#ifndef Number_H

#define Number_H

#include <iostream> 

#include <iomanip> 

using namespace std; 

 

template <typename T> 

struct Node 

    charname[20];

    Tdata; 

   Node<T> *next; 

}; 

 

template <typename T> 

class Number 

private: 

    intm_length; 

   Node<T> *head; 

public: 

   Number(); 

    voidm_Init();                                    //输入n个学生数据 

    voidm_Insert();                                 //在表中s的位置插入x 

    voidm_Find_Loc();                              //在表中查找序号为i的元素 

    voidm_Find_Val();                           //在表中查找值与x相等的元素 

    voidm_Del();                              //在表中删除序号为s的元素 

    voidm_Destroy();                                  //删除成绩表 

    voidm_Show();                              //把表中所有元素打印出来 

    voidChoice_menu();

  

}; 

 

#endif 

 

 

template <typename T> 

Number<T>::Number() 

    head= new Node<T>; 

   head->next = NULL; 

   m_length = 0; 

 

template <typename T> 

void Number<T>::m_Init() 

    cout<< "\n欢迎来到输入记录界面\n" << endl; 

    intn = 0; 

   Node<T> *p, *q; 

    q =head; 

    if(head->next != NULL) 

       head->next = NULL; 

    cout<< "请设置你要输入客户记录的数目:"; 

    cin>> n; 

    for(int i = 0; i < n; i++) 

   { 

       

       p = new Node<T>; 

       cout << "\n请输入第" << i + 1 << "位客户的名字和号码(用空格号隔开):"; 

       cin >> p->name>>p->data; 

       q->next = p; 

       q = p; 

       q->next = NULL; 

       m_length++; 

   } 

    cout<< "\n客户信息输入完毕." << endl; 

    cout<< "\n"; 

   this->m_Show(); 

   system("pause");                        //暂停 

   system("cls");                       //清屏 

 

template <typename T> 

void Number<T>::m_Insert() 

    cout<< "\n欢迎来到插入记录界面\n" << endl; 

   this->m_Show(); 

    ints; 

   Node<T> *p, *t; 

    p =head; 

    cout<< "请输入你想要插入客户记录的位置:"; 

    cin>>s; 

   while (s <= 0 || s > m_length + 1) 

   { 

       cout << "\n插入的位置不正确,请重新输入一个正确的位置:"; 

       cin >> s; 

   } 

    for (int i = 0; i < s - 1; i++) 

       p = p->next; 

    t =new Node<T>; 

    cout<< "\n请输入你想插入的客户名和号码(用空格号隔开):"; 

   cin>>t->name>> t->data; 

   t->next = p->next; 

   p->next = t; 

   m_length++; 

    cout<< "\n客户记录插入完毕." << endl; 

    cout << "\n"; 

   this->m_Show(); 

   system("pause"); 

   system("cls"); 

 

template <typename T> 

void Number<T>::m_Find_Loc() 

    cout<< "\n欢迎来到按系统默认编号查找界面\n" << endl; 

   this->m_Show(); 

    ints; 

   Node<T> *p; 

    p = head; 

    cout<< "请输入你想要查找的客户记录的位置:"; 

    cin>> s; 

   while (s <= 0 || s > m_length) 

   { 

       cout << "\n你输入的编号有误,请重新输入一个正确的编号:"; 

       cin >> s; 

   } 

    for(int i = 0; i < s; i++) 

       p = p->next; 

    cout<< "\n你想要查找的客户和号码为:"; 

    cout<<p->name<<setw(6)<< p->data << endl; 

    cout<< "查找完毕."<< endl; 

   system("pause"); 

   system("cls"); 

 

 

template <typename T> 

void Number<T>::m_Find_Val() 

    cout<< "\n欢迎来到按客户号码查找界面\n" << endl; 

   // this->m_Show();        //加了这句话,将在按号查找中显示出客户的名字与号码.

    boolt = false; 

    inti = 1; 

   Node<T> *p; 

    p =head->next; 

    Tx; 

    cout<< "请输入想要查找的号码:"; 

    cin>> x; 

   while (p != NULL) 

   { 

       if (x == p->data) 

       { 

           cout << "\n你查找的号码的客户名为:" << p->name << endl; 

           t = true; 

       } 

       p = p->next; 

       i++; 

   } 

    if(t == false) 

       cout << "\n没有符合条件的客户记录." << endl; 

   system("pause"); 

   system("cls"); 

  

template <typename T> 

void Number<T>::m_Del() 

    cout<< "\n欢迎来到删除记录界面\n" << endl; 

   this->m_Show(); 

    ints; 

   Node<T> *p, *q; 

    p =head; 

    cout<< "请输入你想要删除的客户的位置为:"; 

    cin>> s; 

   while (s <= 0 || s > m_length) 

   { 

       cout << "\n你输入的客户位置有误,请重新输入一个正确的客户位置:"; 

       cin >> s; 

   } 

    for(int i = 0; i < s - 1; i++) 

       p = p->next; 

    q =p->next; 

   p->next = q->next; 

    cout<< "\n你删除的客户和号码为:"; 

    cout<< q->name<<setw(6)<<q->data << endl; 

   delete q; 

   m_length--; 

    cout<< "\n删除完毕."<< endl; 

    cout<< "\n"; 

   this->m_Show(); 

   system("pause"); 

   system("cls"); 

 

template <typename T> 

void Number<T>::m_Destroy() 

   Node<T> *p, *q; 

    p = head; 

    q =p; 

    for(int i = 0; i < m_length; i++) 

   { 

       q = q->next; 

       delete p; 

       p = q; 

   } 

   m_length = 0; 

cout << "\n记录表清空完毕.\n" <<endl; 

 

 

 

template <typename T> 

void Number<T>::m_Show() 

    if(head->next == NULL) 

   { 

       cout << "\n记录表里数据为空,显示操作失败!!"; 

       return; 

   } 

     

   

    Node<T>*p;

 

    p =head->next; 

    cout<< "\n记录表中所有客户和号码为:" << endl; 

   while (p != NULL) 

   { 

        cout<<"客户姓名:"<<p->name<<setw(20)<<"客户号码:"<< p->data <<endl;

       p = p->next; 

   } 

    cout<< endl; 

    cout<< "\n\n"; 

 

 

template <typename T> 

void Number<T>::Choice_menu(){ 

    intch; 

    cout<< "┏--------------------------------------------------------------------- --------┓"; 

    cout<< "┃ ┏---------------------------客户通话管理-------------------------┓  ┃"; 

    cout<< "┃ ┃                                                                                              ┃ ┃"; 

    cout<< "┃ ┃                                                                                              ┃ ┃"; 

    cout<< "┃ ┃                         1. 输 入 记 录                                              ┃ ┃"; 

    cout<< "┃ ┃                         2. 插 入 记 录                                              ┃ ┃"; 

    cout<< "┃ ┃                         3. 按系统默认编号查找                             ┃ ┃"; 

    cout<< "┃ ┃                         4. 按客户号码查找                                     ┃ ┃"; 

    cout<< "┃ ┃                         5. 删 除 记 录                                              ┃ ┃"; 

    cout<< "┃ ┃                         6. 清 空 记 录                                              ┃ ┃";   

    cout<< "┃ ┃                         0. 退       出                                                  ┃ ┃"; 

    cout<< "┃ ┃                                                                                              ┃ ┃"; 

    cout<< "┃ ┗----------------------------------------------------------------------┛  ┃"; 

    cout<< "┗------------------------------------------------------------------------------┛"; 

    cout<< "                                                                               "; 

    cout<< "                                                                               "; 

    cout<< "请选择你要执行的选项:"; 

    cin>> ch; 

   while (ch != 1 && ch != 2 && ch != 3 && ch != 4&&ch != 5 &&ch != 6 &&ch != 0){ 

       cout << "\n没有该选项,请重新选择." << endl; 

       cout << "\n请选择你要执行的选项:"; 

       cin >> ch; 

   } 

   switch (ch){ 

    case1: 

       system("cls"); 

       this->m_Init(); 

       break; 

    case2: 

       system("cls"); 

       this->m_Insert(); 

       break; 

    case3: 

       system("cls"); 

       this->m_Find_Loc(); 

       break;

    case4: 

       system("cls"); 

       this->m_Find_Val(); 

       break; 

    case5: 

       system("cls"); 

       this->m_Del(); 

       break; 

    case6: 

       system("cls"); 

       this->m_Destroy(); 

       break; 

    case0: 

       cout << "\n 感谢您的使用!\n" << endl;

       exit(EXIT_FAILURE);                          //用于退出操作

   } 




2.创建源文件:在工程“sjjg”中新建一个源文件“link_main.cpp”,该源文件包含以下代码:

#include "link_number.h" 

#include <iostream> 

using namespace std; 

 

int main() 

  Number<int> ss;

   while(1)

       ss.Choice_menu(); 

   return 0; 

 

 

3.程序运行结果








(1)客户通话管理界面.






(2)客户记录的输入.






(3)客户记录的插入.




(4)按编号查找界面.






(5)按客户号码查找.






(6)客户记录的删除.






(7)记录表的清空.






(8)退出客户通话管理






.

六、心得

       之前忙着考试的事,静下心来的时间也只是一两天,实际上这也是别人做好的,我的感觉就是就像复制别人的一样,但是,不同的事这一次有很认真的思考

,但是还是有很多不懂,实操还好,毕竟大一学过c++,但是感觉这比c++好懂,但是一提到用c++来实现,整个人都不好咯,想到就后怕,幸好同学们的帮忙,不过还是有心无力啊,希望这次这个老师能满意。虽然都是别人的,但我也努力了,说实在的,真的不是所有学c++和数据结构的都能做出 。






数据结构课程设计 一,约瑟夫环 二、停车场管理 四、校园导游程序 (轻院) 一、 约瑟夫环 本次实习的主要目的在于熟悉线性表的基本运算在两种存储结构上的实现,其中以熟悉各种链表的操作为侧重点。通过本次实习还可帮助读者复习高级语言的使用方法。 [问描述]  约瑟夫(Joeph)问的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 [基本要求]  利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 [测试数据]  自己设定 [实现提示]  程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码。设n≤30。 [选作内容]  向上述程序中添加在顺序结构上实现的部分。 二、 停车场管理 仅仅认识到栈和队列是两种特殊的线性表是远远不够的,本次实习的目的在于使读者深入了解栈和队列的特征,以便在实际问背景下灵活运用它们;同时还将巩固这两种结构的构造方法,接触较复杂问的递归算法设计。 [问描述]   设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。 [测试数据]   设n=2,输入数据为:(‘A’,1,5),(‘A’,2,10),(‘D’,1,15),(‘A’,3, 20), (‘A’,4,25),(‘A’,5,30),(‘D’,2,35),(‘D’,4,40),(‘E’,0,0)。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A’表示到达;‘D’表示离去,‘E’表示输入结束。 [基本要求]   以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,对每一组输入数据进行操作后的输出数据为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车离去;则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表实现。 [实现提示]   需另设一个栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车,也用顺序存储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。 [选作内容]   (1) 两个栈共享空间,思考应开辟数组的空间是多少?   (2) 汽车可有不同种类,则它们的占地面积不同,收费标准也不同,如1辆客车和1.5辆小汽车的占地面积相同,1辆十轮卡车占地面积相当于3辆小汽车的占地面积。   (3) 汽车可以直接从便道上开走,此时排在它前面的汽车要先开走让路,然后再依次排到队尾。   (4) 停放在便道上的汽车也收费,收费标准比停放在停车场的车低,请思考如何修改结构以满足这种要求。 三、 员工管理系统 综合运用线性表、查找、排序的相关知识,解决一个实际应用问。通过本次实习,要求熟练掌握线性表的存储结构,能在对应的存储结构上进行各种操作,并能分析不同的查找和排序方法的时空性能。 [问描述]   每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。 [基本要求]   (1) 排序:按不同关键字,对所有员工的信息进行排序。   (2) 查询:按特定条件查找员工。   (3) 更新:按编号对某个员工的某项信息进行修改。   (4) 插入:加入新员工的信息。   (5) 删除:按编号删除已离职的员工的信息。 [选作内容]   实现图形用户界面。 四、校园导游程序 [问描述]   用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够回答有关景点介绍、游览路径等问。 [基本要求]   (1) 查询各景点的相关信息;   (2) 查询图中任意两个景点间的最短路径。   (3) 查询图中任意两个景点间的所有路径。   (4) 增加、删除、更新有关景点和道路的信息。 [选作内容]   (1) 求多个景点的最佳(最短)游览路径。   (2) 区分机动车道和人行道。   (3) 实现导游图的仿真界面。
1. 把一个链表反向,递归,非递归都写一遍。 1.试编写3个函数实现   (1)建立一个双向链表   (2)插入一个节点   (3)删除一个节点 2.自己定义数据结构,写出程序:二叉树的前序遍历。 3.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。 4.下面哪种排序法对12354最快 a quick sort b.buble sort c.merge sort 5.哪种结构,平均来讲,获取一个值最快 a. binary tree b. hash table c. stack 6.一个二叉树的三种遍历方法的输出结果 7.链表按升序打印每打印完一个节点就将该节点从链表中删除 8.选择一种算法来整理出一个链接表。你为什么要选择这种方法?现在用o(n)时间来做。 9. 用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。    10.给两个变量,如何找出一个带环单链表中是什么地方出现环的? 11.哈希表和数组的定义,区别,优缺点。 12.链接表和数组之间的区别是什么? 任选一门语言,当场定义二叉排序树数据结构,写出两个函数:初始化,删除一个节点,20分钟 13. 递归的折半查找算法[不限语言] 14. 解释一下什么是B+树,如何实现B+树的查找和插入.(用图示) 15.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。 13.排序方法比较 (intel) 排序方法 平均时间 最坏时间 辅助存储 直接插入排序 O(N2) O(N2) O(1) 起泡排序 O(N2) O(N2) O(1) 快速排序 O(Nlog2N) O(N2) O(Nlog2N) 简单选择排序 O(N2) O(N2) O(1) 堆排序 O(Nlog2N) O(Nlog2N) O(1) 归并排序 O(Nlog2N) O(Nlog2N) O(n) 基数排序 O(d(n+radix)) O(d(n+radix)) O(radix) 17.一个链表的操作,注意代码的健壮和安全性。要求: (1)增加一个元素; (2)获得头元素; (3)弹出头元素(获得值并删除)。 18.内排序算法 19.折半查找的复杂度,证明 20.sizeof()和strlen()的使用. 21.顺序存储结构的优点,散列法的思想是什么? 22.汉罗塔算法,不能递归... 23.一个链表的结点结构 struct Node { int data ; Node *next ; }; typedef struct Node Node ; (1)已知链表的头结点head,写一个函数把这个链表逆序 ( Intel) (2)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表 依然有序。 (3)已知两个链表head1 和head2 各自有序,请把它们合并成一个链表 依然有序,这次要求用递归方法进行。 ( Autodesk) 24.编最优化Bubble(int *pIntArray,int L),要求:交换元素不能用临时变量,如果有序需要最优。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值