用链表实现的手机通讯录
c语言实现通讯录管理系统(用链表实现)
c语⾔实现通讯录管理系统(⽤链表实现)题⽬:通讯录(通过链表实现)设计并实现⼀个简易的通讯录软件,管理个⼈通讯记录。
⼀条通讯记录可包括:姓名、⼯作单位、⼿机、住宅电话、E-Mail、家庭住址等(可⾃⾏增删,但不可过少)。
该系统应实现以下基本功能:(1)增加新的通讯记录。
(2)删除已有的通讯记录。
(3)修改已有的通讯记录。
(4)浏览全部或指定(如指定姓名、⼯作单位等)的通讯记录。
(5)合理组织排列各项功能,界⾯可使⽤键盘操作。
(6)以⽂件的形式存储数据。
说明:⼤⼀时的c语⾔课设,⽤链表实现⼀个通讯录管理系统,为了美观好看,花了很多时间调整齐度,记录⼀下⼤⼀时的作业。
其主要功能是对通讯录可输⼊,显⽰,插⼊,删除,最难是可保存,这个学⽂件的时候不怎么会。
内容我⾃⼰弄了7个,名字,性别,⼯作单位,⼿机,住宅电话,E-Mail,家庭住址(其他太多其实都是⼀样的,就懒得加了)。
主要运⽤到对指针中的链表的功能和使⽤要⽐较扎实,分部列写就可以了。
实现图⽚:附上代码:1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 typedef struct student5 {6char name[20];//名字7char wm[20];//性别8char work[100];//⼯作单位9char stel[20];//⼿机10char htel[20];//住宅号码11char mail[20];//E-Mail12char home[100];//家庭住址13struct student *next;14 }stu;15 stu *head;//头指针16void screen()//主菜单17 {18 printf("\n=======================================================\n");19 printf(" 欢迎来到通讯录管理系统\n\n");20 printf(" 1.输⼊数据 2.显⽰数据\n");21 printf(" 3.插⼊数据 4.删除数据\n");22 printf(" 5.查看数据 6.修改数据\n");23 printf(" 7.保存数据 8.返回主菜单\n");24 printf("\n~~~~~~输~~~~~~⼊~~~~~~9~~~~~~退~~~~~~出~~~~~~程~~~~~~序\n");25 }26void input()//输⼊数据27 {28int ans;//判断是否继续输⼊29 stu *p1,*p2;30 p1=(stu *)malloc(sizeof(stu));//申请内存来⽤31if(p1!=NULL)32 {33 printf("========输⼊数据========\n");34 head=p1;35while(1)36 {37 printf("名字:");38 scanf("%s",&p1->name);39 printf("性别:");40 scanf("%s",&p1->wm);41 printf("⼯作单位:");42 scanf("%s",&p1->work);43 printf("⼿机:");44 scanf("%s",&p1->stel);45 printf("住宅号码:");46 scanf("%s",&p1->htel);47 printf("E-Mail:");48 scanf("%s",&p1->mail);49 printf("家庭地址:");50 scanf("%s",&p1->home);51 printf("===================================\n");52 p2=p1;53 p1=(stu *)malloc(sizeof(stu));//申请下⼀个要⽤的空间54if(p1!=NULL)55 p2->next=p1;56 printf("请选择是否继续输⼊:1.继续 2.退出\n请选择:");//⽤户选择57 scanf("%d",&ans);58if(ans==1)//继续59continue;60else//退出61 {62 printf("========输⼊完毕========\n");63 p2->next=NULL;64free(p1);//将申请的的⽆⽤内存释放65break;66 }67 }68 }69 }70void look(stu *p1)//显⽰数据71 {72 printf("========显⽰数据========\n");73while(p1!=NULL)74 {75 printf("名字:%s\n",p1->name);76 printf("性别:%s\t",p1->wm);77 printf("⼯作单位:%s\t",p1->work);78 printf("⼿机:%s\t",p1->stel);79 printf("住宅号码:%s\t",p1->htel);80 printf("E-Mail:%s\t",p1->mail);81 printf("家庭住址:%s\n",p1->home);82 printf("=====================================\n");83 p1=p1->next;84 }85 printf("========显⽰完毕========\n");86 }87void insert()//插⼊数据88 {89int ans;//选择插⼊位置90char name[20];//插⼊者的名字91 printf("========插⼊数据========\n");92 stu *p1,*p2,*p3;93 p1=head;94 p3=(stu *)malloc(sizeof(stu));//申请内存95 p3->next=NULL;96 printf("请输⼊插⼊者的数据:\n");97 printf("名字:");98 scanf("%s",&p3->name);99 printf("性别:");100 scanf("%s",&p3->wm);101 printf("⼯作单位:");102 scanf("%s",&p3->work);103 printf("⼿机:");104 scanf("%s",&p3->stel);105 printf("住宅号码:");106 scanf("%s",&p3->htel);107 printf("E-Mail:");108 scanf("%s",&p3->mail);109 printf("家庭地址:");110 scanf("%s",&p3->home);111 printf("请选择插⼊位置:1.⾸位置插⼊ 2.尾部插⼊ 3.插到某⼈前⾯\n请选择:");112 scanf("%d",&ans);113switch(ans)114 {115case1://放到头指针116 p3->next=p1;117 head=p3;118break;119case2://放到尾部120while(p1->next!=NULL)121 p1=p1->next;122 p1->next=p3;123break;124case3://放到某⼈前⾯125 printf("请输⼊插到谁前⾯名字:");126 scanf("%s",name);127while(strcmp(name,p1->name)!=0)128 {129 p2=p1;130 p1=p1->next;131 }132 p2->next=p3;133 p3->next=p1;134break;135 }136 printf("========插⼊成功========\n");137 }138void deleted()//删除数据139 {140 stu *p1,*p2;141char name[20];//删除者名字142 printf("========删除数据========\n");143 printf("请输⼊要删除者的名字:");144 scanf("%s",name);145 p1=head;146if(head==NULL)//通讯录已经没数据了147 {148 printf("通讯录⾥什么也没有了。
使用sqliteopenhelper实现简易通讯录实训报告
实训报告:使用SQLiteOpenHelper实现简易通讯录一、实训目标通过本次实训,掌握SQLite数据库的基本操作,使用SQLiteOpenHelper类创建、打开、升级数据库,以及在Android应用程序中实现简易通讯录功能。
二、实训步骤1.创建SQLite数据库2.使用SQLiteOpenHelper类创建数据库。
首先,创建一个继承自SQLiteOpenHelper的类,并重写onCreate()和onUpgrade()方法。
在onCreate()方法中执行创建表的SQL语句,onUpgrade()方法用于升级数据库时执行更新表的SQL语句。
3.实现通讯录功能4.在通讯录界面上,显示联系人列表。
当用户点击某个联系人时,显示该联系人的详细信息。
实现添加、删除、修改和查询联系人操作。
5.实现数据绑定6.使用Data Binding库将数据绑定到界面上。
在布局文件中定义变量,通过布局文件与Java代码的双向绑定,将联系人数据显示在界面上。
7.实现增删改查操作8.通过SQLiteOpenHelper类提供的insert()、update()、delete()和query()方法实现增删改查操作。
将操作封装在DAO(Data Access Object)类中,方便进行数据操作。
9.测试应用程序10.运行应用程序,测试通讯录功能是否正常工作。
检查添加、删除、修改和查询联系人操作是否能够正确执行。
三、实训总结通过本次实训,我掌握了SQLite数据库的基本操作,了解了如何使用SQLiteOpenHelper 类创建、打开和升级数据库。
同时,我也学会了在Android应用程序中实现简易通讯录功能,包括数据绑定和增删改查操作。
通过实际操作,我对Android应用程序开发有了更深入的理解。
在未来的学习和工作中,我将继续深入学习Android开发技术,提高自己的技能水平。
数据结构课程设计(通讯录)
数据结构课程设计(通讯录)
题目描述:
设计一个通讯录程序,实现以下功能:
1. 添加联系人信息
2. 删除联系人信息
3. 修改联系人信息
4. 查找联系人信息
5. 显示所有联系人信息
6. 退出程序
要求:
1. 使用链表作为数据结构存储联系人信息
2. 界面友好,操作简单方便
3. 能够防止重复添加联系人信息
设计思路:
1. 定义一个结构体Contact表示联系人信息,包括姓名、电话、邮箱等成员变量。
2. 定义一个链表结构体List表示联系人链表,包括头结点、
节点数量等成员变量。
3. 实现添加联系人信息函数,首先判断联系人是否存在,如果存在则提示用户,否则分配一个新的节点,并将联系人信息存储在节点中,将新节点插入链表中。
4. 实现删除联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则在链表中删除该节点。
5. 实现修改联系人信息函数,首先判断联系人是否存在,如果不存在则提示用户,否则修改节点中的信息。
6. 实现查找联系人信息函数,遍历链表查找是否有匹配姓名的联系人。
7. 实现显示所有联系人信息函数,遍历链表打印出所有联系人信息。
8. 在main函数中调用上述函数,根据用户输入的指令调用对应的函数,直到用户选择退出程序。
链表做的通讯录(有要求和源代码宁波工程学院)
三、实验内容1、通讯录设计设计一个班级同学的通讯录,要求如下:✓通讯录中每个同学的信息包含以下内容:学号(id)、姓名(name)、电话号码(tel)。
如果需要更多其他信息,请自行添加。
✓程序主菜单包含以下几个功能:(1)添加记录:通过键盘输入信息,添加一条通讯录记录。
(2)删除记录:通过键盘输入学号,删除该学号的记录。
(3)输出记录:输出通讯录全部记录。
(4)按姓名查找:通过键盘输入姓名,输出该同学的所有信息。
(5)保存记录:把通讯录中所有的记录保存到文件中。
(6)清空记录:删除通讯录中的全部记录,并删除文件。
(7)退出提示:✓程序启动时应判断是否存在记录文件,如果存在,则读取每条记录到链表中。
✓用户选择并完成主菜单某功能后,除了退出程序,应该返回主菜单。
✓添加一条记录时,插入到链表的尾部。
✓查找、删除记录时,如果该记录不存在,则应该输出不存在的提示。
✓添加记录、删除记录时不需要写文件。
✓保存记录时,用覆盖写文件的方法。
(或者先删除原文件,再保存全部记录信息)✓各个功能模块写成函数,由主函数调用。
选做:✓主菜单增加一个排序功能选项,可以按照学号从小到大进行排序。
排序方法可以用冒泡排序或者插入排序。
#include<stdio.h>#include<malloc.h>#include<string.h>#include<stdlib.h>#include<string.h>FILE *fp; //文件指针typedef struct lnode{int id;char name[10];int tel;struct lnode *next;}stud;void Inside(stud *&s,int ID,char *NAME,int TEL); bool Delete(stud *&s,int ID);void Output(stud *s);bool Sereachname(stud *&s,char *NAME); void Memory(stud * s);void Write(stud * s);void Empty(stud *&s);void Ini(stud *&s);void Start(stud *s);int main(){int n,ID,TEL;char NAME[10];stud *s;Ini(s);Start(s);printf("*****************************1.添加记录\t2.删除记录*****************************\n");printf("*****************************3.输出记录\t4.按姓名查找***************************\n");printf("*****************************5.保存记录\t6.清空记录*****************************\n");printf("*****************************7.退出\t***************************************\n");while(~scanf("%d",&n)){if(n>=1&&n<=6){switch(n){case 1:{printf("输入学号、姓名、电话\n");scanf("%d%s%d",&ID,&NAME,&TEL);Inside(s,ID,NAME,TEL);break;}case 2:{printf("请输入“学号”\n");scanf("%d",&ID);Delete(s,ID);break;}case 3:{Output(s);break;}case 4:{printf("请输入“姓名”\n");scanf("%s",&NAME);Sereachname(s,NAME);break;}case 5:{Memory(s);printf("保存成功\n");break;}case 6:{Empty(s);break;}}}if(n==7){printf("***********谢谢使用************\n");break;}printf("*****************************1.添加记录\t2.删除记录*****************************\n");printf("*****************************3.输出记录\t4.按姓名查找***************************\n");printf("*****************************5.保存记录\t6.清空记录*****************************\n");printf("*****************************7.退出\t***************************************\n");}return 0;}void Ini(stud *&s){s=(stud *)malloc(sizeof(stud));s->next=NULL;}void Inside(stud * &s,int ID,char *NAME,int TEL) //输入记录{stud *r,*t=s;while(t->next!=NULL){t=t->next;}r=(stud *)malloc(sizeof(stud));r->id=ID;strcpy(r->name,NAME);r->tel=TEL;r->next=NULL;t->next=(stud *)malloc(sizeof(stud));t->next=r;}bool Delete(stud * &s,int ID) //删除记录{stud *r=s,*q,*pre=s;r=r->next;while(r!=NULL && r->id!=ID) {pre=pre->next;r=r->next;}if(r==NULL){printf("该记录不存在\n"); return false;}else{q=pre->next;pre->next=q->next;free(q);printf("删除成功\n");return true;}void Output(stud *s) //输出记录{if(s!=NULL)s=s->next;if(s!=NULL){while(s!=NULL){ printf("学号\t姓名\t电话\n");printf("%d\t",s->id);printf("%s\t",s->name);printf("%d\n",s->tel);s=s->next;}}else{printf("该通讯录为空\n");}bool Sereachname(stud *&s,char *NAME) //按名字查找{stud *p,*pre=s;p=s->next;while(p!=NULL&&(strcmp(p->name,NAME))){pre=pre->next;p=p->next;}if(p==NULL){printf("该学生不存在\n");return false;}else{printf("学号\t姓名\t电话\n");printf("%d\t",p->id);printf("%s\t",p->name);printf("%d\n",p->tel);return true;}}void Memory(stud * s) //{fp=fopen("d:\\in.txt","w"); //数据保存到文件中if(s!=NULL)s=s->next;while(s!=NULL){fprintf(fp,"%d\t%s\t%d\n",s->id,s->name,s->tel);//写入文件s=s->next;}fclose(fp);}void Empty(stud * &s) //清空记录{stud *p=s,*q=s;p=p->next;if(p!=NULL)q=p->next;while(q!=NULL){free(p);p=q;q=p->next;}free(p);s->next=NULL;printf("该通讯录已空\n");}void Start(stud *s) // 初始化和载入文件中数据{system("color 09"); //屏幕、字体颜色char NAME[10];int ID,TEL;fp=fopen("d:\\in.txt","a"); //从文件中加载数据,如果没有该文件则新建fclose(fp);fp=fopen("d:\\in.txt","r");while(fscanf(fp,"%d%s%d",&ID,NAME,&TEL)!=EOF) //从文件中读入数据Inside(s,ID,NAME,TEL);fclose(fp);}宁波工程学院计科12-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语言版用链表实现通讯录“标头.h”#include<stdio.h>#include<stdlib.h>#include<string.h>#define Len sizeof(Lnode)int seat;//全局变量,用于存储通讯录成员信息typedef struct Lnode{int number; //学号char name[20];//名字double telenum;//电话struct Lnode *next;//定义一个指向下一个节点的指针} Lnode,*LinkList;//把struct Lnode*重定义为LinkListLinkList creatIncreLink();void deleteElem(LinkList l,int i);int delName(LinkList l,char name[]);int delNum(LinkList l,int n);void insertYouxu(LinkList l,LinkList Elem);void printList(LinkList l);LinkList prior(LinkList l,LinkList p);int searchName(LinkList l,char name[]);int searchNum(LinkList l,int n);#include<stdio.h>#include"标头.h"LinkList creatIncreLink(){LinkList p;int num=1,number;double telenum;char name[20],temp;LinkList L,P;L=(LinkList)malloc(Len); //创建头结点L->next = NULL;printf("请输入学生学号、姓名和电话号码,建立通讯录,以'-1'为输入结果标志\n");printf("请输入学号 %d:");scanf("%d",&number);printf("请输入姓名 %d:");temp=getchar();gets(name);printf("请输入电话号码 %d:");scanf("%lf",&telenum);while (number >= 0){p = (LinkList)malloc(Len); //新分配结点p->number = number;p->telenum = telenum;strcpy(p->name,name);insertYouxu(L,p); //有序地插入新结点num++;printf("请输入学号 %d:",&num);scanf("%d",&number);printf("请输入姓名 %d:",num);temp=getchar();gets(name);printf("请输入电话号码 %d:",num);scanf("%lf",&telenum);}return(L);}void deleteElem(LinkList l,int i) //删除函数{LinkList p=l,q;//让p指向lint j=0;//循环变量jwhile(p->next&&j<i-1) //循环让p指向第i个元素的前驱 {p=p->next;j++;}if(p->next==0) //判断下一个元素是否为空printf("ERROR");q=p->next;//将p指向第i个元素p->next=q->next;//p的next指向q的nextfree(q);//释放q链表}int delName(LinkList l,char name[]){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL)printf("该链表中没有元素");else{while(p!=NULL){if(strcmp(p->name,name)!=0){flag=1;printf("%s",p->name);p=p->next;deleteElem(l,seat);}else{p=p->next;seat++;}}if(flag==1)printf("被删除");}return flag;}int delNum(LinkList l,int n){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL)printf("没有元素");else{while(p!=NULL){if(p->number<=n){if(p->number==n){flag=1;printf("%d",p->number);p=p->next;deleteElem(l,seat);}}else{p=p->next;seat++;}}printf("被删除");}return flag;}void insertYouxu(LinkList l,LinkList Elem){LinkList p=l->next;while(p!=NULL&&Elem->number>=p->number) {if(p->number==Elem->number){printf("重复输入\n");return;}p=p->next;}if(p==NULL){p=prior(l,p);Elem->next=NULL;p->next=Elem;}else{p=prior(l,p);Elem->next=p->next;p->next=Elem;}}void printList(LinkList l){LinkList p=l;int n=1;printf("内容");if(l==NULL||l->next==NULL)printf("没有元素\n");elsewhile(p->next!=NULL){printf(" - %-9d",n,p->next->number);printf(" %-5s %.0f\n",p->next->name,p->next->telenum); p=p->next;n++;}}LinkList prior(LinkList l, LinkList p){LinkList p_prior=l;if(l->next==NULL)return(l);while(p_prior->next!=p)p_prior=p_prior->next;return(p_prior);}int searchName(LinkList l,char name[]){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL||l==NULL)printf("查找失败");else{while(p!=NULL){if(!strcmp(p->name,name)){flag=1;printf("要查找的是%d位通讯录成员\n",seat);printf("学号:%d 名字:%s 电话:%f\n",p->number,p->name,p->telenum); }p->next;seat++;}}return flag;}int searchNum(LinkList l,int n){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL)printf("查找失败");else{while(p!=NULL){if(p->number<=n)if(p->number==n){flag=1;printf("要查找的是%d个成员\n",seat);printf("学号:%d 姓名:%s 电话:%f",p->number,p->telenum,p->telenum); }p=p->next;seat++;}}return flag;}int main(void){LinkList l=NULL,p;int flag=0;int menu;char temp;system("color 3f");printf("输入1通讯录的建立\n");printf("输入2插入通讯录\n");printf("输入3查询通讯录\n");printf("输入4删除通讯录\n");printf("输入5显示通讯录信息\n");printf("输入0退出\n");scanf("%d",&menu);while(menu!=0){switch(menu){case 1:l=creatIncreLink();printf("建立通讯录\n");printList(l);flag=1;break;case 2:if(flag==1){int number;double telenum;char name[20];char temp;printf("请输入学号\n");scanf("%d",&number);printf("请输入姓名\n");scanf("%s",&name[20]);printf("请输入电话号码");scanf("%f",&telenum);p=(LinkList)malloc(Len);p->number=number;strcpy(p->name,name);p->telenum=telenum;insertYouxu(l,p);printf("插入后\n");printList(l);}else{printf("error\n");}break;case 3:int way,n,s;char na[20],temp;if(l!=NULL){if(flag){printf("选择查找方式1,按学号查找2按姓名"); scanf("%d",&way);if(way==1){printf("请输入学号\n");scanf("%d",&n);s=searchNum(l,n);if(s==0)printf("shibai");}else if(way==2){printf("请输入姓名");temp=getchar();gets (na);s=searchName(l,na);if(s==2)printf("失败");}else printf("无记录");}break;}else printf("无记录");break;case 4:printf("1,按序号删除2 按学号,3按姓名\n"); scanf("%d",&way);if(way==1){int n;printf("请输入序号");scanf("%d",&n);printf("删除后\n");deleteElem(l,n);printList(l);}else if(way==2){int n,f;printf("请输入学号");scanf("%d",&n);f=delNum(l,n);if(f!=0){printf("删除后");printList(l);}else printf("失败");}else if(way==3){char na[20],temp;int f;printf("输入姓名");temp=getchar();gets(na);f=delName(l,na);if(f!=0){printf("删除后");printList(l);}else printf("失败");}else printf("error\n");break;case 5:printf("内容如下\n");printList(l);break;case 0:exit(0);default:printf("重新输入"); }printf("选择\n");scanf("%d",&menu);}}。
通讯录的录入与显示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);}```通过以上方式,我们可以实现通讯录的录入功能,并且将通联人的信息存储在一个结构体数组中。
通讯录 双向链表
//node.h#include<iostream.h>#include<fstream.h>#include<string.h>#include<stdlib.h>#include<iomanip.h>struct data //数据{char name[20]; //姓名char tel[20]; //电话int age; //年龄};class node //节点{friend class link; //友远类private:data person; //数据node * next;node * pre;public:void show() //显示数据信息{cout<<"姓名:"<<setw(20)<<<<endl;cout<<"电话:"<<setw(20)<<person.tel<<endl;cout<<"年龄:"<<setw(3)<<person.age<<endl<<endl;}node(char*name0="",char*tel0="",int age0=0) //构造函数{strcpy(,name0);strcpy(person.tel,tel0);person.age=age0;next=NULL;pre=NULL;}node(node&n) ////拷贝构造{strcpy(,);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<<"通讯录中没有信息"<<endl<<endl;return NULL;}node * p=head;while(p){if(strcmp(p->,name0)==0) //已找到return p;p=p->next;}while(temp){if(Cmpstr(temp->,name0)){cout<<endl<<"符合条件的记录,如下:"<<endl;temp->show();}temp=temp->next;}//if(temp)// cout<<"查无此人"<<endl<<endl;//未找到}return temp;}node * findbyname(char*name0) //查找姓名返回地址{if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return NULL;}node * p=head;while(p){if(strcmp(p->,name0)==0) //已找到return p;p=p->next;}if(!p)cout<<"查无此人"<<endl<<endl;return NULL;//未找到}int length() //返回链表长度{if(!head)return 0;node*p;int n=1;p=head;if(p->next){p=p->next;n++;}return n;}node * findbynum(int num) //根据序号查找{int l=length(); //l为总长if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return NULL;}if(num>l) //数据越界{cout<<"通讯录里没有"<<num<<"条信息"<<endl<<endl;return NULL;}node * p=head;while(--num)p=p->next;return p; //返回指针}void change(node*p)//修改对应指针信息{char tel0[20];int age0,cho;cout<<"请输入新的电话号码"<<endl;cin>>tel0;cout<<"请输入新的年龄"<<endl;cin>>age0;cout<<"姓名:"<<p-><<endl;cout<<"原电话号码:"<<setw(20)<<p->person.tel<<endl;cout<<"原年龄:"<<setw(3)<<p->person.age<<endl<<endl;cout<<"新电话号码:"<<setw(20)<<tel0<<endl;cout<<"新年龄:"<<setw(3)<<age0<<endl<<endl;cout<<"1.确认 2.取消"<<endl;cin>>cho;if(cho==1){strcpy(p->person.tel,tel0);p->person.age=age0;cout<<"已修改成功"<<endl;}}void del(node *p) //删除一个节点{if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;}if(p==head) //删除头结点{p->next->pre=NULL;head=p->next;delete p;return;}if(p==rear) //删除尾节点{p->pre->next=NULL;rear=p->pre;delete p;return;}p->next->pre=p->pre; //删除中间节点p->pre->next=p->next;delete p;}void delall() //删除整个链表{node*p;while(head){p=head;head=head->next;delete p;}head=rear=NULL;}public:link() //构造函数{head=rear=NULL;}~link(){ //析构函数,同时释放链表空间delall();}node * cinnode() //从键盘输入生成一个节点{char name[20],tel[20];int age;node*p;p=new node;cout<<"请输入姓名"<<endl;cin>>name;cout<<"请输入电话号码"<<endl;cin>>tel;cout<<"请输入年龄"<<endl;cin>>age;*p=node(name,tel,age);return p;}void insert(node *p) //将节点插入链表{node *p1,*p2;if(head==0) //空链表{p->next=0;p->pre=0;head=rear=p;return;}if(strcmp(head->,p->)>0){p->next=head;head->pre=p;p->pre=0;head=p;return;}if(strcmp(rear->,p->)<0){p->pre=rear;rear->next=p;p->next=0;rear=p;return ;}p1=p2=head;while(strcmp(p2->,p->)<0){p1=p2;p2=p2->next;}p->next=p2; //插入链表中间p2->pre=p;p1->next=p;p->pre=p1;}void showfromhead() //从前向后输出链表{if(!head) //空链表cout<<"通讯录无信息"<<endl;else{int c=0;node *p;p=head;while(p){p->show(); //调用函数显示信息p=p->next;c++;//if(c%5==0) //控制每输出 5 个暂停一次//system("pause");}cout<<"所有信息输出完成"<<endl;}}void showfromrear() //从后向前输出链表{if(!rear)cout<<"通讯录无信息"<<endl;else{int c=0;node*p;p=rear;while(p){p->show();p=p->pre;c++;if(c%6==0)system("pause");}cout<<"所有信息输出完成"<<endl;}}void showbyname(node *temp) //根据姓名显示信息{char name[20];cout<<"请输入欲查找的姓名"<<endl;cin>>name;node *p;p=findbyname(name,temp); //查找姓名所对应的指针if(p)p->show();}void changebyname() //根据姓名修改信息{char name[20];cout<<"请输入欲修改的姓名"<<endl;cin>>name;node*p;p=findbyname(name);if(p)change(p);}void delbyname() //根据姓名删除信息{char name[20];if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;cout<<"请输入欲删除的姓名"<<endl;cin>>name;node*p;p=findbyname(name);if(p)del(p);cout<<"已删除选定信息"<<endl;}void showbynum() //根据序号显示信息{int num;if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;}cout<<"请输入欲查找编号"<<endl;cin>>num;node*p;p=findbynum(num); //根据序号查找指针if(p)p->show();}void delbynum() //根据序号删除信息{int num;if(!head) //空链表{cout<<"通讯录中没有信息"<<endl<<endl;return ;}cout<<"请输入欲删除编号"<<endl;cin>>num;node*p;p=findbynum(num);if(p)del(p);cout<<"已删除选定信息"<<endl;}void changebynum() //根据序号修改信息{int num;if(!head) //空链表cout<<"通讯录中没有信息"<<endl<<endl;return;}cout<<"请输入欲修改编号"<<endl;cin>>num;node*p;p=findbynum(num);if(p)change(p);}void inputnode()//从文件读入{char filename[30];cout<<"输入数据源文件名"<<endl;cin>>filename;ifstream fin(filename,ios::in|ios::nocreate);if(!fin){cout<<"无法打开指定文件"<<endl;exit(1);}char name[20],tel[20];int age;node *p;while(fin>>name){fin>>tel>>age;p=new node(name,tel,age);insert(p);}fin.close();}void outfromhead() //顺序输出至文件{char filename[30];cout<<"输入数据目标文件名"<<endl;cin>>filename;ofstream fout(filename);if(!fout){cout<<"无法打开指定文件"<<endl;exit(1);}if(!head)fout<<"通讯录无信息"<<endl;else{node*p;p=head;while(p){fout<<"姓名:"<<setw(20)<<p-><<endl;fout<<"电话:"<<setw(20)<<p->person.tel<<endl;fout<<"年龄:"<<setw(3)<<p->person.age<<endl<<endl;;p=p->next;}cout<<"所有信息输出完成"<<endl;}}void outfromrear() //逆序输出至文件{char filename[30];cout<<"输入数据目标文件名"<<endl;cin>>filename;ofstream fout(filename);if(!fout){cout<<"无法打开指定文件"<<endl;exit(1);}if(!rear)fout<<"通讯录无信息"<<endl;else{node*p;p=rear;while(p){fout<<"姓名:"<<setw(20)<<p-><<endl;fout<<"电话:"<<setw(20)<<p->person.tel<<endl;fout<<"年龄:"<<setw(3)<<p->person.age<<endl<<endl;;p=p->pre;}cout<<"所有信息输出完成"<<endl;}}bool Cmpstr(char*name_node,char*name_search)//传统型字符串比较函数,支持通配符*,?及大小写转换,name_node等于name_search时,返回true{if(name_search[0]=='*') //通配符*,通配任意字符串,返回truereturn true;char name1[20],name2[20];//避免改变原结点中的信息strncpy(name1,name_node,20);strncpy(name2,name_search,20);int size1=strlen(name1),size2=strlen(name_search);for(int i=0;i<size2;i++){if(name2[i]>='A'&&name2[i]<='Z')//大写全部转换为小写,以便于比较,人性化处理name2[i]+=32;}for(int i1=0;i1<size1;i1++){if(name1[i1]>='A'&&name1[i1]<='Z')//大写全部转换为小写,以便于比较,人性化处理name1[i1]+=32;}for(int i2=0;i2<size1;i2++){if(name_search[i2]=='*')//通配符*,通配任意字符串,{for(int j=0;j<i2;j++){if(name1[j]!=name2[j])return false;}return true;}}if(size1!=size2)//不等长时,即两字符串不相等,返回false{return false;}for(int i3=0;i3<size1;i3++){if(name2[i3]=='?')//通配符‘?’,通配任一字符continue;if(name1[i3]!=name2[i3])return false;}return true;}};//main.cpp#include "node.h"void main();char buffer[100];void show_data(link &a){char c;cout<<"查看全部数据"<<endl;cout<<"1.顺序 2.逆序"<<endl;cin>>c;if(c=='1'){a.showfromhead();system("pause");cout<<endl<<endl;system("cls");return;}if(c=='2'){a.showfromrear();system("pause");cout<<endl<<endl;system("cls");return;}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void show_data(link &a);return;}};void delet_data(link &a){char c;cout<<"删除数据"<<endl;cout<<"1.根据序号删除数据 2.根据姓名删除数据"<<endl;cin>>c;if(c=='1'){a.delbynum();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.delbyname();system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void delet_data(link &a);}};void insert_data(link &a){cout<<"添加数据"<<endl;a.insert(a.cinnode());system("pause");cout<<endl<<endl;system("cls");};void updata(link &a){char c;cout<<"修改数据"<<endl;cout<<"1.根据序号修改数据 2.根据姓名修改数据"<<endl;cin>>c;if(c=='1'){a.changebynum();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.changebyname();system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void updata(link &a);}};void search_data(link &a){char c;node *temp;cout<<"查找数据"<<endl;cout<<"1.根据序号查找数据 2.根据姓名查找数据(支持*与?的通配)"<<endl;cin>>c;if(c=='1'){a.showbynum();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.showbyname(temp);system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void search_data(link &a);}};void output_data(link &a){char c;cout<<"将数据输出至文件"<<endl;cout<<"1.升序 2.降序"<<endl;cin>>c;if(c=='1'){a.outfromhead();system("pause");cout<<endl<<endl;system("cls");}if(c=='2'){a.outfromrear();system("pause");cout<<endl<<endl;system("cls");}if(c!='1'&&c!='2'){cout<<"input error"<<endl;system("pause");cout<<endl<<endl;system("cls");void output_data(link &a);}};link a;void menu(){char c;cout<<"\t\t 通讯录管理系统"<<endl;cout<<"1.查看全部数据"<<endl;cout<<"2.删除数据"<<endl;cout<<"3.添加数据"<<endl;cout<<"4.修改数据"<<endl;cout<<"5.查找数据"<<endl;cout<<"6.从文件输入数据"<<endl;cout<<"7.将数据输出至文件"<<endl;cout<<"8.退出"<<endl<<endl;cout<<"请输入您需要的功能"<<endl;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<<"从文件输入数据"<<endl;a.inputnode();system("pause");cout<<endl<<endl;system("cls");menu();break;case '7':output_data(a);menu();break;case '8':cout<<"谢谢使用"<<endl;return ;default:{cin.clear();cin.getline(buffer,100);cout<<"input error "<<endl;system("pause");system("cls");menu();}}return;}void main() //显示菜单,并调用对应函数{menu();}。
链表实现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个元素。
C++链表通讯录完美版
C++语言课程设计学号:*********姓名:楚归羽指导老师:张目录一、程序功能 (2)二、题目分析 (2)三、设计中遇到的问题及解决方法 (2)四、感想与心得 (2)五、程序说明 (2)六、函数调用关系及主要算法的实现 (8)七、数据测试 (8)一、程序功能程序采用单向链表类结构实现实现通讯录多个纪录的管理工作。
1、提示输入个字段,一次输入一个人的数据2、输入待删除记录的姓名,显示其所有信息,让用户确认是否删除3、按顺序显示所有记录,每显示10条记录暂停,按Enter继续4、输入姓名,显示其所有信息5、用户输入姓名,系统显示该姓名下所有信息,同时显示子菜单,用户按子菜单提示进行修改6、从实现建立的正文文件中批量导入数据。
程序运行时,用户需输入正文文件名7、将库表中数据写入一个正文文件中。
程序运行时,用户需输入正文文件名8、首先显示当前排序关键字,然后提示是否需要改变。
系统默认按姓名排序,可在按办公室电话排序之间切换9、退出系统二、题目分析程序采用单向链表类结构实现,每个结点代表一个通讯记录。
链表类实现通讯录多个纪录的管理工作。
三、设计中遇到的问题及解决方法初次接触课程设计,刚刚拿到题目,实在是茫然无头绪,于是反复研究了题目,仔细复习了链表部分的知识点,加上和同学的讨论,终于是有了一个大概的思路。
刚开始着手编写的时候问题不断,幸好经过练习册上的指示,搭好了基本的框架,可是链表部分仍然是出了很大的问题,经过自己的反复实验与不断努力终于编译成功。
后面的文本文件的读入与写入则是另一个难题,因为这一块练习的不是很多,只在课本上看到了一些皮毛,在编译与调试时也遇到了很大问题。
最后通过看书上的例题并在与同学交流探讨中解决了这些问题。
四、感想与心得C++作为一门必修课程,学习的过程实在是痛苦的,尤其是在编程的时候,因为总是会出现各种各样的错误。
只有通过反复的调试,通过无数次的排错,才能编写出正确的程序,更多的时候,一个很小的很无聊错误就能导致长时间的迷惑。
C语言版用链表实现通讯录
C语言版用链表实现通讯录“标头.h”#include<stdio.h>#include<stdlib.h>#include<string.h>#define Len sizeof(Lnode)int seat;//全局变量,用于存储通讯录成员信息typedef struct Lnode{int number; //学号char name[20];//名字double telenum;//struct Lnode *next;//定义一个指向下一个节点的指针} Lnode,*LinkList;//把struct Lnode*重定义为LinkListLinkList creatIncreLink();void deleteElem(LinkList l,int i);int delName(LinkList l,char name[]);int delNum(LinkList l,int n);void insertYouxu(LinkList l,LinkList Elem);void printList(LinkList l);LinkList prior(LinkList l,LinkList p);int searchName(LinkList l,char name[]);int searchNum(LinkList l,int n);#include<stdio.h>#include"标头.h"LinkList creatIncreLink(){LinkList p;int num=1,number;double telenum;char name[20],temp;LinkList L,P;L=(LinkList)malloc(Len); //创建头结点L->next = NULL;printf("请输入学生学号、和,建立通讯录,以'-1'为输入结果标志\n");printf("请输入学号 %d:");scanf("%d",&number);printf("请输入 %d:");temp=getchar();gets(name);printf("请输入 %d:");scanf("%lf",&telenum);while (number >= 0){p = (LinkList)malloc(Len); //新分配结点p->number = number;p->telenum = telenum;strcpy(p->name,name);insertYouxu(L,p); //有序地插入新结点num++;printf("请输入学号 %d:",&num);scanf("%d",&number);printf("请输入 %d:",num);temp=getchar();gets(name);printf("请输入 %d:",num);scanf("%lf",&telenum);}return(L);}void deleteElem(LinkList l,int i) //删除函数{LinkList p=l,q;//让p指向lint j=0;//循环变量jwhile(p->next&&j<i-1) //循环让p指向第i个元素的前驱 {p=p->next;j++;}if(p->next==0) //判断下一个元素是否为空printf("ERROR");q=p->next;//将p指向第i个元素p->next=q->next;//p的next指向q的nextfree(q);//释放q链表}int delName(LinkList l,char name[]){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL)printf("该链表中没有元素");else{while(p!=NULL){if(strcmp(p->name,name)!=0){flag=1;printf("%s",p->name);p=p->next;deleteElem(l,seat);}else{p=p->next;seat++;}}if(flag==1)printf("被删除");}return flag;}int delNum(LinkList l,int n){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL)printf("没有元素");else{while(p!=NULL){if(p->number<=n){if(p->number==n){flag=1;printf("%d",p->number);p=p->next;deleteElem(l,seat);}}else{p=p->next;seat++;}}printf("被删除");}return flag;}void insertYouxu(LinkList l,LinkList Elem){LinkList p=l->next;while(p!=NULL&&Elem->number>=p->number) {if(p->number==Elem->number){printf("重复输入\n");return;}p=p->next;}if(p==NULL){p=prior(l,p);Elem->next=NULL;p->next=Elem;}else{p=prior(l,p);Elem->next=p->next;p->next=Elem;}}void printList(LinkList l){LinkList p=l;int n=1;printf("容");if(l==NULL||l->next==NULL)printf("没有元素\n");elsewhile(p->next!=NULL){printf(" - %-9d",n,p->next->number);printf(" %-5s %.0f\n",p->next->name,p->next->telenum); p=p->next;n++;}}LinkList prior(LinkList l, LinkList p){LinkList p_prior=l;if(l->next==NULL)return(l);while(p_prior->next!=p)p_prior=p_prior->next;return(p_prior);}int searchName(LinkList l,char name[]){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL||l==NULL)printf("查找失败");else{while(p!=NULL){if(!strcmp(p->name,name)){flag=1;printf("要查找的是%d位通讯录成员\n",seat);printf("学号:%d 名字:%s :%f\n",p->number,p->name,p->telenum); }p->next;seat++;}}return flag;}int searchNum(LinkList l,int n){int flag=0;LinkList p=l->next;seat=1;if(l->next==NULL)printf("查找失败");else{while(p!=NULL){if(p->number<=n)if(p->number==n){flag=1;printf("要查找的是%d个成员\n",seat);printf("学号:%d :%s :%f",p->number,p->telenum,p->telenum); }p=p->next;seat++;}}return flag;}int main(void){LinkList l=NULL,p;int flag=0;int menu;char temp;system("color 3f");printf("输入1通讯录的建立\n");printf("输入2插入通讯录\n");printf("输入3查询通讯录\n");printf("输入4删除通讯录\n");printf("输入5显示通讯录信息\n");printf("输入0退出\n");scanf("%d",&menu);while(menu!=0){switch(menu){case 1:l=creatIncreLink();printf("建立通讯录\n");printList(l);flag=1;break;case 2:if(flag==1){int number;double telenum;char name[20];char temp;printf("请输入学号\n");scanf("%d",&number);printf("请输入\n");scanf("%s",&name[20]);printf("请输入");scanf("%f",&telenum);p=(LinkList)malloc(Len);p->number=number;strcpy(p->name,name);p->telenum=telenum;insertYouxu(l,p);printf("插入后\n");printList(l);}else{printf("error\n");}break;case 3:int way,n,s;char na[20],temp;if(l!=NULL){if(flag){printf("选择查找方式1,按学号查找2按"); scanf("%d",&way);if(way==1){printf("请输入学号\n");scanf("%d",&n);s=searchNum(l,n);if(s==0)printf("shibai");}else if(way==2){printf("请输入");temp=getchar();gets (na);s=searchName(l,na);if(s==2)printf("失败");}else printf("无记录");}break;}else printf("无记录");break;case 4:printf("1,按序号删除2 按学号,3按\n"); scanf("%d",&way);if(way==1){int n;printf("请输入序号");scanf("%d",&n);printf("删除后\n");deleteElem(l,n);printList(l);}else if(way==2){int n,f;printf("请输入学号");scanf("%d",&n);f=delNum(l,n);if(f!=0){printf("删除后");printList(l);}else printf("失败");}else if(way==3){char na[20],temp;int f;printf("输入");temp=getchar();gets(na);f=delName(l,na);if(f!=0){printf("删除后");printList(l);}else printf("失败");}else printf("error\n");break;case 5:printf("容如下\n");printList(l);break;case 0:exit(0);default:printf("重新输入"); }printf("选择\n");scanf("%d",&menu);}}。
链表在现实世界中的应用
链表在现实世界中的应用链表是一种常用的数据结构,它由一系列节点组成,每个节点包含两个部分:数据和指向下一个节点的指针。
链表在计算机科学中被广泛应用于各种场景,而在现实生活中,我们也可以找到许多应用链表的例子:1. 文件系统:在计算机的文件系统中,目录的结构就是一个链表。
每个目录(文件夹)都包含多个文件和子目录。
子目录可以包含更多的文件和子目录,形成了一个层次结构。
这种结构可以用链表来表示,其中每个节点都代表一个目录,节点中的数据部分包含目录的名称,而指针部分指向下一个目录。
2. 网页浏览器的历史记录:当你在网页浏览器中浏览网页时,浏览器的历史记录功能使用链表来记录你访问过的网页。
新访问的网页会被添加到链表的头部,而链表的尾部是你最早访问的网页。
这样,你就可以方便地向前翻页,查看你之前访问过的网页。
3. 电话簿:在电话簿应用中,联系人信息被存储在一个链表中。
每个节点都代表一个联系人,节点中的数据部分包含联系人的姓名和电话号码,指针部分指向下一个联系人。
通过这种方式,你可以方便地按照字母顺序或其他方式浏览联系人列表。
4. 音乐播放器:在许多音乐播放器中,歌曲的播放列表使用链表来组织。
用户可以添加、删除和编辑播放列表,这些操作都可以在链表上方便地实现。
5. 操作系统:在操作系统的进程管理中,链表用于存储正在运行的进程。
每个节点代表一个进程,节点中的数据部分包含进程的状态和相关信息,指针部分指向下一个进程。
操作系统需要经常对链表进行操作,如创建新进程、删除进程和调度进程等。
以上只是链表在现实世界中的一些应用示例,实际上链表的应用非常广泛,它是一种非常有用的数据结构。
通讯录算法描述
通讯录算法描述通讯录算法描述一、概述通讯录是人们在日常生活中经常使用的工具,其主要功能是存储和管理联系人信息。
通讯录算法是指实现通讯录功能的计算机程序,其核心是数据结构和算法。
本文将从数据结构和算法两个方面对通讯录算法进行详细描述。
二、数据结构1. 链表链表是一种常见的数据结构,在通讯录中可以用来存储联系人信息。
每个节点包含联系人的姓名、电话号码等信息,以及指向下一个节点的指针。
通过遍历链表可以查找、添加、删除联系人信息。
2. 哈希表哈希表是一种高效的数据结构,在通讯录中可以用来快速查找联系人信息。
哈希表将每个联系人的姓名映射到一个唯一的索引值,然后将该索引值作为数组下标存储联系人信息。
通过哈希函数可以快速计算出联系人在数组中的位置,从而实现快速查找。
3. 树形结构树形结构是一种层次化的数据结构,在通讯录中可以用来组织联系人信息。
树形结构由根节点、子节点和叶子节点组成,每个节点包含一个或多个属性。
在通讯录中可以将联系人按照姓名的首字母分组,每个分组作为一个节点,子节点包含具体的联系人信息。
三、算法1. 查找算法查找算法是通讯录算法中最基本的功能之一。
可以通过遍历链表、哈希表或树形结构实现查找。
其中,哈希表是最快的查找方法,时间复杂度为O(1),而链表和树形结构的时间复杂度分别为O(n)和O(logn)。
2. 添加算法添加算法是通讯录算法中另一个重要的功能。
在链表中添加联系人只需要将新节点插入到链表尾部即可,时间复杂度为O(1);在哈希表中添加联系人需要先计算出索引值,然后将联系人信息插入到对应位置,时间复杂度也为O(1);在树形结构中添加联系人需要先查找对应的节点,然后将新联系人作为子节点插入到该节点下面,时间复杂度为O(logn)。
3. 删除算法删除算法是通讯录算法中比较常用的功能之一。
在链表中删除联系人只需要将该节点从链表中移除即可,时间复杂度为O(1);在哈希表中删除联系人需要先计算出索引值,然后将对应位置上的元素删除即可,时间复杂度为O(1);在树形结构中删除联系人需要先查找对应的节点,然后将该节点从树中移除即可,时间复杂度为O(logn)。
单链表通讯录课程设计
单链表通讯录课程设计一、引言随着社会的发展,人们之间的联系越来越紧密,通讯录成为了人们生活中必不可少的工具。
通讯录是一种记录联系人信息的工具,可以帮助人们随时随地地查找联系人信息。
本文将介绍一个基于单链表的通讯录课程设计。
二、需求分析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层的相关函数进行数据处理。
用链表的方法实现一个简单的电话本
用链表的方法实现一个简单的电话本:#include <iostream>#include <>#include <fstream>#include <iomanip>#include <string>using namespace std;<< p -> GetName() << '\n'<< " 电话:" << setw(15) << p -> GetTel();p = p -> next_ptr;i++;}();添加新的联系人\n"<< "\t\t\t2. 删除某个联系人\n"<< "\t\t\t3. 删除所有联系人\n"<< "\t\t\t4. 查询某个联系人\n"<< "\t\t\t5. 查询所有联系人\n"<< "\t\t\t6. 将电话本导出到文件\n"<< "\t\t\t7. 从文件导入电话本\n"<< "\t\t\t0. 退出系统" << endl;cin >> ch;return ch;}// 主函数main(){cout << "\t\t\t 欢迎您使用电话本系统!\n\n" << endl; PhoneBook mypb;int ch;while (ch=Choice()){switch(ch){case 1:// 新增联系人{string name;string tel;cout << " 请输入联系人姓名:" << endl;();getline (cin,name);cout << " 请输入联系人电话:" << endl;cin >> tel;undergraduate per(name,tel); (per);break;}case 2:// 删除联系人{string deletename;cout << " 请输入要删除的联系人姓名:" << endl;();getline (cin,deletename); (deletename);break;}case 3:// 删除所有联系人{();break;}case 4:// 查询某个联系人{string fname;cout << " 请输入要查询的联系人姓名:"();getline (cin,fname);(fname);break;}case 5:// 查询所有联系人{();break;}case 6:// 将电话本导出到文件{();break;}case 7:// 从文件导入电话本{();break;}default:{cerr << " 输入错误, 请重新输入!" << endl;}}}cout << " 感谢您使用电话本系统, 再见!" << endl;system("pause");return 0;}。
链表实现通讯录
#i n c l u d e<s t d i o.h>#include <malloc.h>#include <stdlib.h>#include <string.h>struct txl{char n[10];char name[10];char sex [10];char tele[12];char address[100];struct txl *next;};typedef struct txl TXL;typedef struct txl * link;enum result {exit_ok};void menu_select()//主菜单{printf(" 欢迎进入通讯录管理系统\n");printf("********************************\n");printf(" 1.联系人添加\n");printf(" 2.联系人删除\n");printf(" 3.联系人修改\n");printf(" 4.联系人查找\n");printf(" 5.联系人总览\n");printf(" 0.退出通讯录管理系统\n");printf("********************************\n");}void is_malloc_ok(link *new_node){if((*new_node) == NULL){printf("Malloc error!");exit(-1);}}void create_link(link *head){(*head) = (link)malloc(sizeof(TXL));is_malloc_ok(head);(*head)->next = NULL;}void create_new_node(link *new_node){int i;*new_node = (link)malloc(sizeof(TXL));is_malloc_ok(new_node);printf("请输入编号:\n");scanf("%s",&(*new_node)->n);printf("请输入姓名:\n");scanf("%s",&(*new_node)->name);printf("请输入性别:\n");scanf("%s",&(*new_node)->sex);printf("请输入联系电话:\n");scanf("%s",&(*new_node)->tele);printf("请输入家庭地址:\n");scanf("%s",&(*new_node)->address);printf("联系人添加成功!\n");}insert_new_node(link *new_node,link *head){(*new_node)->next = (*head)->next;(*head)->next = (*new_node);}void add_new_node(link *head){link new_node;create_new_node(&new_node);insert_new_node(&new_node,head);}void display(link *head){int i = 1;link p = NULL;if((*head)->next == NULL){printf("通讯录为空!\n");return;}else{p = (*head)->next;while(p != NULL){printf("第%d个联系人的信息如下:\n",i);printf("序号:%s\n",p->n);printf("姓名:%s\n",p->name);printf("性别:%s\n",p->sex);printf("联系电话:%s\n",p->tele);printf("家庭地址:%s\n\n\n",p->address);p = p->next;i++;}}}void find(link *head){char n1[10],name1[10],tele1[12],address1[100];int i;link xz = (*head)->next;printf("1.按编号查询\n");printf("2.按姓名查询\n");printf("3.按联系电话查询\n");printf("请输入您想选择的查询方式:\n");scanf("%d",&i);if(i == 1){printf("请输入您想查询的编号:\n");scanf("%s",n1);if(xz == NULL){printf("通讯录为空!\n");return;}while(xz !=NULL){if(strcmp(xz->n,n1) == 0){printf("您想查询的联系人的信息如下:\n");printf("编号:%s\n",xz->n);printf("姓名:%s\n",xz->name);printf("性别:%s\n",xz->sex);printf("联系电话:%s\n",xz->tele);printf("家庭地址:%s\n",xz->address);return;}elsexz = xz->next;}printf("通讯录中无此人!\n");}if(i == 2){printf("请输入您想查询的姓名:\n");scanf("%s",name1);if(xz == NULL){printf("通讯录为空!\n");return;}while(xz != NULL){if(strcmp(xz->name,name1) == 0){printf("您想查询的联系人的信息如下:\n");printf("编号:%s\n",xz->n);printf("姓名:%s\n",xz->name);printf("性别:%s\n",xz->sex);printf("联系电话:%s\n",xz->tele);printf("家庭地址:%s\n",xz->address);return;}elsexz = xz->next;}printf("通讯录中无此人!\n");return;}if(i == 3){printf("请输入您想查询的联系电话:\n");scanf("%s",tele1);if(xz == NULL){printf("通讯录为空!\n");return;}while(xz != NULL){if(strcmp(xz->tele,tele1) == 0){printf("您想查询的联系人的信息如下:\n");printf("编号:%s\n",xz->n);printf("姓名:%s\n",xz->name);printf("性别:%s\n",xz->sex);printf("联系电话:%s\n",xz->tele);printf("家庭地址:%s\n",xz->address);return;}elsexz = xz->next;}printf("通讯录中无此人!\n");return;}}void change(link *head){int a;link p = (*head)->next;char name1[10];char tele1[12];char address1[100];printf("请输入您想修改的联系人信息:\n");printf("1.姓名\n");printf("2.联系电话:\n");printf("3.家庭地址:\n");scanf("%d",&a);if(a == 1){printf("请输入原姓名:\n");scanf("%s",name1);while( p != NULL){if((strcmp(p->name,name1)) == 0){printf("请输入新的姓名:\n");scanf("%s",&p->name);printf("联系人修改成功!\n");return;}elsep = p->next;}printf("通讯录中没有此人!\n");return;}if(a == 2){printf("请输入原联系电话:\n");scanf("%s",tele1);while(p != NULL){if((strcmp(p->tele,tele1)) == 0){printf("请输入新的联系电话:\n");scanf("%s",&p->tele);printf("联系人修改成功!\n");return;}elsep = p->next;}printf("通讯录中没有此人!\n");}if(a == 3){printf("请输入原家庭地址:\n");scanf("%s",address1);while(p != NULL){if((strcmp(p->address,address1)) == 0){printf("请输入新的家庭地址:\n");scanf("%s",&p->address);printf("联系人修改成功!\n");return;}elsep = p->next;}printf("通讯录中没有此人!\n");}}void delete(link *head){link p1 = (*head);link p2 = (*head)->next;char name1[10];printf("请输入您要删除的联系人姓名:\n");scanf("%s",name1);if((*head)->next = NULL){printf("通讯录为空!\n");return;}while((strcmp(p2->name,name1) != 0)&&p2->next !=NULL) {p1 = p2;p2 = p2->next;}if(p2->next == NULL ){if(strcmp(p2->name,name1) == 0){p1->next = NULL;printf("该联系人已删除!\n");free(p2);}else{printf("通讯录中无此人!\n");}}else{p1->next = p2->next;free(p2);}}void exit_link(){printf("************************\n");printf(" 再见!\n");exit(exit_ok);}void switch_function(link *head){int num;scanf("%d",&num);switch(num){case 1:add_new_node(head); break;case 2:delete(head);break;case 3:change(head);break;case 4:find(head);break;case 5:display(head);break;case 0:exit_link();break;default:printf("该功能不存在,请重新输入!");break;}}int main(){link head = NULL;link new_node = NULL;create_link(&head);menu_select();while(1){printf("请输入您想要的功能:\n");switch_function(&head);}return 0;}。
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;}运⾏截图以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
通讯录链表
#include <stdio.h>#include <stdlib.h>#include<string.h>struct node{ char name[20];char tel[12];char add[50];char qq[12];char num[15];struct node * next;};void new_record();void listall();void search();void revise();void Delete();void save();void get();struct node *head, *cur, *newp;void main(){head=(struct node *)malloc(sizeof(struct node));head->next=NULL;head=NULL;get();char a;printf("@欢迎使用通讯录@\n");printf("=======>1 进入通讯录\n");printf("=======>0 退出\n");scanf("%d",&a);while(a){printf("*********************通讯录**********************\n");printf("=======>1 添加新的数据\n");printf("=======>2 显示所有信息\n");printf("=======>3 查找信息\n");printf("=======>4 修改信息\n");printf("=======>5 删除信息\n");printf("=======>6 保存\n");printf("=======>0 退出\n");scanf("%d",&a);switch(a){case 1:{new_record();break;}case 2:{listall();break;}case 3:{search();break;}case 4:{revise();break;}case 5:{Delete();break;}case 6:{save();break;}case 0:{printf("**********谢谢使用,再见**********\n");break;}}}}void new_record(void){newp=(struct node * )malloc(sizeof(struct node));/* 开辟新结点*/newp->next=NULL;if(head==NULL) /* 原来为空表*/ head=newp;else{cur=head; /* 原来已有结点*/while(cur->next!=NULL)cur=cur->next;cur->next=newp;}cur=newp; /* 使cur指向新结点*/ getchar();printf("*****************添加新的通讯录****************\n");printf("输入姓名:"); /* 以下输入新结点数据*/gets(cur->name);printf("输入学号:");gets(cur->num);printf("输入电话:");gets(cur->tel);printf("输入QQ:");gets(cur->qq);printf("输入家庭住址:");gets(cur->add);cur->next=NULL; /* 新结点不再指向其它结点*/}void listall(void){int i=0;if(head==NULL){printf("通讯录为空\n");return;}cur=head; /* 使cur指向第一个结点*/do{printf("\n%d\n",++i); /*记录输出的个数*/printf("姓名: %s\n",cur->name); /*依次输出数据*/printf("学号: %s\n",cur->num);printf("电话: %s\n",cur->tel);printf("QQ: %s\n",cur->qq);printf("家庭住址: %s\n",cur->add);cur=cur->next;}while (cur!=NULL); /* 打印完最后一个结点不再打印*/}void search(void){char name[20];char num[15];char a;printf("**************请选择查找方式****************\n======>1.按姓名查找\n======>2.按学号查找\n"); /*选择查找方式*/scanf("%d",&a);if(a==1){printf("请输入要查找的名字\n"); /*按姓名查找*/scanf("%s",&name);cur=head;int i=0;int j=0;while(cur){if(strcmp(name,cur->name)==0) /*比较改结点是否有待查找的数据*/{j=1;printf("\n%d\n",++i); /*有显示出数据*/printf("姓名:%s\n",cur->name);printf("学号:%s\n",cur->num);printf("电话:%s\n",cur->tel);printf("QQ:%s\n",cur->qq);printf("地址:%s\n",cur->add);}cur=cur->next;}if(j==0) /*通讯录中无待查找的数据*/ printf("@没有查找的姓名@\n");printf("@搜送完毕@\n");}else if(a==2){printf("请输入要查找的学号\n"); /*按学号查找*/scanf("%s",&num);cur=head;int i=0;int j=0;while(cur){if(strcmp(num,cur->num)==0){j=1;printf("\n%d\n",++i);printf("姓名:%s\n",cur->name);printf("学号:%s\n",cur->num);printf("电话:%s\n",cur->tel);printf("QQ:%s\n",cur->qq);printf("地址:%s\n",cur->add);}cur=cur->next;}if(j==0)printf("没有查找的学号\n");printf("搜送完毕\n");}elseprintf("输入错误,请重新输入\n");}void revise(void){char name[20];int j=0;int i=1;printf("请输入要修改人的姓名\n");scanf("%s",&name); /*按姓名查找要修改的结点*/cur=head;while(cur){if(strcmp(name,cur->name)==0){j=1; /*先输出所有的信息,便于与要修改的地方对照*/printf("姓名:%s\n",cur->name);printf("学号:%s\n",cur->num);printf("电话:%s\n",cur->tel);printf("QQ:%s\n",cur->qq);printf("地址:%s\n",cur->add);printf("请输入要修改的信息\n");while(i){printf("1.修改学号\n2.修改电话\n3.修改QQ\n4.修改地址\n0.修改完成或退出修改\n");scanf("%d",&i);switch(i){ /*修改时一一对照*/case 1:{printf("原学号:%s\n",cur->num);printf("请输入修改的学号:");scanf("%s",cur->num);printf("修改完成\n");break;}case 2:{printf("原电话:%s\n",cur->tel);printf("请输入修改的电话:");scanf("%s",cur->tel);printf("修改完成\n");break;}case 3:{printf("原QQ:%s\n",cur->qq);printf("请输入修改的QQ:");scanf("%s",cur->qq);printf("修改完成\n");break;}case 4:{printf("原地址:%s\n",cur->add);printf("请输入修改的地址:");scanf("%s",cur->add);printf("修改完成\n");break;}case 0:break;default:printf("输入错误,请重新输入");}}}cur=cur->next; /*查找下一个结点是否有要修改的信息*/ }if (j==0)printf("无要修改的对象\n");}void Delete(void){struct node *p;char name[20];int i=1;cur=head;printf("输入要删除人的姓名\n"); /*按姓名查找要删除的结点*/scanf("%s",&name);if(strcmp(name,head->name)==0) /*判断是不是第一个结点就是要删除的*/ {head=head->next;i=0;printf("删除完成\n");}else{cur=head->next;while(i){if(strcmp(name,cur->name)==0) /*找到了要删除的结点*/{newp=head;while(i){if(newp->next==cur) /*找要删除结点的指针*/{newp->next=cur->next; /*略去该结点,删除完成*/i=0;printf("删除完成\n");break;}elsenewp=newp->next;}}elsecur=cur->next;}}if(i)printf("无要删除的姓名\n");}void save(){FILE *fp;fp=fopen("通讯录.txt","w+");while(head){fprintf(fp,"姓名:%s\t",head->name);fprintf(fp,"学号:%s\t",head->num);fprintf(fp,"电话:%s\t",head->tel);fprintf(fp,"QQ:%s\t",head->qq);fprintf(fp,"地址:%s\t",head->add);fprintf(fp,"\n");head=head->next;}fclose(fp);printf("保存完毕。
链表通讯录课程设计
链表通讯录课程设计一、教学目标本课程的目标是让学生掌握链表在通讯录管理中的应用。
具体来说,知识目标包括理解链表的基本概念、结构及其在通讯录中的作用;技能目标则是培养学生运用链表进行通讯录数据管理的能力,包括创建、删除、查找和修改通讯录信息;情感态度价值观目标则是培养学生对计算机科学的好奇心、探索精神和责任感。
二、教学内容本课程的教学内容主要包括链表的基本概念、结构及其在通讯录管理中的应用。
具体安排如下:1.第一课时:链表的基本概念和结构。
介绍链表的定义、特点及其与数组的区别。
2.第二课时:链表的创建与删除。
讲解如何创建一个链表、如何删除链表中的节点以及如何释放链表内存。
3.第三课时:链表的查找与修改。
教授如何查找链表中的节点、如何修改链表中的节点数据以及如何实现链表的排序。
4.第四课时:链表在通讯录中的应用。
结合实际案例,讲解如何使用链表管理通讯录信息,包括增加、删除、查找和修改通讯录条目。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。
主要包括:1.讲授法:用于讲解链表的基本概念、结构和通讯录管理的基本原理。
2.案例分析法:通过分析实际案例,让学生了解链表在通讯录中的应用。
3.实验法:让学生动手实践,实际操作链表的操作方法,提高其实际应用能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《数据结构与算法》。
提供链表的基本概念、结构和算法。
2.多媒体资料:包括链表的动画演示、实际案例的视频讲解等,帮助学生更直观地理解链表的操作。
3.实验设备:提供计算机和编程环境,让学生可以实际操作链表的操作方法。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面、客观、公正地评价学生的学习成果。
具体安排如下:1.平时表现:占比30%,通过课堂参与、提问、小组讨论等方式评估学生的学习态度和理解程度。
2.作业:占比30%,布置与课程内容相关的编程练习,评估学生的实际操作能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdlib.h> /*与malloc.h差不多*/
#include <string.h>
#define maxlen 100
struct persons
{ char name; /*定义结构体数组用于缓存数据*/
char addr[20];
char str1[20];
FILE *fp; /*定义文件指针*/
void creat() /*将文件的信息读入结构体数组在转存入链表中*/
{ int j;
long k;
fp=fopen("people.txt","r+t"); /*打开文件*/
strcpy(p3->phnum,name1);
}
}
}
void Save() /*保存信息*/
{ int j;
fp=fopen("people.txt","w");
for(p2=head,j=0;p2!=NULL;j++,p2=p2->next)/*将信息装出入结构体数组在出入链表中*/
struct lnode *next;
}listnode,*linklist;
linklist head=NULL,r=NULL; /*定义头指针和尾指针*/
listnode *s,*p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7;
int i;
char name1,ch;
break;
case '2': Delete();
break;
case '3': Find();
break;
case '4': Input();
}
else
{ r->next=s;
r=s ;
}
}
}
else
{ fp=fopen("people.txt","w"); /*不能打开另开辟一个文件*/
i=1;
printf("\n\n\taddr:%s",p0->addr);
printf("\n\n\tphnum:%s",p0->phnum);
}
}
}
void Input() /*向通讯录中输入一个人的信息*/
{ s=(linklist)malloc(sizeof(listnode));
fread(&persons[i],sizeof(struct persons),1,fp);
s=(linklist)malloc(sizeof(listnode)); /*装存入链表中*/
strcpy(s->name,persons[i].name);
printf("\n\n\t\tphnum:");
scanf("%s",s->phnum);
if(head==NULL)
{ head=s;
}
else
{ r->next=s;
r=s;
}
}
void Alter() /*改变一个人的信息*/
printf("\n\n\t\tPlease make a choice below:");
printf("\n\t\t1.Show all the message");
printf("\n\t\t2.Delete a piece of message");
if(fp!=NULL)
{ for(i=1;i<maxlen;i++)
{ j=fgetc(fp);
if(j==EOF)
{ return;
}
k=i-1;
fseek(fp,k*sizeof(struct persons),0); /*读取一个人的信息*/
{ p4=p4->next;
p5=p4->next;
p4->next=p5->next;
free(p5);
}
}
}
void Find() /*查找的函数定义*/
p4=head;
if(strcmp(p4->name,==0)
{ p4=p4->next; /*根据各种情况判断可能性*/
head=p4;
}
else
{ while(strcmp(p4->next->name,name1)!=0) /*利用临时指针删除p4下一位的人的信息*/
}
}
void Show() /*显示所有的信息*/
{ p1=head;
while(p1!=NULL)
{ printf("\n\n\tname:%s\n",p1->name);
printf("\n\n\taddr:%s",p1->addr);
printf("\n\t\t6.Save and Exit");
printf("\n\n\n");
printf("\tInput Your Choice:");
ch=getchar();
switch(ch)
{ case '1': Show(); /*用单条件多选择语句实现调用与循环*/
{ printf("\n\n\tplease input the new meg!"); /*输入要改人的新信息*/
printf("\n\n\t\tname:");
scanf("%s",name1);
strcpy(p3->name,name1);
strcpy(s->addr,persons[i].addr);
strcpy(s->phnum,persons[i].phnum);
if(head==NULL) /*用尾插法将其插入链表中*/ /*即插入元素*/
{ head=s;
printf("\n\n\tplease input the sb's message:");
printf("\n\n\t\tname:");
scanf("%s",s->name);
printf("\n\n\t\tAddr:");
scanf("%s",s->addr);
{
p3=p3->next;
if(p3==NULL)
{ printf("\n\n\tIt is not exit in the addr-book!");
}
else if(strcmp(name1,p3->name)==0)
fwrite(&persons[j],sizeof(struct persons),1,fp);
}
}
void main()
{ creat();
do
{ printf("\n\n\n\n\tWELCOME TO USE WuBoWen's Address book");/*显示提示的信息*/
break;
default:
printf("\n\t*********************************\n");
if(p0==NULL)
{ printf("\n\n\tIt is not exit in the addr-book!");
}
else if(strcmp(name1,p0->name)==0)
{ printf("\n\n\tname:%s\n",p0->name);
printf("\n\t\t3.Find a piece of message");
printf("\n\t\t4.Insert a piece of message");
printf("\n\t\t5.Alter a piece of message");
printf("\n\n\t\tAddr:");
scanf("%s",name1);
strcpy(p3->addr,name1);
printf("\n\n\t\tphnum:");
scanf("%s",name1);
{ printf("\n\n\tplease input the name:");
p0=head;
gets(name1); /*查找人的姓名输入*/
while(strcmp(name1,p0->name)!=0&&p0!=NULL)
{ p0=p0->next;
printf("\n\n\tphnum:%s",p1->phnum);
p1=p1->next;
}
}
void Delete() /*定义一个删除的函数*/