《数据结构大作业(含源代码).pdf》由会员分享,可在线阅读,更多相关《数据结构大作业(含源代码).pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据结构大作业(含源代码)数据结构大作业(含源代码)1.输入:添加一个职工记录 2.输出:输出全部职工记录 3.按职工号排序:通过职工号指针将职工记录按职工号从小到大连接起来4.按职工号输出:沿职工号指针输出全部职工记录 5.按部门号排序:通过部门号指针将职工记录按部门号从小到大连接起来 6.按部门号输出:沿部门号指针输出全部职工记录 7.按职工工资排序:通过职工工资指针将职工记录按职工工资从小到大连接起来 8.按职工工资输出:沿职工号指针输出全部职工记录 9.全清:删除职工文件中有的全部记录 10.存储退出:将单链表中的全部结点存储到职工文件中,然后退出程序运行过程 3 实验仪器 每人 1
2、台安装有 Turbo C 的普通学生电脑。4 实验内容 利用静态链表来实现这一综合算法。5 实验重点 掌握链表的常用操作。6 程序功能及其实现详解 下面将详细介绍本程序的所有功能的实现方式即代码的含义,在设计本程序时,本人尽可能地用了质量好一点的算法,因为本程序有以上 10 个功能,显然应有实现相应功能的 10 个函数,不过在设计时本人将输出部分统一到一个函数中来实现.因为在面向过程的程序设计中包括面向对象的程序设计一般都没有一种职工类型的变量,因此在一开始得建立一个结构体变量即所谓的职工类型,此部分的代码如下:typedef struct node int no,depno,salary;/
3、*no为职工号,depno为部门号,salary 为工资数*/char namemaxsize;/*职工姓名*/structnode*pno,*pdepno,*psalary,*next;/*pno 为职工号指针,pdepno 为部门号指针,psalary 为工资数指针*/employee;显然,结构体中的成员包括职工姓名、职工号、部门号、职工工资、以及一些指向其它该类型结点的指针变量.下面介绍实现第一个功能的代码:employee*insert(employee*head)employee*h;if(head=NULL)employee*s,*h1;h1=malloc(sizeof(empl
4、oyee);s=malloc(sizeof(employee);clrscr();printf(“please input employeesname:“);scanf(“%s“,s-name);printf(“pleaseinputemployee snumber:“);scanf(“%d“,s-printf(“please input departments number:“);scanf(“%d“,s-depno);printf(“please input employee s wages:“);scanf(“%d“,s-salary);s-pno=NULL;s-pdepno=NULL;
5、s-psalary=NULL;s-next=NULL;h1-pno=NULL;h1-pdepno=NULL;h1-psalary=NULL;h1-next=s;h=h1;printf(“all done!n“);getch();if(head!=NULL)employee*s,*p,*h1;h1=head;p=h1-next;s=malloc(sizeof(employee);if(p-next!=NULL)while(p-next!=NULL)p=p-next;clrscr();printf(“pleaseinputemployee sname:“);scanf(“%s“,s-name);p
6、rintf(“please input employee s number:“);scanf(“%d“,s-printf(“pleaseinputdepartment snumber:“);scanf(“%d“,s-depno);printf(“please input employee s wages:“);scanf(“%d“,s-salary);s-pno=NULL;s-pdepno=NULL;s-psalary=NULL;s-next=NULL;p-next=s;h=h1;printf(“all done!n“);getch();if(p-next=NULL)clrscr();prin
7、tf(“please input employees name:“);scanf(“%s“,s-name);printf(“please input employee s number:“);scanf(“%d“,s-printf(“pleaseinputdepartment snumber:“);scanf(“%d“,s-depno);printf(“please input employee s wages:“);scanf(“%d“,s-salary);s-pno=NULL;s-pdepno=NULL;s-psalary=NULL;s-next=NULL;p-next=s;h=h1;pr
8、intf(“all done!n“);getch();return(h);本函数实现的功能是插入一个职工记录到职工表中,为此我们还得把这个函数的返回类型设计成之前建立的结构体类型的指针函数,而函数的参数是一个职工类型的头指针变量,在 main 函数中也同时建立一个头指针变量,且给它赋空值,在调用该函数时就把空指针传给插入函数,当职工表为空即第一次插入一个职工记录时,很自然传给插入函数的头指针的值为空有此来判断是新建立一个结点还是在已有的结点后插入一个(连接)结点,若头指针不为空,即已有一个或多个结点在职工记录表中,则只能插在最后一个节点之后.当职工表中只有一个职工记录时,(即 head-nex
9、t-next=NULL 时)插在第一个结点后面,当职工表中的结点多于两个时就插在最后一个结点后面.下面说明第二个功能的实现部分:void output(employee*head)employee*p;if(head=NULL)clrscr();printf(“The table is empty,please insert before!n“);else p=head-next;if(p!=NULL)clrscr();printf(“all information ofemployeenn“);printf(“employees name employees numberdepartment
10、s number employees wagesn“);while(p!=NULL)printf(“t%stt%dttt%dtt%dn“,p-name,p-no,p-depno,p-salary);p=p-next;getch();本函数的功能是实现职工记录表中的所有记录,若没有任何一个记录,则输出一个提示语句来提醒使用者职工表为空,若不为空则从第一号结点开始输出一直到最后一个结点(以表格形式输出).下面分别介绍根据职工号、部门号以及职工工资来排序的函数:employee*SortByEmployeeNumber(employee*head)employee*p,*q,*s,*h,*temp;
11、temp=malloc(sizeof(employee);h=head;for(s=head-next;s!=NULL;s=s-next)p=s;for(q=s-next;q!=NULL;q=q-next)if(p-no)(q-no)p=q;if(p!=s)temp-no=s-temp-depno=s-depno;temp-salary=s-salary;strcpy(temp-name,s-name);s-no=p-s-depno=p-depno;s-salary=p-salary;strcpy(s-name,p-name);done!p-no=temp-n“);getch();p-depn
12、o=temp-depno;return(h);*head)p-salary=temp-salary;strcpy(p-name,temp-name);clrscr();printf(“allemployeeemployeeh=head;*SortByDepartmentNumber(employee*p,*q,*s,*h,*temp;temp=malloc(sizeof(employee);for(s=head-next;s!=NULL;s=s-next)p=s;for(q=s-next;q!=NULL;q=q-next)if(p-depno)(q-depno)p=q;if(p!=s)temp
13、-no=s-temp-depno=s-depno;temp-salary=s-salary;strcpy(temp-name,s-name);s-no=p-s-depno=p-depno;s-salary=p-salary;strcpy(s-name,p-name);p-no=temp-p-depno=temp-depno;p-salary=temp-salary;strcpy(p-name,temp-name);clrscr();printf(“alldone!n“);getch();return(h);employee*SortByWages(employee*head)employee*
14、p,*q,*s,*h,*temp;temp=malloc(sizeof(employee);h=head;for(s=head-next;s!=NULL;s=s-next)p=s;for(q=s-next;q!=NULL;q=q-next)if(p-salary)(q-salary)p=q;if(p!=s)temp-no=s-temp-depno=s-depno;temp-salary=s-salary;strcpy(temp-name,s-name);s-no=p-s-depno=p-depno;s-salary=p-salary;strcpy(s-name,p-name);p-no=tem
15、p-p-depno=temp-depno;p-salary=temp-salary;strcpy(p-name,temp-name);clrscr();printf(“alldone!n“);getch();return(h);第一个就是根据职工号进行对职工表中的所有记录进行从小到大的排序,不过在这里说明一点,每一种排序都有相同的一点就是它们都是职工指针类型函数,且参数也是职工类型的头指针.在根据职工号来对职工记录表排序这个函数中采用的排序算法是直接选择排序法,即整体上有两层循环,第一层负责一个职工类型的指针变量从一号结点开始到最后一个结点之间的循环,其意义是把之前定义的职工类型的指针变量存放
16、一号结点的地址,而还有一个该类型的指针变量存放的是二号结点的地址,然后比较职工号的大小,然后把小的一个的地址存入第一个指针变量,在程序中是p指针,然后第二层循环起效一直到最后一个结点为止跟一号结点的职工号比较大小最终把最小的一个的结点的地址存入 p 指针,然后该p指针的一切信息跟一号位置的结点的一切信息进行交换,若p 指针最终存放的是一号结点的地址,则无需交换.接着外层循环起效,把二号结点的职工号跟三号结点开始(内外层循环的作用下两个指针往后移一步)比较,重复上述操作,一直到最后一个结点为止,最终实现把职工记录表的信息按职工号从小到大的排序.因为根据部门号排序和根据职工工资来进行排序是同样的结
17、构,所以在这里不进行详细说明,整个函数中只有一条语句不一样,那就是根据职工号、根据部门号以及根据职工工资来进行比较时 p 指针一直存放职工号最小的结点、部门号最小的结点或职工工资最小的结点地址.下面讲述删除功能的实现:employee*DeleteAllInformation()employee*h;h=NULL;clrscr();printf(“all done!n“);getch();return(h);该函数是利用职工类型的指针变量赋予空值,然后返回给头指针,从而让原来存有职工记录的表置空.本程序还有一个返回类型为空的函数,即程序一开始所呈现出的画面.voidshow()clrscr()
18、;printf(“*n“);printf(“n“);printf(“welcome to use manage employeesinformation micro system n“);printf(“n“);printf(“a.insert ainformation of employeen“);printf(“b.output.output all informationof employeen“);printf(“c.sort by employees numbern“);printf(“d.output all information by employee s number n“)
19、;printf(“e.sort by departments numbern“);printf(“f.output allinformation by department s number n“);printf(“g.sort byemployee s wagesn“);printf(“h.output all information by employee s wagesn“);printf(“i.delete all employees informationn“);printf(“j.saven“);printf(“0.exitn“);printf(“*n“);接着就是实现保存功能的函
20、数,其代码如下:void save(struct employee*head)FILE*file;employee*p;if(file=fopen(“d:职工记录表.txt“,“wb“)=NULL)printf(“can notopen filen“);fprintf(file,“rn“);/*将换行符号写入文件*/fprintf(file,“employees name employees number departmentsnumber employee s wagesrn“);for(p=head-next;p!=NULL;p=p-next)fprintf(file,“t%stt%dtt
21、t%dtt%drn“,p-name,p-no,p-depno,p-salary);/*写入记录*/fprintf(file,“rn“);/*将换行符号写入文件*/fclose(file);/*关闭文件*/clrscr();printf(“savedone!n“);getch();下面说明整个程序的核心 main 函数,因为任何一个程序都是从 main 函数开始进行的,之所以因为如此,所以必须说明 main 函数:main()charflag;employee*head;head=NULL;show();scanf(“%c“,flag);while(flag!=0)switch(flag)cas
22、e a:head=insert(head);show();break;case b:output(head);show();break;case c:head=SortByEmployeeNumber(head);show();break;case d :output(head);show();break;case e :head=SortByDepartmentNumber(head);show();break;case f:output(head);show();break;caseg:head=SortByWages(head);show();break;case h:output(he
23、ad);show();break;case i:head=DeleteAllInformation();show();break;case j:save(head);show();break;scanf(“%c“,flag);显而易见,在 main 函数中除了以上说过的职工类型的头指针变量外还有一些其他东西,那就是来提供选择功能的 switch case 语句,之所以本函数能进行不同的功能的选择就是因为 main 函数中的 while 循环中的 switch case 语句,利用它选择不同的函数来实现不同的功能,即本程序的十个功能.7 程序运行过程详解 本程序包括输入一个职工记录,输出全部职工
24、记录,根据职工号排序并输出,根据部门号排序并输出,根据职工工资排序并输出,清空职工记录表,保存职工记录表即生成 txt 文本文档和退出等功能,当我们运行程序是会出现如图 1 所示的窗口,其中可发现有以上说明的功能,根据旁边的小写英文字母来进行选择,方法是输入相应的小写英文字母并回车就会进入相应的功能界面.图 1 程序一开始运行时的界面、即主界面 1.输入一个职工记录到职工记录表中 当在如图 1 所示的界面中的时候,即我们一开始运行程序的时候,要是想输入一个职工记录到职工记录表中去,则可以选择主界面中的第一个选项(输入 a 并回车),则会出现如图 2 所示的要求输入职工基本信息的窗口,上面的内容
25、包括职工的姓名、职工的号码、部门的号码及职工工资的参数.图 2 输入一个职工的相关参数 可发现当我们输入完最后一个参数后按回车键则会出现全部参数输入完毕的提示信息以提示用户本次输入结束,在此界面中可再次敲一下回车键来返回到如图 1 所示的主界面中,当我们返回到主界面以后若还想继续输入职工记录,可重复上述操作来进行职工记录的输入,不过这个时候这种操作应称作插入记录,显而易见选项 1 不仅可以输入职工记录且还可以插入职工记录到职工记录表中.我们假定已经有三个职工记录被输入进去,以便解释后部分排序的功能.2.输出全部职工记录当我们已经输入完毕一个或多个职工记录以后就可以进行输入操作了,方法是在如图
26、1 所示的主界面中选择选项二(输入 b 并回车),则可以看到之前输入的全部职工记录了,如图 3 所示.图 3 输出全部职工记录 可发现我们输入记录以表格形式输入到了窗口中,以便我们查阅.值得一提的是如果职工记录表中什么记录都没有的前提下进行输出功能,因为记录表为空,自然不能输入任何记录给我们,这时会出现如图 4 所示的窗口,以提示用户现在职工记录表为空,为此必须先进性输入操作.图 4 当职工记录表为空的前提下进行输入功能 3.根据职工号对整个职工记录表进行排序并输出 当职工记录表中有两个或以上个记录时,我们可以根据职工号进行对整个职工记录表排序,方法是在如图 1 所示的主界面中选择选项三(输入
27、 c 并回车),则会出现如图 5 所示的窗口以表示职工记录表以排序完毕.图 5当我们对职工记录表进行排序完毕的时候出现的窗口 要是想查看刚刚被排过序的职工记录表,则可以在此窗口中敲一下回车键以返回到主界面后,在主界面中选择第四选项(输入 d 并回车),则会出现如图 6 所示的窗口.图 6 根据职工号排序后所输出的窗口 跟之前输出的记录表相比较(图 3 和图 6 进行比较)发现职工记录表以职工的号码排序过了(升序).4.根据部门号对整个职工记录表进行排序并输出 当在职工记录表中有两个或以上个记录时,我们还可以根据职工记录表中的职工参数的一项即部门号对整个职工记录表进行排序.方法是在如图 1 所示
28、的主界面中选择选项五(输入 e 并回车),则会出现如图 5 所示的窗口,以表示根据部门号的排序已经完毕.要是想查看刚刚排序过的记录表,则在主界面中选择选项六(输入 f 并回车),这时会出现如图 7 所示的窗口.图 7 根据部门号排序后所输出的窗口 跟之前的记录表进行比较(图 6 和图 7 进行比较)可发现职工记录表已经根据部门号排序过了.5.根据职工工资对整个职工记录表进行排序并输出 当职工记录表中有两个或以上个记录时,我们还可以根据职工参数的一项,即职工工资对整个职工记录表排序,方法是在如图 1 所示的主界面中选择选项六(输入 g 并回车),会出现如图5 所示的界面.若想查看已排序过的职工记
29、录表,则在如图 1 所示的职工记录表中选择选项八(输入 h 并回车),会出现如图 8 所示的窗口.图 8 根据部门号排序后所输出的窗口 跟前一次的记录比较发现(图 7 跟图 8 进行比较),职工记录表中的记录已经根据职工的工资排序过了.6.清空职工记录表 当我们想重新开始输入职工记录或者当前的记录无需而想重新开始输入记录的时候,就可以使用清空职工记录表这一功能.方法是程序主界面中选择选项九(输入 i 并回车),则会出现如图 5 所示的窗口,以表示职工记录表已经清空,在此界面中想返回到主界面则敲一次回车键即可,若这个时候(即职工记录表已为清空)选择选项二,输入全部职工记录,则会出现如图 4 所示
30、的窗口,以提示我们职工记录表为空,为此我们必须先输入记录进去才行.7.保存已有的记录即生成txt 文本文档文件 本程序不仅可以实现输入、输出、排序(根据不同的项目)、删除等功能且还可以把已有的记录保存起来,以便使用.实现保存功能的方法是,在如图1 所示的主界面中我们选择选项十(输入 j 并回车),则会出现如图 9 所示的窗口,以提示我们保存成功.图 9 保存职工记录表成功(即已经生成了职工记录表)保存成 txt 文本文档的文件的位置在运行该程序的微机中 D 驱动器根目录中,这一功能是在编写程序时已经规定好了,有关保存位置的代码如下:if(file=fopen(“d:职工记录表.txt“,“wb
31、“)=NULL)printf(“cannot open filen“);可发现保存成 txt 文本文档的文件名也是在编写程序时定下来的.我们可以到 D 盘的根目录中去找一找“职工记录表.txt”的文件打开看,则会出现如图 10 所示的窗口.图 10 生成的 txt文本文档 8.退出程序.在如图 1 所示主界面中选择选项十一(输入0 并回车),则会退出程序.8 程序源代码(C 语言编写)#includestdio.h#define maxsize 20 typedef struct node intno,depno,salary;/*no 为职工号,depno 为部门号,salary 为工资数*
32、/charnamemaxsize;/*职工姓名*/structnode*pno,*pdepno,*psalary,*next;/*pno为职工号指针,pdepno 为部门号指针,psalary 为工资数指针*/employee;employee*insert(employee*head)employee*h;if(head=NULL)employee*s,*h1;h1=malloc(sizeof(employee);s=malloc(sizeof(employee);clrscr();printf(“pleaseinputemployee sname:“);scanf(“%s“,s-name)
33、;printf(“please input employee s number:“);scanf(“%d“,s-printf(“pleaseinput departments number:“);scanf(“%d“,s-depno);printf(“pleaseinput employees wages:“);scanf(“%d“,s-salary);s-pno=NULL;s-pdepno=NULL;s-psalary=NULL;s-next=NULL;h1-pno=NULL;h1-pdepno=NULL;h1-psalary=NULL;h1-next=s;h=h1;printf(“all
34、done!n“);getch();if(head!=NULL)employee*s,*p,*h1;h1=head;p=h1-next;s=malloc(sizeof(employee);if(p-next!=NULL)while(p-next!=NULL)p=p-next;clrscr();printf(“please input employeesname:“);scanf(“%s“,s-name);printf(“pleaseinputemployee snumber:“);scanf(“%d“,s-printf(“please input departments number:“);sc
35、anf(“%d“,s-depno);printf(“please input employee s wages:“);scanf(“%d“,s-salary);s-pno=NULL;s-pdepno=NULL;s-psalary=NULL;s-next=NULL;p-next=s;h=h1;printf(“all done!n“);getch();if(p-next=NULL)clrscr();printf(“please input employees name:“);scanf(“%s“,s-name);printf(“please input employee s number:“);s
36、canf(“%d“,s-printf(“pleaseinputdepartment snumber:“);scanf(“%d“,s-depno);printf(“please input employee s wages:“);scanf(“%d“,s-salary);s-pno=NULL;s-pdepno=NULL;s-psalary=NULL;s-next=NULL;p-next=s;h=h1;printf(“all done!n“);getch();return(h);voidoutput(employee*head)employee*p;if(head=NULL)clrscr();pr
37、intf(“The table is empty,please insertbefore!n“);else p=head-next;if(p!=NULL)clrscr();printf(“allinformation of employee n n“);printf(“employee s nameemployees number departments number employees wagesn“);while(p!=NULL)printf(“t%stt%dttt%dtt%dn“,p-name,p-no,p-depno,p-salary);p=p-next;getch();employe
38、e*SortByEmployeeNumber(employee*head)employee*p,*q,*s,*h,*temp;temp=malloc(sizeof(employee);h=head;for(s=head-next;s!=NULL;s=s-next)p=s;for(q=s-next;q!=NULL;q=q-next)if(p-no)(q-no)p=q;if(p!=s)temp-no=s-temp-depno=s-depno;temp-salary=s-salary;strcpy(temp-name,s-name);s-no=p-s-depno=p-depno;s-salary=p
39、-salary;strcpy(s-name,p-name);p-no=temp-p-depno=temp-depno;p-salary=temp-salary;strcpy(p-name,temp-name);clrscr();printf(“all done!n“);getch();return(h);employee*SortByDepartmentNumber(employee*head)employee*p,*q,*s,*h,*temp;temp=malloc(sizeof(employee);h=head;for(s=head-next;s!=NULL;s=s-next)p=s;fo
40、r(q=s-next;q!=NULL;q=q-next)if(p-depno)(q-depno)p=q;if(p!=s)temp-no=s-temp-depno=s-depno;temp-salary=s-salary;strcpy(temp-name,s-name);s-no=p-s-depno=p-depno;s-salary=p-salary;strcpy(s-name,p-name);p-no=temp-p-depno=temp-depno;p-salary=temp-salary;strcpy(p-name,temp-name);clrscr();printf(“alldone!n“
41、);getch();return(h);employee*SortByWages(employee*head)employee*p,*q,*s,*h,*temp;temp=malloc(sizeof(employee);h=head;for(s=head-next;s!=NULL;s=s-next)p=s;for(q=s-next;q!=NULL;q=q-next)if(p-salary)(q-salary)p=q;if(p!=s)temp-no=s-temp-depno=s-depno;temp-salary=s-salary;strcpy(temp-name,s-name);s-no=p-
42、s-depno=p-depno;s-salary=p-salary;strcpy(s-name,p-name);p-no=temp-p-depno=temp-depno;p-salary=temp-salary;strcpy(p-name,temp-name);clrscr();printf(“alldone!n“);getch();return(h);employee*DeleteAllInformation()employee*h;h=NULL;clrscr();printf(“all done!n“);getch();return(h);voidshow()clrscr();printf
43、(“*n“);printf(“n“);printf(“welcome to use manageemployee sinformationmicrosystem n“);printf(“n“);printf(“a.insertainformationofemployeen“);printf(“b.output.outputallinformationofemployee n“);printf(“c.sort by employees numbern“);printf(“d.output allinformation by employee s number n“);printf(“e.sort
44、 bydepartments numbern“);printf(“f.output all information bydepartments numbern“);printf(“g.sort by employees wagesn“);printf(“h.output all information by employees wagesn“);printf(“i.delete all employees informationn“);printf(“j.saven“);printf(“0.exitn“);printf(“*n“);void save(struct employee*head)
45、FILE*file;employee*p;if(file=fopen(“d:职工记录表.txt“,“wb“)=NULL)/*打开文件,并判断打开是否正常*/printf(“can not open filen“);fprintf(file,“rn“);/*将换行符号写入文件*/fprintf(file,“employees name employees number departments number employeeswagesrn“);for(p=head-next;p!=NULL;p=p-next)fprintf(file,“t%stt%dttt%dtt%drn“,p-name,p-n
46、o,p-depno,p-salary);/*写入记录*/fprintf(file,“rn“);/*将换行符号写入文件*/fclose(file);/*关闭文件*/clrscr();printf(“save done!n“);getch();main()charflag;employee*head;head=NULL;show();scanf(“%c“,flag);while(flag!=0)switch(flag)case a:head=insert(head);show();break;case b:output(head);show();break;case c:head=SortByEm
47、ployeeNumber(head);show();break;case d :output(head);show();break;case e :head=SortByDepartmentNumber(head);show();break;case f:output(head);show();break;caseg:head=SortByWages(head);show();break;case h:output(head);show();break;case i:head=DeleteAllInformation();show();break;case j:save(head);show();break;scanf(“%c“,flag);