欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    数据结构课程设计(通讯录制作).docx

    • 资源ID:1114538       资源大小:218.93KB        全文页数:34页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构课程设计(通讯录制作).docx

    设计内容通讯录本系统应完成一下几方面的功能:1)输入信息enter();2)显示信息display();3)查找以姓名作为关键字search();4)删除信息delete();5)存盘save();6)装入load();设计要求:1)每条信息至包含:姓名(NAME)街道(STREET)城市(ClTY)(EIP)国家(STATE)几项2)作为一个完整的系统,应具有友好的界面和较强的容错能力二.设计思路通过visualc+6.0(用的是C语言)编写一个dos界面的控制台程序,该程序通过链表的操作,文件存储来实现通讯录的根本功能structaddress*定义结构*/charname10;*姓名*/charstreet50;*街道*/charcity10;/*城市*/charstate15;/*国家*/chareip7;/*/struct address *next;*后继指针*/*前驱指针*/structaddress*prior;链表的插入,删除来实现通讯录里的内容的插入删除当操作完成通过文件件来存储链表的信息,下次翻开程序时,读取文件里的内容到内存中,放在链表,然后又可以对链表进行操作;在这里面,文件内容不可以在外部更改,只能通过读取到内存链表中,通过程序进行更改,然后再写入到文件,写入过程会覆盖上次的内容。structaddress*start;structaddress*last;structaddress*find(char*)*首结点*/*尾结点*/;*声明查找函数*/voidenter();/*函数声明*/voidsearch();/*查找,查找过程中调用find函数*/voidsave();/*存盘,将链表信息保存到文件中*/voidIoadO;/*导入,将文件内容导入到内存链表中*/voidlist();/*显示当前链表中信息*/voidddelete(structaddress*,structaddress*);voidinsert(structaddress*i,structaddress*start,structaddress*last);voidinputs(char*,char*,int);voiddisplay(structaddress*);intmenu_select(void);三.详细设计1.主界面设计通过SWitCh语句调用各种函数,实现各种操作。然后把SWitCh嵌套到无限的for循环(for(;)中,使完成每一步操作都回到到选择操作的主界面函数之间的相互调用'E:学习课程设计Debug谑讯录.exe,I:欢迎使用Dom通祖录系统人兴兴XX兴*兴兴XW*i青在做其它操作前先导入*xx*xx*x×××M××××××××M×××××××M××M××MMM×××M×××M××××××MMM×M××MMM××XMM××M××× ××××××M×M×M×M×××× ×××M×××M×M××××××× ×××××M××××M×X×××× ×M××MM××M×××××××× ×××××M×M×××××K××× M×M××M×××××MK××××1 .输入信息2 .删除信息3 .显示信息4 .查找5 .存盘6 .导入7 .退出MM×X×××××M×X×M×M×× M××××××××M×M××××M× ××××××××K×××MM×××× ×××××××MMM××××××M× ×××××××X×××××M×××× ××××M×××M×MXM×××M× ××××××K×M××K××MMM×M××M×××××××MKMMK××M×M×××××××M××××××××MM×××××××MPleaseenteryourchoice:voidmain()start=last=NULL;for(;)*无限循环*/(switch(menu-select()*调用主界面的选择函数,带回返回值*/(case 1: renter();continue;case 2: ddeletestart,&last);continue;case 3: list();continue;case 4: search();continue;case 5: save();continue;case 6: load();continue;case7:exit(0);)*主目录*/intmenu_select(void)(chars80;printfC欢送使用DOS通讯录系统"nzz);printf(*请在做其它操作前先导入*n")Printf(*1Printf(*2Printf(*3Printf("*4Printf("*5Printf(*6Printf(*7输入信息*n")删除信息*n")显示信息*n')查找*n")存盘*n")导入*n')退出*n")do(printf(zz11Plaseenteryourchoice:nzz);gets(s);c-atoi(s);*将获取的字符串转换成整型*/while(c<0c>7);return c;/*返回输入值*/2.输入信息函数Pleaseenteryourchoice:1输入空姓名结束:请输入 请输入 请输入 请输入 请输入姓名:刘显安街道:江西德安城市:德安国家:中国邮编:123456输入空姓名结束:请输入姓名::欢迎使用DOy通史录系统八××M×M×MMM××××××KM×××××××MMM××××X×××M××××××MM×××××××××××M×MMK××××××××息息息×MMM××××××M×M××××X××KKK×K×××××M×M××××××K××××××××M××××××××××××××××××M××××××××××××××M××K×M××MMMMXMMMMMXMMMM×XMX共兴XXXXXXXXXi青在做其它操作前先导入共头XXxXX共XXXXXMmxmxmxxmxmmxmmxmmxmxxxmxmxmxxxmxxmxmmmmmxmxxmm输入函数:structaddress*info;/*定义当前结点*/for(;)(info=(structaddress*)malIoc(sizeof(structaddress);*为当前结点分配空间*/if(!info)(printf(z,nOutofmemory");exit(0);*如果分配空间失败,退出程序*/)Printf(输入空姓名结束:n);inputs(请输入姓名:,info->name,10);if(!info->name0)break;*如果输入姓名为空,结束循环*/inputs(请输入街道:,info->street,50);inputs(请输入城市:",info->city,15);inputs(请输入国家:",info->state,15);inputs(请输入:,info->eip,7);insert(info,&start,&last);*调用结点插入函数*/)输入函数调用到另外两个函数,inputs和insert其中inputs中还用到fgets(str,n,fp),把键盘的输入信息传到字符串中charp255;do(printf(prompt);fgets(p,254,stdin);*stdin,标准输入缓存,获取键盘输入信息*/if(strlen(p)>count)printf(xznTooLongn);whiIe(strIen(p)>count);pstrlen(p)-l-0;strcpy(s,p);insert是关键函数,每当输入完一条信息都会调用到insert函数,将信息插入到链表中if(*last=NULL)/*如果尾结点为空,意味着当前链表为空*/*那么将该结点赋给头尾结点*/i->next=NULL;i->prior=NULL;*last=i;*start=;return;else*如果链表不为空,那么将信息插入到链表尾,作为尾结点*/(*last)->next=i;i->prior=*last;i->next=NULL;*last-(*last)->next;easeenteryourcnoce邮编43830023456712356123456家国国国国国中中中中市城庄阳安城麻枣阜德城庄阳安 麻枣阜德 道北东徽西 街湖山安江强坡安 名志尚林显 姓吴杨王刘 插入信息会显示在链表最后enter yourchoice强坡安林 名志尚林显建 3姓吴杨王刘黄城庄阳安州 麻枣阜德抚 道北东徽西西 街湖山安江江市城庄阳安州城麻枣阜德抚家国国国国国 Elcb( Cb邮编4383 234567 1234561234563456233.删除查找显示函数删除函数调用find函数,通过姓名,查找到该节点,然后删除该节点信息,这其中涉及到头尾节点,及其变化;先判断是否为头结点,如果为头结点,那么把原头结点的后继作为新的头结点如果不为头结点,那么该节点的前驱的next指向该节点的后继如果该节点为尾结点,那么让该节点的前驱作为新的尾结点structaddress*info;chars80;inputs(请输入姓名:”,s,10);info=find(s);if(info)(printf(z,Deletingn");if(*start=info)*start=info->next;if(*start)(*start)->prior=NULL;elseinfo->prior->next=info->next;if(info!=*last)info->next->prior=info->prior;else*last=info->prior;free(info);printf(zz-0k,删除成功!n);)与删除相比,查找就简单的多,只需要调用find的函数,找到该节点记录并显示出来就行了,在SearCh本身里面只要调整下输出的界面就行了structaddress*find(char*name)/*查找函数,形参为欲查找结点的name域*/(structaddress*info;info=start;while(info)(if(Istrcmp(name,info->name)returninfo;info=info->next;)printf(z'Namenotfound.n);returnNULL;IPleaseenteryourchoice:2请输入姓名:王林Deleting-0。删除成功,:欢迎使用D0?通奥录系统人WWXXxxWXxXXXi青在做其它操作前先导入XXXXXXWXW兴XXXM××MMMMMMXMXMM×MMXMX×MX×MM×MMMXX×M××MMMMMMMXMMMXmmmmmmmxmmmmmmmm MKKKX×MMMKMMMMMMX MXMXM×MMMMMMXMXXX ××MM××××××××M×××× ×××××M×××××××M××× ××M××MM×M××××××××1 .输入信息2 .删除信息3 .显示信息4 .查找5 .存盘6 .导入7 .退出××××××XMKMKMM×MMXM MMMMMXMMMMMMMMMMM× MMMMMX×MMMXM×××KMM MMMMX×X×X×XXXMXMMM ××××××M××××××M×××M ×××××××××××××××××× ×K××M×××××M××M××××Pleaseenteryourchoice:需输入要查找的姓名:吴志强吴志强湖北麻城麻城中国438300:欢迎使用DOS通近录系统八XXXXXxXXXXXX请在做其它操作前先导入XXXXXxXXXXXXX×××M×××××××××××××M×××××××××××××××××K×××××××M×××X*兴兴兴兴兴兴XX兴兴兴XXXX.输入信息兴兴兴兴兴兴兴兴兴兴兴兴*兴兴兴兴兴输出函数更简单,直接输出链表即可if(infO=NULDPrintf(当前记录为空!);elseprintf(姓名t街道tt城市t国家ttnzz);while(info)(display(info);/*display为输出节点函数,一些列Print组成*/if(info->next=NULL)break;info=info->next;);X××M×××××××M××××××M××××M×X×××××M×M×MM×××××KKKKK×K××3 .显示信息4 .5 .存盘6 .×××××××××××××××××7 .退出××M×M×××××××M×××××××××××××M×××××××MM××MMM×××××××××M×MM××××MK××K×K×××MM×M××××××××××××××××××enteryourchoice:强坡安林 名志尚林显建 3姓吴杨王刘黄城庄阳安州 麻枣阜德抚 道北东徽西西 街湖山安江江市城庄阳安州城麻枣阜德抚家国国国国国国中中中中中邮编4383002345671234561234563456234.存储与导入存储存储时通过f。Pen翻开文件(没有该文件时那么创立)fp=fopen(z,record.txt",wb);/*生成文件*/if(!fp)printf(,zCannotopenfile,nz,);return)然后通过fwrite将链表信息写入文件while(info)/*把链表写入文件*/fwrite(info,sizeof(structaddress),1,fp);info=info->next;fwrite每次从info读取一个sizeof(structaddress)长度的数据,写入fp文件中。写入完毕后即关闭文件fclose(fp);导入导入时先建立链表,为节点分配内存空间然后翻开文件,将文件的内容写入内存链表中registerintt,size;structaddress*info,*temp=0;char*p;FILE*fp;*翻开文件*/if(fp=fopen(record.txt,r)=NULL)(Printf("Cannotopenfile!n");return;)printfC,1111Loading.nz,);*调用文件*/size=sizeof(structaddress);*为结点分配内存*/start=(structaddress*)malIoc(size);if(!start)*如果读取失败,返回*/(printf(z,0utofmemory!n");exit(O);)info=start;P二(Char*)info;whiIe(*p+=getc(fp)!=EOF)(for(t=0;t<size-l;+t)*p+=getc(fp);info->next=(structaddress*)malloc(size);if(!info->next)Printf("Outofmemory!n7z);return;info->prior=temp;temp=info;info-info->next;P=(char*)info;temp->next=O;last=temp;start->prior=0;fclose(fp);注意:每次文件存储的时候都会覆盖以前存在文件里的内容,而每次导入的时候都会改变链表的内容。因此每次翻开程序时请先导入存储在文件里的数据,或者将record.txt备份存储起来,防止数据丧失。通过本次课程设计,我学到了很多东西。以前从没有用过文件方面的知识,而这次设计中用到了,刚开始使用时出了很多问题,在文件存储时经常遇到意外错误而导致程序终止了。这次的实验使我对结构体,链表的认识更深刻,使用更熟练,刚开始时在链表插入时遇到好屡次内存方面的错误,还有插入操作时对指针的使用不太熟练。通过一次次的思考与实验,思路更加清晰,程序的容错能力也越来越强。这次实验让我学到很多书本上没有的东西。程序里屡次用到for(;)循环,还有(StrUCtaddress*)malloc(sizeof(structaddress)为节点分配内存空间。在文件操作中主要涉及到的函数有:fopenL文件名”J使用文件方式”);fwrite(info,sizeof(structaddress),1,fp);fclose(文件指针);五.参考资料C程序设计第三版)谭浩强清华大学出版社数据结构(C+版)李根强中国水利水电出版社附完整源码:#include<stdio.h>#include<stdlib.h>#include<string.h>"定义结构*/structaddresscharname10;charstreet50;charcity1O;charstate15;chareip7;struct address *nxt;后继指针*/struct address *prior;Z*前驱指针7;struct address *start;首结点*/struct address *last;*尾结点7声明查找函数*/structaddress*find(char*);voidenter();*函数声明7voidsearch();voidsave();voidload();voidlist();voidddelete(structaddress*start,structaddress*last);voidinsert(structaddress*i,structaddress*start,structaddress*last);voidinpus(char*,char*,int);voiddisplay(structaddress*);intmenu.selct(void);voidmain()start=last=NULL;for(;)(switch(menu_select()(case1:enter();ntinue;case2:ddelete(&starty&last);ntinue;case3:list();ntinue;case4:search();ntinue;case5:save();ntinue;case6:load();ntinue;case7:exit(0);)intmenu_select(void)*主目录*/printf(wA欢送使PrintfL* 请在做其chars80;intc;用DOS通讯录系统An);它操作前先导入*f*n“);printf(*«*«*n");Printf(W*1输入信息*>.PrintfCMr*2JM除信息*A.).*) PHnV*3显示信息*m*y.).printf(ww*4.查找printf(tt*5.存盘printf(,6.导入*) m*.*y).printf(tt*7.退出pA口行c*w*jn)doprintf(nPleaseenteryourchoice:n");gts(s);c=atoi(s);while(c<0c>7);return c;void nter()*返回输入值*/厂输入函数,本函数循环输入资料,当输入姓名为空时退出*/structaddress*info;/*定义当前结点7for(;)(info=(structaddress*)mall(sizeof(structaddress);/*为当前结点分配空间*/if(!info)printf("nOutofmemory");exit(O);如果分配空间失败,退出程序*/Printfc输入空姓名结束:Vr);inputs(”请输入姓名:*info>name,10);if(!info->nam0)break;如果输入姓名为空,结束循环*/inputs,请输入街道:*info>street,50);inputs("请输入城市:*info>city,15);inputS(N请输入国家:*info>state,15);InPUtS(N请泊人:",inft»eip,7);insert(info,&start,&last);/*调用结点插入函数*/)voidinputs(char*prompt,char*s,intunt)/*输入函数,有越界检溜功能*/(charp255;do(printf(prompt);fgets(p,254,stdin);if(strien(p)>unt)printf("nTooLongnw);while(strien(p)>unt);pstr1en(p)-1=0;strcpy(s,p);void insert(数据插入函数*/structaddress*i,structaddress*start,structaddress*lastif(*last=NULL)如果尾结点为空,意味着当前链表为空*/(i->next=NULL;i->prior=NULL;*last=i;*start=i;return;)else(*last)->nxt=i;i->prior=*last;i->nxt=NULL;*last=(*last)->next;)voidddelete(structaddress*start,structaddress*last)*除函数*/(structaddress*info;chars80;inputs(”请输入姓名:,s,10);"输入欲删除结点的name域内容7info=find(s);"查找该内容7if(info)/*如果找到*/(printf("Deletingn");if(*start=info)/*如果该结点为首结点,把该结点的下驱作为新的首结点(入口)*/*start=info->next;if(*start)(*start)->prior=NULL;elsewIast=NULL;)else"如果欲删除的结点不是首结点7(info->prior->next=info->next;令该结点的前驱的next指针指向该结点的后驱,*又令该结点的后驱的Prior指点指向该结点的前驱*/if(info!=*last)/*如果该结点是尾结点,那么令该结点的前驱为尾结点/info->next->prior=info->prior;else*last=info->prior;freinfo);/*释放该结点所占用的内存7PrintfrQk,除成功NT);)structaddress*find(char*name)/*查找函数,形弁为欲查找结点的name域7(structaddress*info;info=start;while(info)if(!strcmp(name,info->name)retuminfo;info=info->next;)Printf("未找到相关信息r);returnNULL;)/*输出整个雒表7voidIist(Void)(structaddress*info;info=start;if(info=NULL)Printf("当前记录为空门;elsePrintf('姓名V街三W城前国家ttn");while(info)(display(info);if(info->next=NULL)break;info=info->next;);printf(,nn");voiddisplay(structaddress*info)厂输出传入结点函数*/printf(M%stM,info->name);printf(w%stw,info->stret);printf(',%stn,info->city);printf(M%stM,info->state);printf(M%stM,info->eip);PrintfCAn");void search(void)*查找函数*/charname40;structaddress*info;Printf("请输入要查找的姓名:");/*输入欲查找的姓名7gets(name);info=find(name);If(Hnfo)Printfc姓名不存在n");/*如果没找到,显示Notfound*/elsedisplay(info);/*如果找到,显示该结点资料*/)voidsave(void)/*保存函数*/(structaddress*info;FILE*fp;fp=fopen(HrTOord.txf,"wbM);生成文件7W(printf("Cannotopenfilenw);return;)PrintffAnSaveingn");info=start;while(info)把鞋表写入文件7(fwrite(info,sizeof(structaddress),1,fp);info=info->next;)printf("-ok!n");fdose(fp);/*健表全部写入文件后,关闭文件7)voidload()"调用预存文件函数*/registerinttlsize;structaddress*info,*temp=0;char*p;FILE*fp;/*«!开文件*/if(fp=fopenCrerd.txt","r")=NULL)(printf("Cannotopenfile!n");return;)printf(nnLoading.n");调用文件7size=sizeof(structaddress);*为结点分配内存*/start=(structaddress*)mall(size);if(!start)*如果读取失败,返回*/printf("Outofmemory!n");exit(0);)info=start;p=(char*)info;whil(*p+=getc(fp)!=EOF)(for(t=0;t<size-1;+t)*p+=getc(fp);info->next=(structaddress*)malloc(siz);if(!info->nxt)(printf(wOutofmmory!n");return;)info->prior=temp;temp=info;info=info->next;p=(char*)info;)temp->next=O;last=temp;start->prior=0;fdose(fp);

    注意事项

    本文(数据结构课程设计(通讯录制作).docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开