数据结构课程设计(通讯录制作).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的函数,找到该节点记录