单链表的使用 通讯录
单链表通讯录课程设计
单链表通讯录课程设计一、引言随着社会的发展,人们之间的联系越来越紧密,通讯录成为了人们生活中必不可少的工具。
通讯录是一种记录联系人信息的工具,可以帮助人们随时随地地查找联系人信息。
本文将介绍一个基于单链表的通讯录课程设计。
二、需求分析1. 功能需求:本系统主要功能是实现通讯录的增删改查操作,包括添加联系人、删除联系人、修改联系人信息和查找联系人等。
2. 性能需求:系统需要保证数据存储和操作的高效性和稳定性,同时界面友好易用。
3. 安全需求:系统需要保护用户数据安全,防止数据泄露或被恶意攻击。
三、设计思路1. 数据结构选择:本系统采用单链表作为数据结构,每个节点表示一个联系人信息。
2. 系统架构设计:本系统采用MVC模式进行设计,即将界面、业务逻辑和数据分离。
界面由View层实现,业务逻辑由Controller层实现,数据由Model层实现。
3. 界面设计:本系统主要界面分为两个部分:通讯录列表和操作区域。
通讯录列表展示所有已添加的联系人信息;操作区域包括添加、删除、修改和查找等功能按钮。
四、系统实现1. Model层实现:(1)定义节点结构体:struct Node{char name[20];char phone[20];char email[30];struct Node *next;};(2)定义单链表相关操作函数:void addNode(Node *head); //添加联系人void deleteNode(Node *head); //删除联系人void modifyNode(Node *head); //修改联系人信息void searchNode(Node *head); //查找联系人信息2. View层实现:(1)使用Qt框架进行界面设计;(2)将通讯录列表展示在QListWidget控件中;(3)将操作按钮放置在QPushButton控件中。
3. Controller层实现:(1)将View层和Model层连接起来;(2)处理用户交互事件,如按钮点击事件;(3)调用Model层的相关函数进行数据处理。
链表通讯录课程设计
链表通讯录课程设计一、教学目标本课程的目标是让学生掌握链表在通讯录管理中的应用。
具体来说,知识目标包括理解链表的基本概念、结构及其在通讯录中的作用;技能目标则是培养学生运用链表进行通讯录数据管理的能力,包括创建、删除、查找和修改通讯录信息;情感态度价值观目标则是培养学生对计算机科学的好奇心、探索精神和责任感。
二、教学内容本课程的教学内容主要包括链表的基本概念、结构及其在通讯录管理中的应用。
具体安排如下:1.第一课时:链表的基本概念和结构。
介绍链表的定义、特点及其与数组的区别。
2.第二课时:链表的创建与删除。
讲解如何创建一个链表、如何删除链表中的节点以及如何释放链表内存。
3.第三课时:链表的查找与修改。
教授如何查找链表中的节点、如何修改链表中的节点数据以及如何实现链表的排序。
4.第四课时:链表在通讯录中的应用。
结合实际案例,讲解如何使用链表管理通讯录信息,包括增加、删除、查找和修改通讯录条目。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。
主要包括:1.讲授法:用于讲解链表的基本概念、结构和通讯录管理的基本原理。
2.案例分析法:通过分析实际案例,让学生了解链表在通讯录中的应用。
3.实验法:让学生动手实践,实际操作链表的操作方法,提高其实际应用能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《数据结构与算法》。
提供链表的基本概念、结构和算法。
2.多媒体资料:包括链表的动画演示、实际案例的视频讲解等,帮助学生更直观地理解链表的操作。
3.实验设备:提供计算机和编程环境,让学生可以实际操作链表的操作方法。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面、客观、公正地评价学生的学习成果。
具体安排如下:1.平时表现:占比30%,通过课堂参与、提问、小组讨论等方式评估学生的学习态度和理解程度。
2.作业:占比30%,布置与课程内容相关的编程练习,评估学生的实际操作能力。
通讯录说明书
void insert_person(person &l,information *a)/*插入联系人信息
void deletelinklist(person p)/*删除联系人*/
void Main_OnCommand/*查找联系人信息以及修改*/
参考文献
1 严蔚敏,吴伟民.《数据结构(C语言版)》.清华大学出版社.
2 严蔚敏,吴伟民.《数据结构题集(C语言版)》.清华大学出版社.
3 《DATA STRUCTURE WITH C++》. William Ford,William Topp.清华大学出版社(影印版).
4 谭浩强.《c语言程序设计》. 清华大学出版社.
fwrite(&pa->next->data,1,sizeof(Elemtype),pfile);//将数据写入文件。
fflush(pfile);//刷新缓冲区。将缓冲区数据写入文件
fclose(pfile);//关闭文件
listtraverse(la,writetofile);//将客户信息写入文件
p=p->next;
if(!strcmp(p->name,name))
{
//******修改联系人的信息
//MessageBox(hwnd,p->,TEXT(""),MB_OK);
//MessageBox(hwnd,p->data.age,TEXT(""),MB_OK);
}
else
{
init_person(pa);
return TRUE;
数据结构课程设计(通讯录)
数据结构课程设计(通讯录)
题目描述:
设计一个通讯录程序,实现以下功能:
1. 添加联系人信息
2. 删除联系人信息
3. 修改联系人信息
4. 查找联系人信息
5. 显示所有联系人信息
6. 退出程序
要求:
1. 使用链表作为数据结构存储联系人信息
2. 界面友好,操作简单方便
3. 能够防止重复添加联系人信息
设计思路:
1. 定义一个结构体Contact表示联系人信息,包括姓名、电话、邮箱等成员变量。
2. 定义一个链表结构体List表示联系人链表,包括头结点、
节点数量等成员变量。
3. 实现添加联系人信息函数,首先判断联系人是否存在,如果存在则提示用户,否则分配一个新的节点,并将联系人信息存储在节点中,将新节点插入链表中。
4. 实现删除联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则在链表中删除该节点。
5. 实现修改联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则修改节点中的信息。
6. 实现查找联系人信息函数,遍历链表查找是否有匹配姓名的联系人。
7. 实现显示所有联系人信息函数,遍历链表打印出所有联系人信息。
8. 在main函数中调用上述函数,根据用户输入的指令调用对应的函数,直到用户选择退出程序。
数据结构课程设计实验报告 完整版
第一章链表的应用线性表是数据结构中最简单、最常用的一种线性结构,也是学习数据结构全部内容的基础,其掌握的好坏直接影响着后继课程的学习。
线性表的顺序存储结构,即顺序表的概念相对比较简单,因此,本章的主要任务是使用有关单链表的操作来实现通讯录信息系统的管理。
1.1设计要求本章的设计实验要求使用有关链表的操作来实现通讯录信息系统的管理。
为了验证算法,通讯录管理包括单通讯录链表的建立、通讯者的插入、通讯者的删除、通讯者的查询及通讯录表的输出等。
主控菜单的设计要求使用数字0—5来选择菜单项,其他输入则不起作用。
程序运行后,给出6个菜单项的内容和输入提示:1.通讯录链表的建立2. 通讯者结点的插入3. 通讯者结点的查询4. 通讯者结点的删除5. 通讯录链表的输出0. 退出管理系统请选择0—5:1.2设计分析1.2.1主控菜单函数设计分析1.实现循环和功能选择首先编写一个主控菜单驱动程序,输入0—5以进入相应选择项。
假设输入选择用变量sn存储,它作为menu_select函数的返回值给switch语句。
使用for循环实现重复选择,并在主函数main()中实现。
实际使用时,只有选择大于5或小于0的值,程序才能结束运行,这就要使用循环控制。
这里使用for循环语句实现菜单的循环选择,为了结束程序的运行,使用了“return”语句,也可以使用“exit(0);”语句。
2.得到sn的合理值如前所述,应该设计一个函数用来输出提示信息和处理输入,这个函数应该返回一个数值sn,以便供给switch语句使用。
假设函数名为menu_select,对于sn的输入值,在switch 中case语句对应数字1—5,对于不符合要求的输入,提示输入错误并要求重新输入。
将该函数与主函数合在一起,编译运行程序,即可检查并验证菜单选择是否正确。
1.2.2功能函数设计分析1.建立通讯录链表的设计这里实际上是要求建立一个带头结点的单链表。
建立单链表有两种方法,一种称之为头插法,另一种称为尾插法。
数据结构单链表通讯录
实验报告实验名称单链表通讯录一、实验目的1.熟练掌握线性表的类型定义方法、存储方法及其基本运算(元素的插入、删除等)的实现方法,培养综合运用所学知识,根据具体问题进行数据结构设计和算法设计的能力。
二、实验内容1.用带头结点的单链表作存储结构,实现通讯录单链表的建立、查询、修改、排序、合并、统计、结点的查找、移动以及通讯录链表的输出功能。
三、实验要求设计要求:为了实现通讯录管理的操作功能,首先设计一个含有多个菜单项的主控菜单程序,然后再为这些菜单项配上相应的功能。
主控菜单设计要求:菜单内容程序运行后,给出9个菜单项的内容和输入提示:1.创建通讯录链表;2.将姓名为Name的好友的手机号改为MTel;3.输出通讯录;4.插入姓名为Name、手机号为MTel的好友信息,将链表中姓名≤Name的结点放到该结点的前面,将姓名>Name的结点放到该结点后面5.将通讯录按照好友姓名进行非递减排序;6.将两个按姓名非递减排序的通讯录合并为一个,姓名相同且手机号相同的好友记录在结果中只保留一个;7.统计籍贯是“大连”的好友人数;8.将通讯录中倒数第k个结点之后的所有结点移到头结点后面(保持结点间的先后顺序);9.将通讯录的正中间位置结点之后的全部结点倒置;0.退出管理系统请选择0—9:菜单设计要求:使用数字0—9来选择菜单项,其它输入则不起作用。
四、实验概要设计1)功能框图五. 使用说明1.运行环境:VC6.02.首先选择主控菜单中的操作1,即建表,然后进行其它操作.六.实验截图(见下页)七实验体会附源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#define Newsp (TxlList *)malloc(sizeof(struct TxlList))typedef struct TxlList{char Name[16]; //姓名char MTel[11]; //手机号char Tel[9]; //固定电话char EMail[16]; //邮箱地址char BornAddr[20]; //籍贯(值域:"北京"、"上海"、"大连"等等,只写城市名称)char BroadN[50]; //博客名struct TxlList *next; //指针域}TxlList, *TxlLink;void Lbuild1(TxlLink &T){//创建文件FILE *fp;TxlLink q;q=Newsp;q=T;int NUM;char filename[20];printf("\n*请输入要创建的通讯录名:\n");gets(filename);if ((fp=fopen(filename, "wb"))==NULL) { /*以写方式在当前目录打开(新建)文件*/printf("can't open file!!!\n");exit(0); //如果文件无法打开,关闭已经打开的其它文件,结束程序。
通讯录的录入与显示c语言多种解题思路
通讯录的录入与显示C语言多种解题思路一、概述通讯录是我们日常生活中常用的功能之一,通过通讯录我们可以方便地管理通联人的信息,并随时查找需要的通联人。
在编程领域中,通讯录的录入与显示是一个常见的问题,C语言作为一种经典的编程语言,对于通讯录的解题思路也有多种方式。
本文将介绍通讯录的录入与显示问题,并从C语言多种解题思路进行讨论。
二、通讯录的录入1. 使用结构体在C语言中,我们可以使用结构体来表示一个通联人的信息,包括尊称、通联方式号码、电流新箱等。
我们需要定义一个结构体来存储通联人的信息:```ctypedef struct{char name[50];char phone[20];char em本人l[50];} Contact;```我们可以定义一个数组来存储多个通联人的信息:```cContact contacts[100];```接下来,我们可以通过循环和用户输入的方式来进行通讯录的录入:```cint numContacts;printf("请输入通联人数量:");scanf("d", numContacts);for(int i=0; i<numContacts; i++){printf("请输入第d个通联人的尊称:", i+1);scanf("s", contacts[i].name);printf("请输入第d个通联人的通联方式号码:", i+1);scanf("s", contacts[i].phone);printf("请输入第d个通联人的电流新箱:", i+1);scanf("s", contacts[i].em本人l);}```通过以上方式,我们可以实现通讯录的录入功能,并且将通联人的信息存储在一个结构体数组中。
链表实现c语言通讯录管理系统,C++链表实现通讯录管理系统
链表实现c语⾔通讯录管理系统,C++链表实现通讯录管理系统⽤数据结构⾥⾯线性结构的链表实现,供⼤家参考,具体内容如下⽂件操作未写有登录操作,复制源码需要更改登录模块的密码⽂件存放位置使⽤VS2017编译器需要保留开头:#define _CRT_SECURE_NO_WARNINGS#define _CRT_SECURE_NO_WARNINGS#include "iostream"#include "cstdio"#include "fstream"#include "stdlib.h"#include "String"#include "iomanip"#include "windows.h"#define LEN 100using namespace std;using std::cin;using std::cout;using std::endl;using std::ifstream;using std::ofstream;using std::ios;using std::cerr;using std::string;using std::setw;typedef struct LNode {char num[10];char name[20];char telNum[12];char qq[10];struct LNode *next;}LNode,*LinkList;int n = 0;LinkList SearchName(LinkList L);//按姓名查找LinkList SearchNum(LinkList L);//按学号查找void DelLNode(LinkList &L,LinkList p);//删除p结点void PrintLNode(LinkList p);//打印结点void PrintList(LinkList L);//打印表/*----------------系统函数----------------*/void CreateLinkList(LinkList &L);//创建链表void DelName(LinkList &L);//按姓名删除通讯录成员void DelNum(LinkList &L);//按学号删除通讯录成员void saveRecord(LinkList L);//存储信息void loadRecord(LinkList &L);//加载信息/*--------------------------------------*/void Secret();void fun();void ver();void yanshi(char *p);void clear();void header();void menu() {LinkList L=NULL;int select;do {system("cls");printf("\t\t\t Welcome to the address book information management system!\n\n\n"); printf("\t\t\t\t***************************************************\n");printf("\t\t\t\t * │1.InitList 2.Add Message │ *\n");printf("\t\t\t\t * │ │ *\n");printf("\t\t\t\t * │3.Search Message 4.Save File │ *\n");printf("\t\t\t\t * │ │ *\n");printf("\t\t\t\t * │5.Sort Static 6.Load Message │ *\n");printf("\t\t\t\t * │ │ *\n");printf("\t\t\t\t * │7.Display Message 8.Delete Message│ *\n");printf("\t\t\t\t***************************************************\n");cout << endl;yanshi((char *)"\t\tPlease choose the mode of operation(1~8):\n");/* cout << "\t\tPlease choose the mode of operation(1~8):" << endl;*/cin >> select;switch (select) {case 8:cout << "Please select the deletion method:\n1.Delete by student number 2.Delete by name\n" << endl; int x;cin >> x;switch (x) {case 1:DelNum(L);break;case 2:DelName(L);break;}case 6:loadRecord(L);break;case 5:break;case 4:saveRecord(L);break;case 3:clear();cout << "Please select a search method:\n1.Find by student number 2.Find by name\n" << endl;int a;cin >> a;switch (a) {{LinkList aa = SearchNum(L); header();PrintLNode(aa);cout << "\n\n\n成功!" << endl; system("pause");menu();}break;case 2:clear();{LinkList b = SearchName(L); header();PrintLNode(b);cout << "\n\n\n成功!" << endl; system("pause");menu();break;}}break;case 1:InitList(L);break;case 9:break;case 7:PrintList(L);break;case 2:CreateLinkList(L);cout << endl << endl << endl;cout << "The programe is over!" << endl << endl << endl; Sleep(2000);exit(0);break;}} while (select != 8);}int main() {fun();ver();//版本信息Secret();//密码登录menu();return 0;}//初始化表void InitList(LinkList & L){L = new LNode;//申请头结点L->next= NULL;}//插⼊⼀条信息void InsertLNode(LinkList & L, LNode *s){s->next = L->next;L->next = s;}//按姓名查找LinkList SearchName(LinkList L){char name[20];cout << "请输⼊要查找的姓名:" << endl;while (p) {//如果找到,退出循环,返回pif (strcmp(p->name, name) == 0) break;elsep = p->next;}return p;}//按学号查找LinkList SearchNum(LinkList L){char num[10];cout << "请输⼊要查找的学号:" << endl; cin >> num;LinkList p = L->next;while (p) {//如果找到,退出循环,返回pif (strcmp(p->num, num) == 0) break;elsep = p->next;}return p;}//删除节点void DelLNode(LinkList &L,LinkList p) {LinkList s=NULL, q;q = L->next;//将s指向p前⾯的⼀个结点while (q&&q!=p) {}s->next = q->next;delete q;}//打印⼀条信息void PrintLNode(LinkList p){printf("%15s", p->num);printf("%15s", p->name);printf("%15s", p->telNum);printf("%15s\n",p->qq);}//打印通讯录void PrintList(LinkList L){clear();header();LinkList p = L->next;while (p) {PrintLNode(p);p = p->next;}system("pause");}//添加信息void CreateLinkList(LinkList & L) {char ans = 'y';n = 0;while (ans=='y'||ans=='Y') { system("cls");LNode *p = new LNode;cout << "请输⼊姓名:" << endl;cin >> p->name;cout << "请输⼊电话号码:" << endl;cin >> p->telNum;cout << "请输⼊QQ号:" << endl;cin >> p->qq;InsertLNode(L,p);n++;cout<getchar();ans=getchar();}system("pause");}//按姓名删除void DelName(LinkList &L){char name[20];LinkList p;cout << "请输⼊要删除的学⽣姓名:" << endl; cin >> name;p = SearchName(L);if (p) {DelLNode(L,p);}system("pause");}//按学号删除void DelNum(LinkList & L){char num[20];LinkList p;p = SearchName(L);if (p) {DelLNode(L, p);}system("pause");}//存储信息void saveRecord(LinkList L){FILE *fp=NULL;int count = 0;if ((fp=(fopen("student.dat","wb")))==NULL) { cout << "Can't open this file!" << endl;Sleep(3000);}LinkList q = L->next;while (q) {fwrite(q, sizeof(LNode), 1, fp);count ++;q = q->next;}fclose(fp);cout << "Save the file successfully!" << endl; getchar();}//加载信息void loadRecord(LinkList & L){FILE *fp=NULL;int count = 0;if ((fp=(fopen("student.dat", "rb"))) == NULL) { cout << "Can't open this file!" << endl;LinkList p=NULL;while(1){p = new LNode;if (fread(p, sizeof(LNode), 1, fp) > 0) {InsertLNode(L,p);count++;}else {break;}}fclose(fp);cout << endl << endl << "Load "<Sleep(2200);}//控制台样式void fun() {system("color 2a");system("title 学⽣通讯录信息管理系统");}//版本信息void ver(){yanshi((char*)"\t \3\3\3\3\3\3\3欢迎使⽤通讯录信息管理系统\3\3\3\3\3\3\3\n\n\n\n"); cout << "\t 学⽣通讯录信息管理系统\n\n\n\n\n";cout << "\t\t version 1.0\n\n\n\n\n";cout << "\t\t xxxxxxxxx 某某某\n\n\n\n\n";cout << "\t\t Loading......\n\n" << endl;Sleep(3000);system("cls");}//延时输出while (1) {if (*p != 0)cout << *p++;elsebreak;Sleep(50);}}//清屏void clear(){system("cls");}//表头void header(){printf("%15s%15s%15s%15s\n","学号","姓名","电话","QQ");}/*--------------------------------登录模块----------------------------------*//*--------------------------------登录模块----------------------------------*//*--------------------------------登录模块----------------------------------*/struct UsrInfo//⽤户名的账户和密码信息{char UsrName[20];char Psword[20];};/*注意我的⽂件中⽤户名是⼀⾏,密码是⼀样。
数据结构-链表(二)-通讯录-C++实现
数据结构-链表(⼆)-通讯录-C++实现通讯录的元素是⼈,所以需要新建⼀个Person类作为链表每个Node的元素。
并且为了正常输出,Person还需要⾍重载⼀些运算符,包括输出<<,判等==main函数⾥也要写⼀些辅助函数来获取信息。
链表本⾝实现部分不需要修改太多,把原来的的int型元素改为Person类型即可代码如下//Person.h#pragma once#include<iostream>#include<string>using namespace std;class Person{friend ostream& operator<<(ostream& out,Person &p){out << "Name: "<<<<"---" <<"Pnone number: "<< p.phone << endl;return out;}public:Person(string na, int num);Person();~Person();bool operator ==(Person &p){if ((this->name == ) && (this->phone == p.phone)){return true;}else{return false;}}string name="张三";int phone=0;private:};//Person.cpp#include"Person.h"Person::Person(string na, int num):name(na),phone(num){}Person::Person(){}Person::~Person(){}//Node.h#pragma onceusing namespace std;#include<iostream>#include"Person.h"class Node{public:Node(Person a);Node();~Node();Person person;Node* next;private:};//Node.cpp#include"Node.h"Node::Node(Person a):person(a){}Node::Node(){}Node::~Node(){}//List.h#pragma once#include<iostream>using namespace std;#include"Node.h"#define __debug__#ifdef __debug__#endifclass List{public:List();//~List();//bool get_add_head(Node* e);//在头节点后⾯插⼊bool get_add_tail(Node* e);//在尾节点后⾯插⼊void get_traverse();//遍历int get_length();//获取长度bool get_empty();//判空void get_clear();//清空线性表int get_ele_num(Node* p);//获取与传⼊参数值相同的链表中元素的序号 bool get_i_ele(int e, Node* value);//获指定位序的元素void get_delete(int location);//删除某位置元素bool get_add(int location, Node* e);//添加在某位置元素bool get_pre(Node* e, Node* pre);//获取前驱bool get_post(Node* e, Node* pos);//获取后继private:Node* node;//头节点int length;};//List.cpp#include"List.h"List::List(){length = 0;node = new Node;node->="zhangsan";node->person.phone = 0;node->next = NULL;}List::~List(){get_clear();delete node;node = NULL;}bool List::get_add_head(Node* e){Node* c_node = new Node;c_node=node->next;Node* new_node = new Node;if (new_node == NULL){return false;}new_node->person = e->person;new_node->next = c_node;node->next = new_node;length++;#ifdef __debug__cout << node->next->person << endl;#endifreturn true;}bool List::get_add_tail(Node* e){Node* c_node = new Node;c_node = node;while (c_node->next!=NULL){c_node = c_node->next;}Node* new_node = new Node;if (new_node == NULL){return false;}new_node->person = e->person;new_node->next = NULL;c_node->next = new_node;length++;#ifdef __debug__cout << c_node->next->person << endl;#endifreturn true;}void List::get_traverse(){Node* c_node = new Node;c_node = node->next;while (c_node != NULL){cout << c_node->person << endl;c_node = c_node->next;}}//遍历int List::get_length(){return length;}//获取长度bool List::get_empty(){return length == 0 ? true : false;}void List::get_clear(){Node* c_node = new Node;c_node = node;while(c_node->next != NULL){Node* new_node = new Node;new_node=c_node->next;delete c_node;//清除指向的内容c_node = new_node;}length = 0;node->next = NULL;//易错,勿忘!}//清空线性表int List::get_ele_num(Node* p)//获取元素的位序{Node* c_node = new Node;c_node=node;int count = 1;while (c_node->next != NULL){c_node = c_node->next;if (c_node->person == p->person){return count;}else{count++;}}return -1;}bool List::get_i_ele(int e, Node* value){if (e <1 || e > length){cout << "Invalid num!" << endl;return false;}Node* c_node = new Node;c_node = node;for (int i = 0; i <e; i++){c_node = c_node->next;}value->person = c_node->person;#ifdef __debug__cout << c_node->person << endl;#endifreturn true;}//获指定位序元素的值//void List::get_delete(int location){if (location<1 || location>length ){cout << "invalid num!!" << endl;}else{Node* c_node = new Node;c_node = node;Node* c_node_before = new Node;for (int i = 0; i < location; i++)//遍历到了location对应的位置,与增加元素有所不同,需要注意! {c_node_before = c_node;c_node = c_node->next;}c_node_before->next = c_node->next;length--;}}//某位置删除元素//bool List::get_add(int location, Node* e){if (location<1 || location>length){cout << "Invalid num!" << endl;return false;}else{Node* c_node = new Node;c_node=node;for (int i = 0; i < (location-1); i++){c_node = c_node->next;}//此时是遍历到了(location-1)那个元素的位置,然后在其后⾯插⼊新元素则是第location个元素。
单链表通讯录课程设计
单链表通讯录课程设计一、课程目标知识目标:1. 学生能理解单链表的数据结构,掌握其在通讯录中的应用原理。
2. 学生能掌握单链表的基本操作,包括创建、插入、删除和查找等。
3. 学生能理解并运用单链表解决实际问题,如实现一个简单的通讯录系统。
技能目标:1. 学生能运用所学知识,自主设计并实现单链表通讯录程序。
2. 学生能通过编程实践,培养逻辑思维能力和解决问题的能力。
3. 学生能运用调试工具,分析并解决单链表通讯录程序中的错误。
情感态度价值观目标:1. 学生在学习过程中,培养对数据结构及编程的兴趣和热情。
2. 学生通过团队协作,培养沟通能力和合作精神。
3. 学生认识到单链表在通讯录等实际应用中的价值,提高对计算机科学的认识。
课程性质:本课程为计算机科学与技术领域的一门实践性课程,旨在让学生掌握单链表数据结构及其在通讯录中的应用。
学生特点:学生为高中二年级学生,具备一定的编程基础和逻辑思维能力,对数据结构有一定了解。
教学要求:教师应注重理论与实践相结合,引导学生通过动手实践,掌握单链表通讯录的设计与实现。
同时,关注学生的个体差异,鼓励学生提问、讨论,提高学生的主动学习能力。
在教学过程中,注重培养学生的团队合作精神和情感态度价值观。
通过本课程的学习,使学生能够将所学知识应用于实际问题的解决中。
二、教学内容1. 单链表基本概念:介绍单链表的定义、特点及在数据结构中的地位。
教材章节:第二章第二节2. 单链表的基本操作:a. 创建单链表b. 插入节点c. 删除节点d. 查找节点教材章节:第二章第三节3. 单链表的应用:以通讯录为例,讲解单链表在实际编程中的应用。
教材章节:第二章第四节4. 单链表通讯录程序设计:a. 设计通讯录数据结构b. 编写插入、删除、查找等基本功能函数c. 实现用户界面及功能模块教材章节:第二章第五节5. 程序调试与优化:a. 分析单链表通讯录程序可能出现的错误b. 介绍调试方法及技巧c. 优化程序性能教材章节:第二章第六节教学内容安排与进度:第一课时:单链表基本概念第二课时:单链表的基本操作第三课时:单链表的应用及通讯录数据结构设计第四课时:编写单链表通讯录基本功能函数第五课时:实现用户界面及功能模块,程序调试与优化三、教学方法1. 讲授法:教师通过生动的语言、形象的比喻,讲解单链表的基本概念、原理和操作方法。
通讯录的制作数据结构课程设计
通讯录的制作数据结构课程设计
在通讯录的制作数据结构课程设计中,我们将使用链表作为主要的数据结构来存储联系人的信息。
链表是一种动态数据结构,它可以根据实际需要动态地分配和释放内存,非常适合用来存储不定数量的联系人信息。
首先,我们需要设计一个联系人的结构体,包含姓名、电话号码、邮箱等基本信息。
然后,我们可以使用链表节点来表示每个联系人,每个节点包含一个联系人的信息以及指向下一个节点的指针。
在创建通讯录时,我们将使用一个头节点来表示通讯录的起始位置,该头节点不包含任何联系人信息,只有一个指向第一个联系人节点的指针。
这样,我们可以通过头节点来遍历整个通讯录,并且在需要插入或删除联系人时更加方便。
在通讯录的实现中,我们可以提供一系列的操作函数,例如添加联系人、删除联系人、查找联系人、显示通讯录等。
这些操作函数可以通过遍历链表来实现对联系人的管理。
除了基本的功能,我们还可以扩展通讯录的功能,例如按照姓名首字母进行排序、按照电话号码进行查找等。
这些功能的实现可以通过链表的操作和排序算法来完成。
此外,我们还可以考虑使用其他数据结构来优化通讯录的实现。
例如,可以使用哈希表来加快对联系人的查找速度,或者使用二叉搜索树来实现按照姓名首字母进行排序。
综上所述,通讯录的制作数据结构课程设计中,我们将使用链表作为主要的数据结构,并通过实现一系列的操作函数和扩展功能来实现对联系人的管理和查询。
同时,我们也可以考虑使用其他数据结构来优化通讯录的实现。
这样的设计可以提高通讯录的效率和方便性,使用户能够更加方便地管理和查找自己的联系人信息。
C++链表通讯录完美版
C++语言课程设计学号:*********姓名:楚归羽指导老师:张目录一、程序功能 (2)二、题目分析 (2)三、设计中遇到的问题及解决方法 (2)四、感想与心得 (2)五、程序说明 (2)六、函数调用关系及主要算法的实现 (8)七、数据测试 (8)一、程序功能程序采用单向链表类结构实现实现通讯录多个纪录的管理工作。
1、提示输入个字段,一次输入一个人的数据2、输入待删除记录的姓名,显示其所有信息,让用户确认是否删除3、按顺序显示所有记录,每显示10条记录暂停,按Enter继续4、输入姓名,显示其所有信息5、用户输入姓名,系统显示该姓名下所有信息,同时显示子菜单,用户按子菜单提示进行修改6、从实现建立的正文文件中批量导入数据。
程序运行时,用户需输入正文文件名7、将库表中数据写入一个正文文件中。
程序运行时,用户需输入正文文件名8、首先显示当前排序关键字,然后提示是否需要改变。
系统默认按姓名排序,可在按办公室电话排序之间切换9、退出系统二、题目分析程序采用单向链表类结构实现,每个结点代表一个通讯记录。
链表类实现通讯录多个纪录的管理工作。
三、设计中遇到的问题及解决方法初次接触课程设计,刚刚拿到题目,实在是茫然无头绪,于是反复研究了题目,仔细复习了链表部分的知识点,加上和同学的讨论,终于是有了一个大概的思路。
刚开始着手编写的时候问题不断,幸好经过练习册上的指示,搭好了基本的框架,可是链表部分仍然是出了很大的问题,经过自己的反复实验与不断努力终于编译成功。
后面的文本文件的读入与写入则是另一个难题,因为这一块练习的不是很多,只在课本上看到了一些皮毛,在编译与调试时也遇到了很大问题。
最后通过看书上的例题并在与同学交流探讨中解决了这些问题。
四、感想与心得C++作为一门必修课程,学习的过程实在是痛苦的,尤其是在编程的时候,因为总是会出现各种各样的错误。
只有通过反复的调试,通过无数次的排错,才能编写出正确的程序,更多的时候,一个很小的很无聊错误就能导致长时间的迷惑。
单链表在实际程序中的使用
单链表在实际程序中的使用
单链表(Single Linked List)是一种常用的数据结构,它在许多实际程序中都有广泛的应用。
以下是一些常见的使用场景:
1. 动态数组:单链表可以作为动态数组的替代方案。
由于数组的大小在创建时就已经确定,如果要添加或删除元素,可能需要复制整个数组。
而单链表提供了动态添加和删除元素的能力,因此更适合需要频繁添加和删除元素的场景。
2. 历史记录或日志:单链表可以用来存储历史记录或日志。
每个节点可以包含一个事件或消息,以及指向下一个节点的指针。
这种方式可以方便地按顺序访问所有的事件或消息。
3. 文件系统:在文件系统中,目录结构可以用单链表来表示。
每个节点可以代表一个目录或文件,以及其子目录或文件的指针。
4. 图形和树形结构:单链表也可以用于表示图形和树形结构。
每个节点可以表示一个顶点或节点,而指针可以表示边或父-子关系。
5. 实现数据持久化:在需要将数据存储在磁盘或数据库中时,单链表可以作为一种实现数据持久化的方式。
每个节点可以包含一个数据项和一个指向下一个节点的指针,这样可以方便地将整个链表序列化为一个连续的字节流,然后存储在磁盘上。
6. 缓存和LRU算法:单链表也可以用于实现缓存和LRU(最近最少使用)算法。
在这种场景下,每个节点可以表示一个缓存项,包含数据和指向下一个节点的指针。
当缓存满时,最近最少使用的缓存项可以从链表中删除。
以上是一些常见的使用场景,实际上,单链表在许多其他领域也有广泛的应用,例如在算法、数据结构、操作系统、编译器设计等领域中都可以看到单链表的身影。
C语言基于单链表实现通讯录功能
C语⾔基于单链表实现通讯录功能本⽂实例为⼤家分享了C语⾔基于单链表实现通讯录功能的具体代码,供⼤家参考,具体内容如下#include<stdio.h>#include<stdlib.h>#include<string.h>#pragma warning(disable:4996);//解决VS报严重性代码错误typedef struct LNode{char name[20];double ph_number;struct LNode* next;}LinkNode;//创建通讯录LNode* CreateList(LNode*& L){LNode* s, * r;int n;L = (LNode*)malloc(sizeof(LNode));r = L;printf("请输⼊要创建联系⼈的个数:");scanf("%d", &n);printf("\n");for (int i = 0; i < n; i++){s = (LNode*)malloc(sizeof(LNode));printf("请输⼊第%d个联系⼈的姓名,电话:\n", i + 1);scanf("%s%lf", &s->name, &s->ph_number);printf("\n");r->next = s;r = s;}r->next = NULL;return L;}//添加联系⼈void ListInsert(LNode*& L){LNode* new_s, * r = L;while (r->next != NULL){r = r->next;}new_s = (LNode*)malloc(sizeof(LNode));printf("请输⼊要添加的联系⼈的姓名,电话:\n");scanf("%s%lf", &new_s->name, &new_s->ph_number);printf("\n");r->next = new_s;r = new_s;r->next = NULL;}//查找联系⼈bool Locate(LNode*& L){LNode* p = L->next;char name_[20];printf("请输⼊要查找的联系⼈的姓名:\n");scanf("%s", &name_);printf("\n");while (p != NULL && strcmp(p->name, name_) != 0)//注意判断条件{p = p->next;}if (p == NULL) return false;else return true;}//修改联系⼈bool ModifyList(LNode*& L){LNode* p = L;char name_[20];double ph_number_;printf("请输⼊要修改的联系⼈的姓名:\n");scanf("%s", name_);printf("\n");while (p != NULL && strcmp(p->name, name_) != 0)//注意判断条件 {p = p->next;}if (p == NULL) return false;else {printf("请输⼊修改后的电话号码为:\n");scanf("%lf", &ph_number_);printf("\n");p->ph_number = ph_number_;return true;}}//删除联系⼈bool ListDelete(LNode*& L){LNode* p = L->next, * q = L;char name_[20];printf("请输⼊要删除联系⼈的姓名:\n");scanf("%s", name_);printf("\n");while (p != NULL && strcmp(p->name, name_) != 0)//注意判断条件 {p = p->next;q = q->next;}if (p == NULL)return false;else {q->next = q->next->next;free(p);return true;}}//加载通讯录void DispList(LNode* L){int i = 0;LNode* p = L->next;while (p != NULL){printf("姓名:%s 电话:%.0lf\n", p->name, p->ph_number);p = p->next;i++;}}int main(){printf("*****************************************\n");printf("* *\n");printf("* 1:添加联系⼈ *\n");printf("* *\n");printf("* 2: 查找联系⼈ *\n");printf("* *\n");printf("* 3: 修改联系⼈ *\n");printf("* *\n");printf("* 4: 删除联系⼈ *\n"); printf("* *\n");printf("* 5: 加载通讯录 *\n"); printf("* *\n");printf("*****************************************\n"); printf("\n");LNode* L = CreateList(L);int operand;printf("\n");for (int i = 0; i < 5; i++){printf("请输⼊您要执⾏操作的操作数:\n");scanf("%d", &operand);switch (operand){case 1:ListInsert(L);break;case 2:if (Locate(L) == 1) {printf("找到该联系⼈\n");printf("\n");break;}else {printf("未找到改联系⼈\n");printf("\n");break;}case 3:if (ModifyList(L) == 1) {printf("修改成功\n");printf("\n");break;}else {printf("修改失败\n");printf("\n");break;}case 4:if (ListDelete(L) == 1) {printf("删除成功\n");printf("\n");break;}else {printf("删除失败\n");printf("\n");break;}case 5:DispList(L);break;default:printf("ERROR\n");}}return 0;}运⾏截图以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
单链表通讯录课程设计
单链表通讯录课程设计1.题目:单链表通讯录2.设计思路:单链表通讯录是一款用C++语言编写的数据管理系统,主要用于存储和管理用户的通讯信息,如姓名、电话号码、邮箱和地址等个人信息。
通过该系统,用户可以方便地查找和管理自己的通讯录,以方便日常生活和工作。
该系统的核心结构是单链表,采用了面向对象的设计思想,具有可扩展性和灵活的操作方式。
3.功能模块:(1)主菜单模块:该模块是整个系统的核心模块,包含多个子菜单,用户可以通过该模块访问其他功能模块。
(2)添加联系人模块:该模块用于添加新的联系人信息,包括姓名、电话号码、邮箱和地址等。
(3)删除联系人模块:该模块用于删除已有的联系人信息,用户可以根据输入的姓名或电话号码查找并删除联系人。
(4)修改联系人信息模块:该模块用于修改已有联系人的信息,包括姓名、电话号码、邮箱和地址等。
(5)查询联系人信息模块:该模块用于查询已有联系人的信息,用户可以根据输入的姓名或电话号码查找并显示联系人信息。
(6)显示所有联系人信息模块:该模块用于显示所有已有联系人的信息,以便用户进行整体管理。
(7)退出系统模块:该模块用于退出整个系统,结束数据管理工作。
4.代码实现:(1)定义联系人类Class 联系人{private:String name; //姓名String phone; //电话String email; //EmailString address; //地址public:联系人(); //类的构造函数void setName(String name);String getName();void setPhone(String phone);String getPhone();void setEmail(String email);String getEmail();void setAddress(String address);String getAddress();};(2)定义单链表类Class 单链表{private:联系人 *head; //头指针int length; //链表长度public:单链表(); //类的构造函数void add(); //添加联系人void del(); //删除联系人void modify(); //修改联系人void query(); //查询联系人void show(); //显示联系人};(3)定义主函数int main(){单链表 contacts; //创建单链表对象int choice; //用户输入选项while (1){printf("--------------------------------------------\n"); printf(" 通讯录管理系统 V1.0\n");printf("--------------------------------------------\n"); printf(" 1. 添加联系人\n");printf(" 2. 删除联系人\n");printf(" 3. 修改联系人\n");printf(" 4. 查询联系人\n");printf(" 5. 显示所有联系人\n");printf(" 6. 退出系统\n");printf("--------------------------------------------\n");printf(" 请输入选项: ");scanf("%d", &choice);switch (choice){case 1:contacts.add(); //添加联系人break;case 2:contacts.del(); //删除联系人break;case 3:contacts.modify(); //修改联系人break;case 4:contacts.query(); //查询联系人break;case 5:contacts.show(); //显示所有联系人break;case 6:printf(" 退出通讯录管理系统,欢迎下次使用!\n"); exit(0);default:printf(" 输入选项有误,请重新输入!\n");break;}}return 0;}5.实现流程:该系统的实现流程如下:(1)首先定义联系人类,具有姓名、电话、Email和地址等属性和对应的get/set方法。
单链表通讯录实现简单易懂
单链表通讯录实验报告班级:学号:姓名:实验日期:2015.10.15一、实验目的(1)能够利用单链表的基本运算进行单链表的相关操作。
(2)掌握文件的应用(3)加深对链式存储数据结构的理解,逐步培养解决实际问题的编程能力。
二、实验环境装有Visual C++6.0的计算机。
三、实验内容1、通讯录设计设计一个班级同学的通讯录,要求如下:通讯录中每个同学的信息包含以下内容:学号(id)、姓名(name)、电话号码(tel)。
如果需要更多其他信息,请自行添加。
程序主菜单包含以下几个功能:(1)添加记录:通过键盘输入信息,添加一条通讯录记录。
(2)删除记录:通过键盘输入学号,删除该学号的记录。
(3)输出记录:输出通讯录全部记录。
(4)按姓名查找:通过键盘输入姓名,输出该同学的所有信息。
(5)保存记录:把通讯录中所有的记录保存到文件中。
(6)清空记录:删除通讯录中的全部记录,并删除文件。
(7)退出提示:程序启动时应判断是否存在记录文件,如果存在,则读取每条记录到链表中。
用户选择并完成主菜单某功能后,除了退出程序,应该返回主菜单。
添加一条记录时,插入到链表的尾部。
查找、删除记录时,如果该记录不存在,则应该输出不存在的提示。
添加记录、删除记录时不需要写文件。
保存记录时,用覆盖写文件的方法。
(或者先删除原文件,再保存全部记录信息)各个功能模块写成函数,由主函数调用。
选做:主菜单增加一个排序功能选项,可以按照学号从小到大进行排序。
排序方法可以用冒泡排序或者插入排序。
四、重要数据结构链表,文件读入读出类五、实现思路分析每次将文件里的内容读出到链表之中,然后再利用链表的性质,进行修改删除,查询之类的功能,最后将链表存入文件之中六、程序调试问题分析因为很少用文件,所以文件的格式依靠着百度。
还有next 有时候会弄错,其他基本没有什么大问题。
七、实验总结这次实验收获还是很多的,对类的私有变量有了更深层次的理解,对链表也能运用自如。
数据结构单链表通讯录设计
#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX 100//定义最大值typedef struct ENode{ int num;char Add[MAX];//地址char Name[MAX];//名字char telephone[MAX];//电话号码struct ENode *next;}ENode,*ENoteBook;ENoteBook CreatList(int n){ENoteBook P,Q,H;int i,x;for(i=1;i<=n;i++){P=(ENoteBook)malloc(sizeof(ENode));printf("请输入地址\n");gets(P->Add);gets(P->Add);printf("请输入名字\n");gets(P->Name);printf("请输入电话\n");gets(P->telephone);if(i==1) H=P;else Q->next=P;Q=P;}P->next=NULL;return H;}void InsertNoteBook(ENoteBook &L) {ENoteBook Q;Q=(ENoteBook)malloc(sizeof(ENode)); printf("现在输入插入元素信息\n"); printf("\n");printf("请输入地址\n");gets(Q->Add);//gets(Q->Add);// puts(Q->Add);printf("请输入名字\n");gets(Q->Name);printf("请输入电话\n");gets(Q->telephone);Q->next=L->next;//L->next=NULL;L->next=Q;printf("个人信息添加完成\n");}PrintNoteBook(ENoteBook &L)//打印函数{ENoteBook P;P=L;if(L!=NULL)printf("\t\t电子通讯录\n");printf("名字地址电话\n");do{printf("%s %s %s",P->Name,P->Add,P->telephone);printf("\n");P=P->next;}while(P!=NULL);}Deletemember(ENoteBook L){char str[MAX];ENoteBook P,Q;printf("请输入你要删除的名字\n");gets(str);P=L;while(P->next!=NULL){if (strcmp(str,P->next->Name)==0){P->next=P->next->next;goto end;}elseP->next=P->next->next;}printf("出错了!");end: printf("删除完成!\n");}void Checkmember(ENoteBook &L)//按名字{char str[MAX];ENoteBook Q;printf("请输入你要查找的名字\n");gets(str); gets(str);Q=L;while(Q->next!=NULL){ if (strcmp(str,Q->Name)==0){puts(Q->Name);puts(Q->Add);puts(Q->telephone);} else Q=Q->next;}printf("你出错了\n");}main(){ENoteBook q;int n;int i;eww: printf("欢迎使用电子通讯本管理软件\n");printf("----1. 创建信息----\n");printf("----2. 插入信息----\n");printf("----3. 打印信息----\n");printf("----4. 查找信息----\n");printf("----5 .删除信息----\n");printf("请选择您要执行的操作\n");scanf("%d",&i);switch(i){case 1: printf("请输入元素的个数\n");scanf("%d",&n);q=CreatList(n); goto eww; break;case 2: InsertNoteBook(q);goto eww; break;case 3: PrintNoteBook(q); goto eww; break;case 4: Checkmember(q);goto eww; break;case 5: Deletemember(q);goto eww;break;default:printf("操作出错\n");goto eww;}//Deletemember(q); }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单链表的使用#include<iostream.h>#include<string.h>#include<stdlib.h>#include<windows.h>typedef struct Node{char name[20];char sex[4];char tel[20];char qq[13];char ad[100];Node *next;}LNode,*LinkList;LinkList Creat_LinkList(){LinkList H;H=new LNode;if(H){H->next=NULL;}return H;}void Insert_LinkList(LinkList H){LinkList p;p=new LNode;if(!p){cout<<"不能插入!"<<endl;}cout<<"请输入你要插入的联系人信息:"<<endl;cout<<"姓名:"<<endl;cin>>p->name;cout<<"性别:"<<endl;cin>>p->sex;cout<<"手机号码:"<<endl;cin>>p->tel;cout<<"QQ号码:"<<endl;cin>>p->qq;cout<<"地址:"<<endl;cin>>p->ad;p->next=H->next;H->next=p;cout<<"插入成功"<<endl;}void Locate_LinkList(LinkList H){int x;LinkList p=H->next;cout<<"你要通过哪种方式查询?"<<endl;cout<<"1.通过联系人姓名查询"<<endl;cout<<"2.通过联系人手机号码查询"<<endl;cout<<"3.通过联系人QQ号码查询"<<endl;cin>>x;char str[30];if(x==1){cout<<"请输入你要查询的联系人的姓名:";cin>>str;while(p && strcmp(p->name,str)!=0){p=p->next;}}if(x==2){cout<<"请输入你要查询的联系人的手机号码:";cin>>str;while(p&&strcmp(p->tel,str)!=0){p=p->next;}}if(x==3){cout<<"请输入你要查询的联系人的QQ号码:";cin>>str;while(p&&strcmp(p->qq,str)!=0){p=p->next;}}if(p==NULL){cout<<"没有找到你要查找的联系人的信息!"<<endl;}else{cout<<"你要找的联系人的信息为:"<<endl;cout<<"姓名:"<<p->name<<endl;cout<<"性别:"<<p->sex<<endl;cout<<"手机号:"<<p->tel<<endl;cout<<"QQ号码:"<<p->qq<<endl;cout<<"地址:"<<p->ad<<endl;}}void Delete_LinkList(LinkList H){if(H->next==NULL){cout<<"通讯录为空,不能删除"<<endl;}else{int x;char str[30];LinkList p,q;p=H->next;cout<<"请输入你要删除的方式:"<<endl;cout<<"1.按照联系人的姓名删除"<<endl;cout<<"2.按照联系人的手机号码删除"<<endl;cout<<"3.按照联系人的QQ号码删除"<<endl;cin>>x;q=H;if(x==1){cout<<"请输入你要删除的联系人的姓名:"<<endl;cin>>str;while(strcmp(p->name,str)!=0){q=p;p=p->next;}}if(x==2){cout<<"请输入你要删除的联系人的手机号码:"<<endl;cin>>str;while(strcmp(p->tel,str)!=0){q=p;p=p->next;}}if(x==3){cout<<"请输入你要删除的联系人的QQ号码:"<<endl;cin>>str;while(strcmp(p->qq,str)!=0){q=p;p=p->next;}}if(p==NULL){cout<<"没有你要删除的联系人的记录"<<endl;}else{q->next=p->next;p->next=NULL;free(p);cout<<"该联系人已删除"<<endl;}}}void print_LinkList(LinkList H){if(H->next==NULL){cout<<"通讯录为空"<<endl;}else{LinkList p;p=H->next;while(p!=NULL){cout<<"性别:"<<p->sex<<endl;cout<<"手机号:"<<p->tel<<endl;cout<<"QQ号码:"<<p->qq<<endl;cout<<"地址:"<<p->ad<<endl;p=p->next;}}}void main(){int a;LinkList List;List=Creat_LinkList();do{cout<<"添加联系人请按1"<<endl;cout<<"查找联系人请按2"<<endl;cout<<"删除联系人请按3"<<endl;cout<<"输出所有联系人请按4"<<endl;cout<<"退出请按0"<<endl;cout<<"请输入你的选择:"<<endl;cin>>a;switch(a){case 0:break;case 1:Insert_LinkList(List);break;case 2:Locate_LinkList(List);break;case 3:Delete_LinkList(List);break;case 4:print_LinkList(List);break;}cout<<"操作完毕,请再次选择!"<<endl;}while(a!=0);}。