1、 long telephone;/电话号码 char adress40;/地址 char E_mail30;/邮箱 int QQ12;/增设的QQ一栏 struct student *next;/用于存放下一级指针first;first为第一个节点,继而在其后动态的开创若干节点。以下是用于链表处理的各个函数:struct student * creat(struct student *p) /输入函数void printall(struct student * head) /显示所有记录struct student * delet(struct student *head) /删除函数stru
2、ct student * insert(struct student *head) /插入函数struct student *searchbynum(struct student *head) /按学号查找struct student *searchbyname(struct student *head) /按姓名查找struct student *search(struct student *head) /查找函数menu_select() /选择函数以下是各个函数的详细说明:Creat()函数用于创建链表,其中以n记录节点的个数,并在创建时实现自加,以便于后面函数的处理,其循环输入的实现,
3、依靠库函数malloc()和后面的while循环。Printall函数用于显示当前的的所有记录,依靠头指针找到链表首地址,有while循环实现所有记录的输出。Delet()函数用于删除某个记录,删除可以按姓名或学号这两种方式进行的,但本程序中没有这个功能即只可以按学号进行删除(因为学号唯一)。Insert()函数用于插入,同样以头指针找到链表的首地址,并将要插入的学号依次与各个节点中得num比较,然后按顺序将一个节点插入。Search()函数用于查找,查找函数提供了两种方式,即按姓名查找和按学号查找。在search()函数中可以按提示调用searchbyname()和searchbynum()
4、。Menu_select() 函数用于提供函数选项,旨在简化主函数。流程图此即为该程序的主流程图。源程序以下是详细的源程序及部分注释:#includestring.hmalloc.hconio.hstdlib.h#define NULL 0#define LEN sizeof(struct student)#define SHU %dn%sn%5dn%ldn%sn%sn%sint n;struct student * creat(struct student *p) /创建链表的函数,即输入函数 struct student *head; struct student *p1,*p2; n=0
5、; /先给n赋值0 p1=p2=(struct student*) malloc(LEN);/强制类型转换 printf(ttt* 请输入用户信息 *n);ttt输入学号:n scanf(%ld,&p1-num);ttt输入姓名:%sname);ttt输入年龄:%dage);ttt输入电话:telephone);ttt输入地址nadress);ttt输入E-mail:E_mail);ttt输入QQnQQ);/40 head=NULL; while(p1-num!=0) n=n+1; /实现n的自加,记录节点的个数 if(n=1) head=p1; else p2-next=p1; p2=p1;
6、 p1=(struct student *) malloc(LEN); printf( scanf(,p1- p2-next=NULL; return 0; struct student *p;n全部的记录如下n: p=head; do printf(SHU,p-num,p-name,p-age,p-telephone,p-adress,p-E_mail,p- p=p-next; while(p!=NULL);/80struct student * delet(struct student *head)/删除函数请输入要删除的号码: if(head=NULL) 列表为空!n return he
7、ad; p1=head; while(num!=p1-num&next!=NULL) p1- if(num=p1-num) if(p1=head)/要删除的节点为首节点 head=p1-next=p1-delet:%dn,num); n=n-1;/节点减一 else%d 未找到该节点!struct student * insert(struct student *head)/插入函数 struct student *stud; struct student *p0,*p1,*p2; p0=stud;/p0指向的是要插入的节点 if(head=0) head=p0; p0-/120 while(
8、p0-numnum)&(p1-=NULL) p2=p1; p1=p1- if(p0-numnext=p0; p0-/插入到p2所指的节点之后 n=n+1; return head;struct student *searchbynum(struct student *head)/按学号查找 long numb;numb);/147 if(numb!=p-struct student *searchbyname(struct student *head)/按姓名查找 char a100;请输入要查找的姓名:,a); if(strcmp(a,p-name)!struct student *sear
9、ch(struct student *head) char choic;ttt1-按电话号码查找 2-按姓名查找ttt请选择: choic=getch(); switch (choic) case 1:searchbynum(&first);break;2searchbyname(&int menu_select() char s80; int a;/定义整形变量 system(clstt*欢迎进入通讯管理界面*nnttt0. 输入记录nttt1. 显示记录nttt2. 查找nttt3. 插入记录 nttt4. 删除记录nttt5. Quitntt*nn do printf(Enter you
10、 choice(05):,s); a=atoi(s); while (a5); return a; main()tt*ntt*welcome to TONGXUNLU *ntt#code by 陈国警 #ntt*n按任意键进入主菜单n getch(); int selectnum; /选择函数,提示选择各种链表处理函数。 while(1) selectnum = menu_select(); switch(selectnum) case 0: creat(& break; case 1: printall(& break; case 2: search(& case 3: insert(& c
11、ase 4: delet(& case 5: printf(BYE BYE! system(pause /系统暂停 getchar(); exit(0); getchar();以下是部分运行结果:初始化的界面选择界面:创建链表中的输入界面:查找中的提示界面:限于篇幅,运行结果就只列举这么多。上机总结这是自从学习C语言以来我编写过的最大的一个程序,编写的时候遇到了前所未有的困难。因为这个程序所涉及到的知识,全部是要靠自学掌握的。期间我问过很多人,都说这个没有可能做出来,我也一度想放弃,而且在假期也没有时间没有条件来编写这个程序。后来还是勉强做了,这也是这个程序中有很多不足之处的原因。比如这个程序未能做到将文件保存到磁盘中,这是最明显的一个缺点。然后其中还有一些可以简化的地方,也有一些可以让界面更加友好的地方(如上面提到的删除可以按姓名和学号两种不同的方式)。总之可以改进的地方很多。但这个程序可以说是自己一点一点设计而来,还是能让人感到一点成就感的。另外一点就是以后虽然不再学习C语言,但自己在下面也应该勤于练习,不能把这门技能给丢了,我们应该为我们的以后着想。【本文档内容可以自由复制内容或自由编辑修改内容期待你的好评和关注,我们将会做得更好】
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1