数据结构课程设计源程序

合集下载

表达式求值源代码(数据结构课程设计)

表达式求值源代码(数据结构课程设计)

表达式求值源代码(数据结构课程设计)表达式求值源代码(数据结构课程设计) 数据结构课程设计源代码:表达式求值0900340131 张宁2011.6.26 #include #include /*函数功能:将数字字符串转变成相应的数*/ /*函数参数:char类型数组f,指向int类型变量的指针i*/ /*函数返回值:int类型。

返回数字字符串对应的数*/ int readnumber(char f[],int *i) { int x=0; while(f[*i]>= 0 } opst[top]=e[i]; top++; /*当前元素进栈*/ } i++; /*处理下一个元素*/ } while(top) /*栈中还有的全部运算符赋值到数组f中,包括# */ { f[j++]=opst[--top]; } } main() { int i=0,result,flog=0,flog2=0; char a[100],b[100],x,w; /*数组a用来保存中缀表达式,数组b用来表达后缀表达式,*/printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~\n“); printf(“ 0代表退出系统\n“); printf(“ 1代表输入算术表达式\n“); printf(“ 2代表判断输入的算术表达式的正确性\n“); printf(“ 3代表查看算术表达式的中缀表达式\n“); printf(“ 4代表查看算术表达式的后缀表达式\n“); printf(“ 5代表给出输入的算术表达式的最终结果\n“); printf(“ 规定:第一步必须先输入算术表达式,然后才能进行其他的操作\n“);printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~\n“); printf(“版权所有,盗版必究张宁2010/6/24 \n\n\n“); do { printf(“请输入您要操作所对应的数字:“); fflush(stdin); scanf(“%c“, if(48(以#号结尾!) “); i=0; do { scanf(“%c“, }while(a[i++]!= # ); flog=1;printf(“\n\n\n“); break; } else { printf(“请输入正确的选项!\n“); } }while(w!= n } else { printf(“请输入算术表达式:(以#号结尾!) “); do { scanf(“%c“, }while(a[i++]!= # ); flog=1; printf(“\n\n\n“); } break; case 2 : if(flog==0) { printf(“您还没有输入过表达式!\n请您按照规定先输入后判断!\n\n\n“); } else { flog2=1; if(judge(a)) { printf(“表达式符合要求!\n您可以继续下面的操作!\n“); } else { printf(“表达式不符合要求!\n请重新输入!\n“); break; } } break; case 3 : if(flog==0) { printf(“您还没有输入过表达式!\n请您按照规定先输入后算术表达式的中缀表达式\n\n\n“); break; } else if(flog2==0) { printf(“您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n“); break; } else { printf(“中缀表达式为:“); i=0; do { printf(“%c“,a[i]); }while(a[i++]!= # ); /*i++;*/printf(“\n\n\n“); } break; case 4 : if(flog==0) { printf(“您还没有输入过表达式!\n请您按照规定先输入后算术表达式的中缀表达式\n\n\n“); break; } else if(flog2==0) { printf(“您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n“); break; } else { postfix(a,b); printf(“后缀表达式为:\n“); i=0; do { printf(“%c“,b[i]); }while(b[i++]!= # ); /*i++;*/ printf(“\n\n\n“); } break; case 5 : fflush(stdin); if(f log==0) { printf(“您还没有输入过表达式!\n请您按照规定先输入表达式\n\n\n“); break; } else if(flog2==0) { printf(“您还没有判断表达式的正确性!\n请您按照规定先判断表达式的正确性后查看算术表达式的中缀表达式\n\n\n“); break; } else { /*postfix(a,b);*/ result=evalpost(b); printf(“运算结果为:“); for(i=0;a[i]!= # ;i++) { printf(“%c“,a[i]); } printf(“=%d\n\n\n“,result); } break; } } else { printf(“没有此项操作,请重新输入!\n\n\n“); } }while(x!= 0 ); printf(“\n您已退出系统!\n欢迎下次使用\n“); }。

数据结构课程设计(C++)_八皇后动态演示原代码

数据结构课程设计(C++)_八皇后动态演示原代码

//运行环境TC3.0#include<math.h> //调用数学函数库#include<stdio.h> //调用标准输入输出函数库#include<conio.h>#include<graphics.h> //调用图形函数库#include<stdlib.h>#define MAX 8 //定义棋盘格数(特别是横轴方向上)int board[MAX]; //纵轴方向格数void Drow() //画棋盘{int i;int Driver=VGA,Mode=VGAHI; //初始化显示器initgraph(&Driver,&Mode,"d:\\tc\\bgi");setfillstyle(SOLID_FILL,BLUE); //棋盘底色模式bar(5,15,600,500); //棋盘外框(二维)setcolor(YELLOW); //棋盘边框颜色for(i=0;i<=9;i++){line(10,20+50*i,460,20+50*i); //画行}for(i=0;i<=9;i++){line(10+50*i,20,10+50*i,470); //画列}line(460,20,560,20);line(10,470,560,470);line(560,470,560,20);setcolor(RED);outtextxy(465,30,"WuShangjie"); //版权注释outtextxy(465,45,"Eight Queue");outtextxy(465,60,"CopyRight2.0");outtextxy(415,440,"Start"); //屏幕输出文本坐标标记outtextxy(385,440,"0");outtextxy(335,440,"1");outtextxy(285,440,"2");outtextxy(235,440,"3");outtextxy(185,440,"4");outtextxy(135,440,"5");outtextxy(85,440,"6");outtextxy(35,440,"7");outtextxy(415,455,"Point");outtextxy(435,390,"0");outtextxy(435,340,"1");outtextxy(435,290,"2");outtextxy(435,240,"3");outtextxy(435,190,"4");outtextxy(435,140,"5");outtextxy(435,90,"6");outtextxy(435,40,"7");}void DrowCircle(int i,int j) //话棋子{char text[80];setfillstyle(SOLID_FILL,YELLOW);setcolor(YELLOW);circle(385-50*i,395-50*j,15);floodfill(385-50*i,395-50*j,YELLOW); //圆内颜色填充setcolor(RED);sprintf(text,"%d,%d",i,j); //棋子上坐标标记outtextxy(385-50*i-14,395-50*j,text);}void GiveDrowIn(int i,int j) //过去显示棋子清除{setfillstyle(SOLID_FILL,BLUE); //将填充颜色设置与底色相同setcolor(BLUE); //将画笔颜色设置与底色相同circle(385-50*i,395-50*j,15);floodfill(385-50*i,395-50*j,BLUE); //一定区域内填充outtextxy(385-50*i-14,395-50*j," ");}void show_result() //调度相关算法求出所有结果{int j=0;while(j<MAX){DrowCircle(j,board[j]);getch();j++;}getch();for(j=0;j<MAX;j++){GiveDrowIn(j,board[j]); //释放上回显示棋子区域}getch();}int check_cross(int n) //判断棋子是否冲突函数{int k;for(k=0;k<n;k++){if(board[k]==board[n]||(n-k)==abs(board[k]-board[n])) //是否同行,是否同对角线return 1;}return 0;}void put_chess(int n) //八皇后摆列方式逐个显示函数{for(int l=0;l<MAX;l++){board[n]=l;if(!check_cross(n)){if(n==MAX-1) {getch();show_result();}else put_chess(n+1);}}}void main() //主函数{Drow();put_chess(0);//to the end of the programgetch();exit(1);}免责声明:文档在线网(文档中国)中所有的文档资料均由文档在线网会员提供。

数据结构与算法实验源代码

数据结构与算法实验源代码

数据结构与算法实验源代码数据结构与算法实验源代码1.实验目的本实验旨在通过实践,加深对数据结构与算法的理解与应用能力,掌握数据结构和算法的基本概念与原理,并能够运用所学知识解决实际问题。

2.实验材料●一台已安装好编译器的计算机●数据结构与算法实验源代码文件3.实验环境配置在实验开始之前,必须确保计算机上已安装好以下环境:●编译器(可以是C++、Java等)●数据结构与算法实验源代码文件4.实验内容及步骤4.1 实验一:线性表4.1.1 实验目的通过实现线性表的相关操作,加深对线性表及其操作的理解,并能够灵活应用。

4.1.2 实验步骤1.实现线性表的初始化函数2.实现线性表的插入操作3.实现线性表的删除操作4.实现线性表的查找操作5.实现线性表的排序操作6.实现线性表的输出操作7.编写测试代码,对线性表进行测试4.1.3 实验结果与分析进行若干测试用例,验证线性表的正确性,并分析算法的时间复杂度与空间复杂度。

4.2 实验二:栈与队列4.2.1 实验目的通过实现栈与队列的相关操作,加深对栈与队列的理解,并掌握栈与队列的应用场景。

4.2.2 实验步骤1.实现栈的初始化函数2.实现栈的入栈操作3.实现栈的出栈操作4.实现栈的查看栈顶元素操作5.实现队列的初始化函数6.实现队列的入队操作7.实现队列的出队操作8.实现队列的查看队首元素操作4.2.3 实验结果与分析进行若干测试用例,验证栈与队列的正确性,并分析算法的时间复杂度与空间复杂度。

(继续添加实验内容及步骤,具体根据实验项目和教学要求进行详细分析)5.实验附件本文档所涉及的实验源代码文件作为附件随文档提供。

6.法律名词及注释6.1 版权:著作权法所规定的权利,保护作品的完整性和原创性。

6.2 开源:指软件可以被任何人免费使用、分发和修改的一种软件授权模式。

(继续添加法律名词及注释)。

数据结构与算法课程设计源程序

数据结构与算法课程设计源程序

程序:#include"stdio.h"#include"stdlib.h"#include "string.h"int saveflag=0;typedef struct LNode{ char id[20];//编号char name[10];//姓名char sex[10];//性别char age[10];//年龄char degree[10];//学位char position[10];//职位char phone[20];//电话char address[30];//住址struct LNode *next;}LNode,*Linklist;//定义节点类型int Initlist(Linklist &L){L=(Linklist)malloc(sizeof(LNode));if(!L)return (0);L->next=NULL;return 1;}//初始化单链表void Save(Linklist L){FILE* fp;LNode *p;int flag=1,count=0;fp=fopen("employee.txt","wb");if(fp==NULL){printf("\n=====>提示:重新打开文件时发生错误!\n");return;}p=L->next;while(p){if(fwrite(p,sizeof(LNode),1,fp)==1) //将第一个记录结点值写入文件{p=p->next; //依次写入第二个结点的值,count++; //文件的记录数+1}else{flag=0;break;}}printf("%d",count);if(count>0){printf("\n=====>提示:文件保存成功.(有%d条记录已经保存.)\n",count); saveflag=0;}else{system("cls");printf("保存文件失败,'0'条记录被保存!\n");}fclose(fp);}int CreatList(Linklist &L){Linklist p;p=(Linklist)malloc(sizeof(LNode));if(!p){return (0);}else{printf("请输入员工编号:");scanf(" %s",p->id);printf("请输入员工姓名:");scanf(" %s",p->name);printf("请输入员工性别:");scanf(" %s",p->sex);printf("请输入员工年龄:");scanf(" %s",p->age);printf("请输入员工学历:");scanf(" %s",p->degree);printf("请输入员工职务:");scanf(" %s",p->position);printf("请输入员工电话:");scanf(" %s",p->phone);printf("请输入员工地址:");scanf(" %s",p->address);}p->next=L->next;L->next=p;saveflag=1;return 1;}void Display(Linklist &L)//显示所有员工信息{Linklist p;printf("\n编号\t姓名\t性别\t年龄\t学历\t职位\t电话\t地址\n"); for(p=L->next;p!=NULL;p=p->next){printf("%s\t",p->id);printf("%s\t",p->name);printf("%s\t",p->sex);printf("%s\t",p->age);printf("%s\t",p->degree);printf("%s\t",p->position);printf("%s\t",p->phone);printf("%s\t",p->address);printf("\n");}}int SearchID(Linklist &L,char id[20])//ID查询{LNode *p;int flat=0;p=L;while(p){if(strcmp(p->id,id)==0){printf("查询结果如下:\n");printf("编号\t姓名\t性别\t年龄\t学历\t职位\t电话\t地址\n"); printf("%s\t",p->id);printf("%s\t",p->name);printf("%s\t",p->sex);printf("%s\t",p->age);printf("%s\t",p->degree);printf("%s\t",p->position);printf("%s\t",p->phone);printf("%s\t",p->address);flat=1;}p=p->next;}if(flat==0)printf("不存在此员工!\n");return 1;}int SearchName(Linklist &L,char name[10])//姓名查询{LNode *p;int flat=0;p=L;while(p){if(strcmp(p->name,name)==0){printf("查询结果如下:\n");printf("编号\t姓名\t性别\t年龄\t学历\t职位\t电话\t地址\n"); printf("%s\t",p->id);printf("%s\t",p->name);printf("%s\t",p->sex);printf("%s\t",p->age);printf("%s\t",p->degree);printf("%s\t",p->position);printf("%s\t",p->phone);printf("%s\t",p->address);flat=1;}p=p->next;}if(flat==0)printf("不存在此员工!\n");return 1;}void SortID(Linklist &L ,char id[20])//编号排序{Linklist La;Linklist p,q,m;La=(Linklist)malloc(sizeof(LNode));La->next =NULL;while(L->next){for(q=L->next,p=L->next;p->next;p=p->next ){if((strcmp( p->next->id,q->id ))>0 ){m=p;q=p->next ;}}if(q==L->next){L->next =L->next->next ;}else{m->next =q->next ;}q->next =La->next ;La->next =q ;}L=La;Display(L);}void SortName(Linklist &L ,char name[10])//姓名排序{Linklist La;Linklist p,q,m;La=(Linklist)malloc(sizeof(LNode));La->next=NULL;while(L->next){for(q=L->next ,p=L->next;p->next;p=p->next ){if((strcmp( p->next->name,q->name ))>0 ){m=p;q=p->next ;}}if(q==L->next){L->next=L->next->next ;}else{m->next=q->next ;}q->next=La->next ;La->next=q ;}L=La;Display(L);}void SortAge(Linklist &L ,char age[10])//年龄排序{Linklist La;Linklist p,q,m;La=(Linklist)malloc(sizeof(LNode));La->next =NULL;while(L->next){for(q=L->next ,p=L->next ;p->next;p=p->next ){if((strcmp( p->next->age,q->age))>0 ){m=p;q=p->next ;}}if(q==L->next){L->next=L->next->next ;}else{m->next=q->next ;}q->next=La->next ;La->next=q ;}L=La;Display(L);}void SortPhone(Linklist &L ,char phone[20])//电话排序{Linklist La;Linklist p,q,m;La=(Linklist)malloc(sizeof(LNode));La->next=NULL;while(L->next){for(q=L->next,p=L->next;p->next;p=p->next ){if((strcmp( p->next->phone,q->phone ))>0 ){m=p;q=p->next ;}}if(q==L->next){L->next=L->next->next ;}else{m->next=q->next ;}q->next=La->next ;La->next=q ;}L=La;Display(L);}int Updata(Linklist &L,char id[20])//更改{LNode *p;p=L;while(p){if(strcmp(p->id,id)==0){printf("请输入员工新编号(原来的编号:%s):\n",p->id);scanf("%s",p->id);printf("\n请输入员工新姓名(原来的姓名:%s):\n",p->name); scanf("%s",p->name);printf("\n请输入员工性别(原来的性别:%s):\n",p->sex); scanf("%s",p->sex);printf("\n请输入员工年龄(原来的年龄:%s):\n",p->age); scanf("%s",p->age);printf("\n请输入员工学历(原来的学历:%s):\n",p->degree); scanf("%s",p->degree);printf("\n请输入员工职务(原来的职务:%s):\n",p->position); scanf("%s",p->position);printf("\n请输入员工电话(原来的电话:%s):\n",p->phone); scanf("%s",p->phone);printf("\n请输入员工地址(原来的地址:%s):\n",p->address);scanf("%s",p->address);}p=p->next;}saveflag=1;return 1;}int Delete(Linklist &L,char id[20])//按ID删除{LNode *p;LNode *r;p=L->next;r=L;while(!(strcmp(p->id,id)==0)&&p){r=p;p=p->next;}if(!p)printf("\n删除位置不合理\n");else{r->next=p->next;free(p);printf("删除成功\n");}saveflag=1;return 1;}void menu(){printf(" **********************************************\n"); printf(" 欢迎进入员工管理系统!\n");printf(" **********************************************\n"); printf(" 1-添加员工信息\n");printf(" 2-查询员工信息\n");printf(" 3-排序员工信息\n");printf(" 4-显示所有员工信息\n");printf(" 5-更改员工信息\n");printf(" 6-删除员工信息\n");printf(" 7-退出\n");printf(" **********************************************\n"); }//主函数void main(){FILE *fp;Linklist L;LNode *p,*r;int a,count=0;char m,ch;char name[10];char id[20];char age[10];char phone[20];Initlist(L);int y;int x=1;L=(struct LNode*)malloc(sizeof(struct LNode)); if(!L){printf("\n 如没有申请到空间! ");return ;}L->next=NULL;r=L;fp=fopen("employee.txt","rb");while(!feof(fp)){p=(struct LNode*)malloc(sizeof(struct LNode)); if(!p){printf(" 如没有申请到空间!\n");exit(0);}if(fread(p,sizeof(struct LNode),1,fp)){p->next=NULL;r->next=p;r=p;count++;}}fclose(fp);//printf("\n=====>提示:导入%d条记录.\n",count); while(1){menu();printf("====>请选择:");scanf("%d",&y);if(y==7){if(saveflag==1){getchar();printf("\n=====>提示:资料已经改动,是否将改动保存到文件中(y/n)?\n");scanf("%c",&ch);if(ch=='y'||ch=='Y')Save(L);}printf("\n=====>提示:你已经退出系统,再见!\n");break;}switch(y){case 1:CreatList(L);do{printf("是否继续输入?(y/n)");getchar();scanf("%c",&m);if(m=='y'){CreatList(L);}}while(m!='n');break;case 2: printf("请输入查询方式(1按编号查询,2按姓名查找)");scanf("%d",&a);if(a==1){printf("请输入查询员工编号\n");scanf("%s",&id);SearchID(L,id);}if(a==2){printf("请输入查询员工姓名\n");scanf("%s",&name);SearchName(L,name);}break;case 3: printf("请选择排序条件:1.编号2.姓名3.年龄4.电话0.退出\n");scanf("%d",&a);if(a==1){printf("编号排序\n");SortID(L,id);}if(a==2){printf("姓名排序\n");SortName(L,name);}if(a==3){printf("年龄排序\n");SortAge(L,age); }if(a==4){printf("电话排序\n");SortPhone(L,phone);}break;case 4: printf("所有员工信息如下所示\n");Display(L);break;case 5: printf("请输入更改员工编号");getchar();scanf("%s",&id);Updata(L,id);break;case 6: printf("请输入删除员工编号");getchar();scanf("%s",&id);Delete(L,id);break;//case 7: x=0;//break;default:printf("请输入正确序号!\n");break;}}}。

数据结构课程设计代码

数据结构课程设计代码

数据结构课程设计代码根据提供的输入输出需求,下面是一个示例的数据结构课程设计代码。

```pythonclass Node:def __init__(self, data):self.data = dataself.next = Noneclass LinkedList:def __init__(self):self.head = Nonedef add(self, data):new_node = Node(data)if self.head is None:self.head = new_nodeelse:current = self.headwhile current.next is not None:current = current.nextcurrent.next = new_nodedef remove(self, data):current = self.headprev = Nonewhile current is not None:if current.data == data:if prev is None:self.head = current.next else:prev.next = current.next returnprev = currentcurrent = current.nextdef display(self):current = self.headwhile current is not None:print(current.data, end=" ")current = current.nextprint()if __name__ == "__main__":linked_list = LinkedList()while True:print("1. Add element")print("2. Remove element")print("3. Display elements")print("4. Quit")choice = input("Enter your choice: ")if choice == "1":data = input("Enter element to add: ")linked_list.add(data)elif choice == "2":data = input("Enter element to remove: ")linked_list.remove(data)elif choice == "3":linked_list.display()elif choice == "4":breakelse:print("Invalid choice")```这个代码示例实现了一个简单的链表数据结构,在命令行中提供了添加元素、删除元素和显示元素的选项。

数据结构课程设计源程序+实验报告c语言

数据结构课程设计源程序+实验报告c语言

目录学生成绩管理系统一.课设分析 (1)二.概要设计 (2)三.详细设计 (3)四.调试分析 (4)五.课设总结 (5)一.课程设计分析:功能需求:1、提供身份验证,和使用系统的权限设置、判定。

2、(教师用户)能实现08信管5或6班同学各学期各科成绩的录入(各科成绩包括:英语、会计、数据结构、操作系统、面向对象程序设计)、并编辑好每个学生的信息,输入的数据必须保存在指定的文件中,以便反复使用。

3、(学生用户或游客)提供对学号或姓名,各学期、各学科成绩的查询。

4、(学生和教师用户)能按各学期、各学科分数排序输出(每一科都要能排序输出)。

5、(教师用户)能统计各科成绩分数段的分布(60以下、60~70、70~80、80~90、90~100)情况,并输出。

课程设计的要求与数据:我按找老师给的课程设计指导书要求,完成本次的课程设计。

要求能根据所学数据结构有关知识,实现系统问题域逻辑结构的表达,存储结构的选择,以及算法的设计。

并编写出C语言源程序,在计算机上调试运行通过。

能根据前面的工作内容撰写课程设计报告,报告应做到图表使用正确,结构合理,语句通顺。

二.详细功能设计:创建用户界面用户登陆界面教师用户操作界面学生用户操作界面源程序:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#include<conio.h>#define MAX 100/*结构体定义*/typedef struct{charidt[MAX][MAX],passwordt[MAX][MAX],id s[MAX][MAX],passwords[MAX][MAX]; ////////// 密码结构体}ID;typedef struct node{char name[10];int num;int chinese;int math;int english;float average;struct node *next;}student;/*被调用的函数名*/ID *createidentity();ID *teacher();ID *_student();void menu1();void cmpteacher();void cmpstudent();menu2();menu3();student *create();void print();void search();student *_delete();student *change();student *sort0();student *sort();student *sort1();student *sort2();student *sort3();student *sort4();student *insert();void save(); student *load();/*创建用户界面*/ID *createidentity(ID *t){int i;printf("******************************* *********\n");printf("********* 用户创建操作界面**********\n");printf("******************************* *********\n");printf("******** 同时创建教师学生用户*********\n");printf("******************************* *********\n");printf("********* 0.进入登陆界面**********\n");printf("********* 1.创建教师用户**********\n");printf("********* 2.创建学生用户**********\n");printf("********* 3.退出**********\n");printf("******************************* *********\n");printf("选择你要创建的账户类型:"); scanf("%d",&i);while(i>0&&i<3){switch(i){case1:system("cls");t=teacher(t);system("cls");brea k;case2:system("cls");t=_student(t);system("cls");br eak;case 3:exit(0);}printf("******************************* *********\n");printf("********* 用户登陆操作界面**********\n");printf("******************************* *********\n");printf("********* 0.进入登陆界面**********\n");printf("********* 1.创建教师用户**********\n");printf("********* 2.创建学生用户**********\n");printf("********* 3.退出**********\n");printf("******************************* *********\n");printf("选择你要创建的账户类型:"); scanf("%d",&i);if(i==0) break;}return t;}/*教师创建账号*/ID *teacher(ID *t){int i,j=0;char x;printf("******************************* *********\n");printf("********* 教师用户创建界面**********\n");printf("******************************* *********\n");printf("输入#创建(任意字符结束创建):"); scanf("%s",&x);for(i=0;i<MAX;i++){if(x=='#'){printf("账号:");scanf("%s",&t->idt[i]);/*for(j=0;j<MAX;j++) //账号密码实验printf("%c",h->idt[i][j]);*/printf("密码:");scanf("%s",&t->passwordt[i]);printf("******************************* *********\n");printf("输入#创建(任意字符结束创建):");scanf("%s",&x);}else {break;}}return t;}/*学生创建账号*/ID *_student(ID *t){ int i;char x;printf("******************************* *********\n");printf("********* 学生用户创建界面**********\n");printf("******************************* *********\n");printf("输入#创建(任意字符结束创建):"); scanf("%s",&x);for(i=0;i<MAX;i++){if(x=='#'){printf("账号:");scanf("%s",&t->ids[i]);printf("密码:");scanf("%s",&t->passwords[i]);printf("******************************* *********\n");printf("输入#创建(任意字符结束创建):");scanf("%s",&x);}else {break;}}return t;}/*选择用户菜单*/void menu1(ID *t){int i;printf("******************************* *********\n");printf("********* 用户登陆界面********\n");printf("******************************* *********\n");printf("********* 1.教师用户********\n");printf("********* 2.学生用户********\n");printf("********* 3.返回创建********\n");printf("********* 4.退出********\n");printf("******************************* *********\n");printf("请输入你要操作的用户选项:"); scanf("%d",&i);while(i>0&&i<6){switch(i){case1:system("cls");cmpteacher(t);system("cls");br eak;case2:system("cls");cmpstudent(t);system("cls");br eak;case3:system("cls");createidentity(t);system("cls"); break;case 4:exit(0);}printf("******************************* *********\n");printf("********* 用户登陆界面********\n");printf("******************************* *********\n");printf("********* 1.教师用户********\n");printf("********* 2.学生用户********\n");printf("********* 3.返回创建********\n");printf("********* 4.退出********\n");printf("******************************* *********\n");printf("请输入你要登陆的用户选项:"); scanf("%d",&i);if(i==0) break;}}/*教师账号密码对比*/void cmpteacher(ID *t){student *h;int i,j=0;char x,y=1;char str1[MAX][MAX],str2[MAX][MAX]; printf("******************************* *********\n");printf("********* 教师用户创建界面**********\n");printf("******************************* *********\n");printf("输入# 进入账号密码输入:"); scanf("%s",&x);for(i=0;i<MAX;i++){printf("账号:");scanf("%s",&str1[i]);printf("密码:");scanf("%s",&str2[i]);for(j=0;j<100;j++){ if(strcmp(str1[i],t->idt[j])==0&&strcmp(str2[i ],t->passwordt[j])==0){system("cls");for(;;){switch(menu2()){case1:system("cls");h=create();break;case2:system("cls");print(h);break;case3:system("cls");search(h);break;case4:system("cls");h=_delete(h);break;case5:system("cls");h=change(h);break;case 6:system("cls");h=sort0(h);break;case7:system("cls");save(h);break;case8:system("cls");h=load();break;case9:system("cls");menu1(t);break;case 10:exit(0);case 11:system("cls");h=insert(h);break;}printf("\n");printf("任意字符继续(输入#结束教师用户操作):");scanf("%s",&x);if(x=='#') break;}///////////// 使用界面y=0;}if(y==0) break;else if(j==99) break;}////////////////教师用户操作界面if(y!=0){printf("账号或密码有误~!\n");system("pause");}else cmpstudent(t,h);system("cls");printf("******************************* *********\n");printf("********* 教师用户创建界面**********\n");printf("******************************* *********\n");printf("任意字符输入教师账号密码(输入#结束):");scanf("%s",&x);if(x=='#') break;}}menu2(){int n;system("cls");printf("******************************* *********\n");printf("********* 教师用户操作界面**********\n");printf("******************************* *********\n");printf("********* 1.创建**********\n");printf("********* 2.显示**********\n");printf("********* 3.查找**********\n");printf("********* 4.删除**********\n");printf("********* 5.修改**********\n");printf("********* 6.排序**********\n");printf("********* 7.储存**********\n");printf("********* 8.读取**********\n");printf("********* 9.返回**********\n");printf("********* 10.退出**********\n");printf("********* 11.插入**********\n");printf("******************************* *********\n");printf("请输入您想执行的程序:");do{scanf("%d",&n);}while(n<1||n>15);return (n);}/*学生账号密码对比*/void cmpstudent(ID *t,student *h){int i,j=0;char x,y=1;char str1[MAX][MAX],str2[MAX][MAX]; system("cls");printf("******************************* *********\n"); printf("********* 学生用户创建界面**********\n");printf("******************************* *********\n");printf("输入# 进入账号密码输入:"); scanf("%s",&x);for(i=0;i<MAX;i++){printf("账号:");scanf("%s",&str1[i]);printf("密码:");scanf("%s",&str2[i]);for(j=0;j<100;j++){if(strcmp(str1[i],t->ids[j])==0&&strcmp(str2[i ],t->passwords[j])==0){system("cls");menu3(h);///////////// 使用界面y=0;}if(y==0) break;else if(j==99) break;}////////////////教师用户操作界面if(y!=0){printf("账号或密码有误~!\n");}printf("任意字符输入学生账号密码(输入#结束):");scanf("%s",&x);if(x=='#') break;}}menu3(student *h){int i;printf("******************************* *********\n");printf("********* 学生用户操作界面**********\n");printf("******************************* *********\n");printf("********* 1.显示**********\n");printf("********* 2.查找**********\n");printf("********* 3.排序**********\n");printf("******************************* *********\n");printf("输入你要执行的程序:");scanf("%d",&i);for(;;){switch(i){case1:system("cls");print(h);break;case2:system("cls");search(h);break;case3:system("cls");h=sort0(h);break;}system("pause");system("cls");printf("******************************* *********\n");printf("********* 学生用户操作界面**********\n");printf("******************************* *********\n");printf("********* 1.显示**********\n");printf("********* 2.查找**********\n");printf("********* 3.排序**********\n");printf("******************************* *********\n");printf("输入你要执行的程序(输入1000结束):");scanf("%d",&i);if(i==1000) break;}}/*创建学生成绩*/student *create(){student *pstart,*h;char x,tag;h=(student *)malloc(sizeof(student));h=NULL;printf("输入结束标志:");scanf("%s",&tag);printf("输入判断标志:");scanf("%s",&x);while(x!=tag){pstart=(student*)malloc(sizeof(student));printf("请输入学号:\n");scanf("%d",&pstart->num);printf("请输入姓名:\n");scanf("%s",&pstart->na me);printf("请输入语文成绩:\n");scanf("%d",&pstart->chi nese);printf("请输入数学成绩:\n");scanf("%d",&pstart->ma th);printf("请输入英语成绩:\n");scanf("%d",&pstart->en glish);pstart->average=(float)( pstart->chinese+pstart->math+pstart->english) /3;pstart->next=h;h=pstart;printf("输入判断标志:");scanf("%s",&x);}return h;}/*成绩输出*/void print(student *h){student *pstart;pstart=(student*)malloc(sizeof(student));pstart=h;if(pstart==NULL){system("cls");printf("\n\t\t当前没有学生信息\n");system("pause");}else{printf(" 学号姓名语文数学英语平均分\n");while(pstart){printf("%10d%10s%8d %8d%8d%16f\n",pstart->num,pstart->name,p start->chinese,pstart->math,pstart->english,pst art->average);pstart=pstart->next;}}}/*插入*/student *insert(student *h){student *q,*p,*pstart;int a;printf("请输入要插入点学生的学号:"); scanf("%d",&a);system("pause");pstart=(student *)malloc(sizeof(student));if(!pstart){printf("\n空间不足。

数据结构课程设计——仓库管理系统源程序

数据结构课程设计——仓库管理系统源程序

#include<iostream>using namespace std;typedef struct{c har no[10];c har name[30];i nt count;}DataType;struct Node{D ataType data;N ode *next;};class Link{public:L ink(); //构造函数,建立单链表i nt Insert(); //插入节点,即添加货物N ode * Search(); //查找某个节点v oid Delete(); //删除节点或更改节点的数据v oid show(); //输出节点信息c har Yn(); //输入(y/n)函数c har * No(); //输入货物编号函数v oid Fprintf(); //将单链表数据写到文件中v oid Fscanf(); //读取文件中的数据private:N ode *first,*real,*p,*q;};int main(){i nt t=1,flag=1,f=1;c har n;N ode * p;L ink Ku;w hile(t){printf("\n\n\n\n\n");printf("\n\t\t\t**********************************");printf("\n\t\t\t* XXX仓库管理系统*");printf("\n\t\t\t* 1--- 存储货物*");printf("\n\t\t\t* 2--- 查询货物信息*");printf("\n\t\t\t* 3--- 取出货物*");printf("\n\t\t\t* 4--- 显示仓库内所有货物信息*");printf("\n\t\t\t* 0--- 退出仓库管理系统*");printf("\n\t\t\t**********************************");printf("\n\t\t\t请选择菜单号(0--4):");f=1;while(f==1){cin>>n;if(n<'0'||n>'4'){printf("输入有误,请重新输入(0--4):");f=1;}elsef=0;}printf("\n\n");switch(n){case '1':{printf("**********************************\n");printf("* 存储货物*\n");printf("**********************************\n");//printf(" 货物编号货物名称货物数量\n");//printf("**********************************\n");int a=1;while(a==1){a=Ku.Insert();Ku.Fprintf();//将单链表里的数据写入文件。

数据结构课程设计报告(附源代码)-学生管理系统

数据结构课程设计报告(附源代码)-学生管理系统

课程设计报告(一)一.报告题目:学生管理系统二.实验目的:1.熟悉线性链表,掌握线性链表的基本操作;2.练习求线性表中指定结点元素及修改指定结点的元素、求指定结点的前驱/后继元素、删除指定结点的元素、在指点节点位置插入元素等。

3.通过文件保存和读取文件来提升文件操作的能力;4.C语言编程能力的提升训练。

三.实验环境:C语言编程,VC++6.0编程工具实现。

四.软件系统结构1.总体架构/层次:2.各功能的实现流程图:函数6:文件装入功能实现流程图函数7:文件保存功能实现流程图函数8:退出菜单功能实现流程图五.软件功能设计:本软件是要编写一个学生管理系统,一个学生有很多相关数据,包括学号、姓名、性别、年龄、家庭住址、练习电话,因此我们利用线性链表的知识来编写程序,这是因为线性链表有很多优良的特点,因此该程序是对线性链表的应用练习。

本软件利用线性链表的特点,结合文件相关函数的运用,它能够实现以下功能:1.用结点的数据域存放学生的学号、姓名、性别、年龄、家庭住址、练习电话;2.利用结点的指针域访问某个结点的前驱或者后继;3.录入新学生信息并按非降序插入到链表中;4.查找给定学号的结点学生信息;5.删除给定学号的结点学生信息;6.修改给定学号的结点学生信息;7.显示全部结点的学生信息;8.将链表中的学生信息全部存入文件;9.将已存在的学生信息文件中的学生信息按学号非降序插入到当前链表中;六.源程序代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<windows.h>#define NAMELEN 15#define ADDRLEN 10#define TELLEN 15#define OVERFLOW 0#define ERROR 0#define FALSE 0#define OK 1#define TRUE 1struct stud{ long num;char name[NAMELEN+1];char sex;int age;char Addr[ADDRLEN+1];long rxsj;char lxfs[TELLEN+1];};typedef stud ElemType;//链表结点元素为结构体FILE *fp;typedef struct LNode{ElemType data;LNode *next;} *LinkList;//typedef LNode *;int InitList(LinkList &L){ //操作结果:构造一个空的线性表LL=(LinkList )malloc(sizeof(LinkList));//产生头结点,并使L指向头结点if(!L)//存储分配失败exit(OVERFLOW);L->next=NULL;// 指针域为空return OK;}int ListTraverse(LinkList L,void(*vi)(ElemType)){//条件:线性表已存在//操作结果:一次对L的每个数据元素调用函数vi()。

《数据结构》实验指导书(源代码)

《数据结构》实验指导书(源代码)

实验一线性表的链式存储结构一、实验目的:1.掌握线性表的链式存储结构。

2.熟练地利用链式存储结构实现线性表的基本操作。

3.能熟练地掌握链式存储结构中算法的实现。

二、实验内容:1.用头插法或尾插法建立带头结点的单链表。

2.实现单链表上的插入、删除、查找、修改、计数、输出等基本操作。

三、实验要求:1. 根据实验内容编写程序,上机调试、得出正确的运行程序。

2. 写出实验报告(包括源程序和运行结果)。

四、实验学时:2学时五、实验步骤:1.进入编程环境,建立一新文件;2. 参考以下相关内容,编写程序,观察并分析输出结果。

①定义单链表的数据类型,然后将头插法和尾插法、插入、删除、查找、修改、计数、输出等基本操作都定义成子函数的形式,最后在主函数中调用它,并将每一种操作前后的结果输出,以查看每一种操作的效果。

②部分参考程序//单链表的建立(头插法),插入,删除,查找、修改、计数、输出#include<iostream.h>#define elemtype intstruct link{ elemtype data;//元素类型link *next; //指针类型,存放下一个元素地址};//头插法建立带头结点的单链表link *hcreat(){ link s,p;elemtype i;cout<<”输入多个结点数值(用空格分隔),为0时算法结束”;cin>>i;p=new link;p->next=NULL;while(i) //当输入的数据不为0时,循环建单链表{s=new link;s->data=i;s->next=p->next;p->next=s;cin>>i; }return p;}//输出单链表void print(1ink *head){1ink *p;p=head->next;while(p->next!=NULL){cout<<p->data<<”->”; //输出表中非最后一个元素p=p->next;}cout<<p->data; //输出表中最后一个元素cout<<endl;}∥在单链表head中查找值为x的结点Link *Locate(1ink *head,elemtype x){Link *p;p=head->next;while((p!=NULL)&&(p->data!=x))p=p->next;return p; }//在head为头指针的单链表中,删除值为x的结点void deletel(1ink *head,elemtype x){1ink *p, *q;q=head;p=head->next;while((p!=NULL)&&(p->data!=x)){q=p;p=p->next;}If(p==NULL) cout<<“要删除的结点不存在”;elseq->next=p ->next;delete(p);}}//在头指针head所指的单链表中,在值为x的结点之后插入值为y的结点void insert(1ink *head,elemtype x,elemtype y){ link *p, *s;s=new link;s->data=y;if(head->next==NULL) //链表为空{head->next=s;s->next=NULL:}p=Locate(head,x);//调用查找算法‘if(p==NULL)cout<<”插入位置非法”:else(s->next=p->next;p->next=s;}}//将单链表p中所有值为x的元素修改成y void change(1ink *p,elemtype x,elemtype y) {link *q;q=p->next;while(q!=NULL){ if(q->data==x) q->data=y;q=q->next;}}void count(1ink *h) //统计单链表中结点个数{1ink *p;int n=0;p=h->next;while(p!=NULL){n++;p=p->next;}return n;}void main(){ int n;elemtype x,y;link *p, *q;p=hcreat(); //头插法建立链表print(p); //输出刚建立的单链表cout<<”请输入要删除的元素”;cin>>y;deletel(p,y);print(p); //输出删除后的结果cout<<”请输入插入位置的元素值(将待插元素插入到它的后面)”; cin>>x;cout<<”请输入待插元素值”;cin>>y;insert(p,x,y);print(p); //输出插入后的结果cout<<”请输入要修改前、后的元素值”;cin>>x>>y;change(p,x,y);print(p);cout<<”请输入要查找的元素值”;cin>>x;q=Locate(p,x);if(q==NULL)cout<<x<<”不在表中,找不到!”<<endl;else cout<<x<<”在表中,已找到!”<<endl;n=count(p);cout<<”链表中结点个数为:”<<n<<endl:}//单链表的建立(尾插法)、插入、删除、查找、修改、计数、输出#include<iostream.h>#define elemtype intstruct link{ elemtype data;//元素类型link *next;//指针类型,存放下-个元素地址};//尾插法建立带头结点的单链表link *rcreat(){link *s, *p, *r;elemtype i;cout<<”输入多个结点数值(用空格分隔),为0时算法结束”; cin>>i;p=r=new link;p->next=NULL;while(i){s=new link;s->data=i;r->next=s;r=s;cin>>i; }r->next=NULL;return p;}//输出单链表void print(1ink *head){link *p;p=head->next;while(p->next!=NULL){cout<<p->data<<"->”; //输出表中非最后一个元素p=p->next;)cout<<p->data; //输出表中最后一个元素cout<<endl;}link *Locate(1ink *head,int x) ∥在单链表中查找第x个结点 {link *p;p=head;int j=0;while((p!=NULL)&&(j<x)){p=p->next; j++;}return p;}void delete I(1ink *head,elemtype x)//在head为头指针的单链表中,删除值为x的结点{link *p, *q;q=head;p=head->next;while((p!=NULL)&&(p->data!=x)){q=p;p=p->next;)if(p==NULL)cout<<”要删除的结点不存在“;else{q->next=p->next;delete(p);} }void insert(1ink *head,int x,elemtype y)//在头指针head所指单链表中,在第x个结点之后插入值为y的结点{link *p, *s;s=new link;s->data=y;if(head->next==NULL)//链表为空{head->next=s;s->next=NULL:}p=Locate(head,x); //调用查找算法if(p==NULL)cout<<”插入位置非法”;else{s->next=p->next;p->next=s;}}void change(1ink *p,elemtype x,elemtype y){∥将单链表P中所有值为x的元素改成值为ylink *q;q=p->next;while(q!=NULL){if(q->data==x)q->data=y;q=q->next;}}void count(1ink *h) //统计单链表中结点个数(1ink *p;int n=0;p=h->next;while(p!=NULL){n++;p=p->next;}retum n;}void main(){ int n;link p,q;p=rcreat();//尾插法建立链表print(p); //输出刚建立的单链表cout<<”请输入要删除的元素”;cin>>y;deletel(p,y);print(p); //输出删除后的结果cout<<”请输入插入位置”;cin>>x;cout<<”请输入待插元素值”;cin>>y;insert(p,x,y);print(p); //输出插入后的结果cout<<”请输入修改前、后的元素值”;cin>>x>>y;change(p,x,y);print(p);cout<<“请输入要查找的元素值”;cin>>x;q=Locate(p ,x);if(q==NULL)cout<<x<<”不在表中,找不到!”<<endl;else cout<<x<<”在表中,已找到!”<<endl;n=count(p);cout<<”链表中结点个数为:”<<n<endl;}六、选作实验试设计一元多项式相加(链式存储)的加法运算。

实验报告数据结构课程设计源代码

实验报告数据结构课程设计源代码

表达式类型的实现——实习报告一.需求分析1. 编写一个程序,通过前缀表达式来构造一个与之对应的算术表达式并存入二叉树中,通过中序遍历二叉树输出表达式及对其进行变量赋值,通过后序遍历二叉树计算表达式的值。

2. 本程序功能有:存储表达式、对表达式进行赋值计算、求偏导、计算三角函数、合并常数及接受原书写形式的表达式。

3. 测试数据(1). 分别输入0 ; a ; -91 ; +a*bc ; +*5^x2*8x ; +++*3^x3*2^x2x6并输出。

(2). 每输入一个表达式,对其中的变量进行赋值,再对表达式求值。

二.概要设计按照要求,需要以二叉树来存储表达式,但在构造过程中还需要用到栈来实现前缀表达式与二叉树之间的转换。

1. 抽象数据类型栈的定义:ADT SqStack{数据对象:D={ai |ai为整型或字符型}数据关系:R={<ai , ai-1> |ai ,ai-1∈D}基本操作:Status InitStack(SqStack&S);此函数用于创建一个空栈Status StackEmpty(SqStack S);此函数用于判断栈是否为空Status StackFull(SqStack S);此函数用于判断栈是否已满Status Push(SqStack&S, SElemType e);将数据元素e入栈Status Pop(SqStack&S, SElemType&e);出栈,并以e返回出栈的元素Status GetTop(SqStack S, SElemType&e);若栈不空,则以e返回栈顶元素}ADT SqStack2. 二叉树表达式数据类型ATD BiTNode{数据对象:D= { a i | a i∈SqStack}数据关系:R= {<ai , ai-1> |ai ,ai-1∈D}基本操作:Status InputExpr(char*string,int flag);以字符串形式读取输入void JudgeValue(BiTree*E,char*string,int i);判断字符string[i],如果是'0'-'9'常量之间,二叉树结点存为整型;否则,存为字符型 Status ReadExpr(BiTree*E,char*exprstring);以正确的前缀表示式并构造表达式EStatus PriCmp(char c1,char c2);如果两个字符是运算符,比较两个运算符的优先级,c1比c2优先,返回OK,否则返回ERRORvoid WriteExpr(BiTree E);用带括弧的中缀表达式输出表达式void Assign(BiTree*E,char V,int c,int*flag);实现对表达式中的所有变量V的赋值(V=c),参数flag为表示是否赋值过的标志long Operate(int opr1,char opr,int opr2);运算符运算求值,参数opr1,opr2为常量,opr为运算符,根据不同的运算符,实现不同的运算,返回运算结果double Operate1(char opr,double opr1);三角函数运算求值,参数opr为常量,opr1为运算符,根据不同的运算符,实现不同的运算,返回运算结果Status Check(BiTree E);检查表达式是否还存在没有赋值的变量,以便求算数表达式的值long Value(BiTree E);对算术表达式求值void CompoundExpr(char P,BiTree&E1,BiTree E2);构造一个新的复合表达式Status ReadInorderExpr(char*string,char*pre_expr);以表达式的原书写形式输入,表达式的原书写形式字符串string变为字符串pre_expr,后调用reversal_string()函数反转得到前缀表达式pre_exprvoid ReversalString(char*exprstring);将字符串exprstring反转过来void MergeConst(BiTree*E);常数合并操作函数,合并表达式E中所有常数运算int IsOperator(char c);判断是否操作符void Diff(BiTree&E,char v);求偏导数}ADT BiTNode3. 主程序int main() {while(TRUE) {判断用户选择的操作;执行所选操作,并适时提示用户输入及输出运算结果;若用户选择退出,则执行exit(0)退出程序;};4. 程序调用关系:主程序模块三.详细设计1. 数据类型:二叉树数据类型:typedef enum{INT,CHAR}ElemTag;/*INT为整型数据num,CHAR为字符型数据c*/typedef struct TElemType{ElemTag tag;/*{INT,CHAR}指示是整型还是字符型*/int num;/*tag=INT时,为整型*/char c;/*tag=CHAR时,为字符型*/}TElemType;二叉树节点类型:typedef struct BiTNode{TElemType data;/* 二叉树存储的数据*/struct BiTNode*lchild,*rchild; /* 左右孩子指针*/}BiTNode,*BiTree;2. 函数实现:(以伪码表示)Status InputExpr(char *string,int flag) //此函数用于表达式的输入与存储{if(flag==0)cout<<"\n请输入正确的前缀表示式:";else cout<<"\n请以表达式的原书写形式输入正确表示式:";fflush(stdin);/*清理缓冲区*/gets(string);/*从键盘输入一串字符串作为表达式*/if(strlen(string)==1)/*输入的表达式字符串长度为1*/if(string[0]=='+'||string[0]=='-'||string[0]=='*'||string[0]=='/'||string[0]=='^')/*输入的表达式只有一个运算符*/{cout<<"\n表达式只有一个字符,为运算符,错误!";return ERROR;}else if((string[0]>='0'&&string[0]<'9')||(string[0]>='a'&&string[0]<='z')||(string[0]>='A'&&string[0]<='Z')) /*输入的表达式只有一个数字或字符*/{cout<<"\n表达式只有一个字符!";return OK;}else {cout<<"\n输入的字符不是运算符也不是变量常量,错误!";return ERROR;}return OK;}void JudgeValue(BiTree *E,char *string,int i) //此函数用于判断字符string[i],如果是'0'-'9'常量之间,二叉树结点存为整型;否则,存为字符型{if(string[i]>='0'&&string[i]<='9') {(*E)->data.tag=INT;(*E)->data.num=string[i]-'0';}//string[i]为常量else if(string[i]>='10'&&string[i]<='20') {(*E)->data.tag=INT;(*E)->data.num=SaveNumber[string[i]];} //string[i]为常量,存于数组save_number中else {(*E)->data.tag=CHAR;(*E)->data.c=string[i];} /*string[i]为变量,对数据进行变量标记}/*以正确的前缀表示式并构造表达式E*/Status ReadExpr(BiTree *E,char *exprstring){定义栈;为树的根结点分配空间;len=strlen(exprstring);/*len赋值为表达式的长度*/if(len==1) JudgeValue(E,exprstring,0);/*将exprstring[0]存入二叉树的结点中*/else {JudgeValue(E,exprstring,0);/*将exprstring[0]存入二叉树的结点中*/InitStack(S);/*初始化栈*/q=(*E);Push(S,q);/*入栈*/Push(S,q);/*入栈,根结点入栈两次是为判断先序输入的表达式是不是正确的表达式*/for(i=1;i<len&&!StackEmpty(S);i++){p=(BiTree)malloc(sizeof(BiTNode));JudgeValue(&p,exprstring,i);/*将exprstring[i]存入二叉树的结点中*/p->lchild=NULL;p->rchild=NULL;if(exprstring[i]=='+'||exprstring[i]=='-'||exprstring[i]=='*'||exprstring[i]=='/'||exprstring[i]=='^'){/*为运算符,运算符入栈,左孩子不空,向左孩子走,否则,如果右孩子不空,向右孩子走*/if(!q->lchild) {q->lchild=p;Push(S,p);q=p;}else {q->rchild=p;Push(S,p);q=p;}}else /*不是运算符,运算符出栈*/{if(!q->lchild) {q->lchild=p;Pop(S,q);}else {q->rchild=p;Pop(S,q);}}}if(StackEmpty(S)&&i>=len) return OK;/*栈空且i>=len,说明输入的表达式是正确的*/ else /*输入的表达式是错误的*/{cout<<"\n输入的表达式有误!";return ERROR;}}}//此函数用于比较两个运算符的优先级,若c1比c2优先,返回OK,否则返回ERROR Status PriCmp(char c1,char c2){if((c1=='^'||c1=='*'||c1=='-'||c1=='+'||c1=='/')&&(c2=='^'||c2=='*'||c2=='-'||c2=='+'||c2=='/')){/*c1和c2为运算符*/if(c1=='^'){/*c1为指数运算符,则当c2不为'^'时,c1比c2优先*/if(c2!='^') return OK;else return ERROR;}else if(c1=='*'||c1=='/'){/*c1为乘法或除法运算符,则当c2为'+'或'-',c1比c2优先*/if(c2=='^'||c2=='*'||c2=='/') return ERROR;else return OK;}else return ERROR;/*其余,c1不比c2优先*/}else return ERROR;/*c1和c2不是运算符*/}此函数递归实现用带括弧的中缀表达式输出表达式void WriteExpr(BiTree E){if(E)/*树不为空*/{ //先递归左子树if(E->lchild&&E->lchild->data.tag==CHAR)/*E的左孩子不为空,且左孩子为字符*/{if(PriCmp(E->data.c,E->lchild->data.c)){cout<<"(";WriteExpr(E->lchild);cout<<")";}/*带括弧输出左子树*/else WriteExpr(E->lchild);/*否则,不带括弧输出左子树*/}else WriteExpr(E->lchild);/*否则,输出左子树*//*访问输出根结点的值*/if(E->data.tag==INT){cout<<E->data.num;}else cout<<E->data.c;//后递归右子树if(E->rchild&&E->rchild->data.tag==CHAR){//E的右孩子不为空,且右孩子为字符if(PriCmp(E->data.c,E->rchild->data.c)){cout<<"(";WriteExpr(E->rchild);cout<<")";}/*带括弧输出右子树*/else WriteExpr(E->rchild);/*否则,不带括弧输出右子树*/}else WriteExpr(E->rchild);/*否则,输出右子树*/}}此函数递归实现对表达式中的所有变量V的赋值(V=c),参数flag为表示是否赋值过的标志void Assign(BiTree *E,char V,int c,int *flag){if(*E){if((*E)->data.tag==CHAR&&(*E)->data.c==V) {(*E)->data.tag=INT;(*E)->data.num=c;*flag=1;} /*如果找到要赋值的变量,赋值*/Assign(&((*E)->lchild),V,c,flag);/*递归左子树*/Assign(&((*E)->rchild),V,c,flag);/*递归左子树*/}}/*运算符运算求值,参数opr1,opr2为常量,opr为运算符,根据不同的运算符,实现不同的运算,返回运算结果*/long Operate(int opr1,char opr,int opr2){switch(opr){case '+':/*加法*/result=opr1+opr2;return result;break;case '-':/*减法*/result=opr1-opr2;return result;break;case '*':/*乘法*/result=opr1*opr2;return result;break;case '/':/*除法,除法是在整型类型上的除法*/result=opr1/opr2;return result;break;case '^':/*指数运算*/result=pow(opr1,opr2);return result;break;default:break;}}/*三角函数运算求值,参数opr为常量,opr1为运算符,根据不同的运算符,实现不同的运算,返回运算结果*/double Operate1(char opr,double opr1){switch(opr){case 's'://正弦运算result1=sin(opr1);return result1;break;case 'c'://余弦运算result1=cos(opr1);return result1;break;case 't'://正切运算result1=tan(opr1);return result1;break;default:break;}}/*检查表达式是否还存在没有赋值的变量,以便求算数表达式的值*/Status Check(BiTree E){if(E&&E->data.tag==CHAR){/*树不为空*/if(E->data.c!='*'&&E->data.c!='^'&&E->data.c!='-'&&E->data.c!='+'&&E->data.c!='/'){cout<<"\n表达式中仍存在变量没有赋值!没法求出表达式的值!";return ERROR;}/*存在变量,提示信息,后返回ERROR*/if(Check(E->lchild)) Check(E->rchild);}}/*对算术表达式求值*/long Value(BiTree E){if(E){/*树不为空*/if(!E->lchild&&!E->rchild&&E->data.tag==INT) return (E->data.num);/*结点的左孩子和右孩子为空,为叶子结点,返回结点的值*/return Operate(Value(E->lchild),E->data.c,Value(E->rchild));/*运算求值,后根遍历的次序对表达式求值,其中参数递归调用了Value()函数求左子树的值和右子树的值*/}}/*构造一个新的复合表达式*/void CompoundExpr(char P,BiTree &E1,BiTree E2){为结点E申请空间;E->data.tag=CHAR;E->data.c=P;/*申请到的结点值为P*/E->lchild=E1;/*结点的左孩子为E1*/E->rchild=E2;/*结点的右孩子为E2*/E1=E;/*(*E1)为根结点*/cout<<"\n表达式E复合成功!其表达式变为:\n";WriteExpr(E);/*输出复合好的表达式*/}/*此函数以表达式的原书写形式输入,表达式的原书写形式字符串string变为字符串pre_expr*//*后调用reversal_string()函数反转得到前缀表达式pre_expr*/Status ReadInorderExpr(char *string,char *PreExpr){int i,j,len,CharNumber=1;/*len表示字符串string的长度,char_number是记录数组save_number[]的个数*/int number;/*保存大于9的常量*/InitStack1(S);/*初始栈*/Push1(S,'#');/*先将字符'#'入栈,用来表示作为栈的最底一个元素*/len=strlen(string);/*len为字符串string的长度*/c=string[len-1];/*从字符串的最后一个字符开始向前扫描*/i=len-1;while(!StackEmpty1(S)&&i>=0){/*栈不为空且i大于等于0*/if(c=='('){/*字符为'('*/Pop1(S,c);/*出栈,赋值给c*/while(c!=')'){/*假如c不为')',出栈*/*PreExpr++=c;if(!StackEmpty1(S)&&GetTop1(S,c1)&&c1!='#') Pop1(S,c);else {cout<<"\n输入的表达式有误!";return ERROR;}}}else if(c==')'){Push1(S,c);} /*字符为')',入栈*/else if(c>='0'&&c<='9'){/*字符为'0'-'9'之间,循环扫描string前一个字符,后确定常量的大小*/number=c-'0';/*number为第一个常量字符的ASCII码-48*/for(c1=string[i-1],j=1;(c1>='0'&&c1<='9')&&i>=0;j++,i--){/*循环扫描string前一个字符,求出常量后赋给number*/number=(c1-'0')*pow(10,j)+number;/*number为扫描到的常量*/c1=string[i-2];}SaveNumber[CharNumber]=number;/*将number存入到数组save_number中,下标为char_number*/*PreExpr++=c;CharNumber++;}else if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){//string下一个字符不能为常量或变量,否则,出错if((string[i-1]>='0'&&string[i-1]<='9')||(string[i-1]>='A'&&string[i-1]<='Z')||(string[i-1]>='a'&&string[i-1]<='z')) {cout<<("\n输入的表达式有误!");return ERROR;}else *PreExpr++=c;}else if(c=='*'||c=='/'){/*字符为运算符'*'或'/'*/while(GetTop1(S,c1)&&(c1=='^')){Pop1(S,c1);*PreExpr++=c1;}/*如果c1比c优先,出栈*/Push1(S,c);/*入栈字符c*/}else if(c=='+'||c=='-'){/*字符为运算符'+'或'-'*/while(GetTop1(S,c1)&&(c1=='^'||c1=='*'||c1=='/')){Pop1(S,c1);*PreExpr++=c1;}/*如果c1比c优先,出栈*/Push1(S,c);/*入栈运算符c*/}else if(c=='^'){Push1(S,c);/*入栈运算符'^'*/}else {cout<<"\n输入的表达式有误!";return ERROR;}/*其他字符,错误,返回ERROR*/i--;/*下一个字符*/if(i>=0) c=string[i];/*i不小于0,c=string[i]循环下一个字符*/else /*否则,将清空栈*/while(!StackEmpty1(S)&&GetTop1(S,c1)&&c1!='#') {Pop1(S,c);*PreExpr++=c;} }Pop1(S,c);/*将'#'出栈*/*PreExpr='\0';/*字符串结束符*/if(i<0&&StackEmpty1(S)) return OK;else return ERROR;}/*将字符串exprstring反转过来*/void ReversalString(char *exprstring){len=strlen(exprstring);/*len为exprstring的长度*/for(i=0,j=len-1;i<j;i++,j--){/*字符串前后两个字符对换*/temp=exprstring[i];exprstring[i]=exprstring[j];exprstring[j]=temp;}}/*常数合并操作函数,合并表达式E中所有常数运算*/void MergeConst(BiTree *E){while((*E)->lchild&&(*E)->rchild){/*左右孩子不为空*/if((*E)->lchild->data.tag==INT&&(*E)->rchild->data.tag==INT){//假如左右孩子为常量,合并result=Operate((*E)->lchild->data.num,(*E)->data.c,(*E)->rchild->data.num);/*常数合并运算,调用Operate()函数求值*/(*E)->data.tag=INT;(*E)->data.num=result;/*修改之前的运算符为常量*/free((*E)->lchild);/*释放左孩子*/free((*E)->rchild);/*释放右孩子*/(*E)->lchild=(*E)->rchild=NULL;/*左右孩子置空*/}else{MergeConst(&((*E)->lchild));/*递归左孩子*/MergeConst(&((*E)->rchild));/*递归右孩子*/}}}//判断是否操作符int IsOperator(char c){switch(c){case '+': return TRUE;case '-': return TRUE;case '*': return TRUE;case '/': return TRUE;case '^': return TRUE;default: return FALSE;}}void Diff(BiTree &E,char v)//求偏导数{if((E->lchild)&&(E->rchild))//树不为空{if((E->rchild->data.c=='^')&&(E->rchild->lchild->data.c==v) )//若该变量为要求偏导的变量,则对其求偏导{E->lchild->data.num=(E->lchild->data.num)*(E->rchild->rchild->data.num);E->lchild->data.tag=INT;E->rchild->rchild->data.num=E->rchild->rchild->data.num-1;}else if(E->rchild->data.tag==INT&&(E->data.c=='+'||E->data.c=='-'))//若该变量不是要求偏导的变量,且为整数,则以0替换其中数据{E->rchild->data.num=0;E->rchild->data.tag=INT;}else if((E->rchild->data.c==v)&&(IsOperator(E->lchild->data.c)))//否则以1替换其中数据{E->rchild->data.num=1;E->rchild->data.tag=INT;}else if((E->rchild->data.c==v)&&E->lchild->data.tag==INT){E->data.num=E->lchild->data.num;E->data.tag=INT;free(E->lchild);free(E->rchild);E->lchild=E->rchild=NULL;}Diff(E->lchild,v);//递归执行左子树Diff(E->rchild,v);//递归执行右子树}else return;}3.主程序和其他函数:char menu()//主菜单{char choice;cout<<"\n\t****************************************";cout<<"\n\t***********9.表达式类型的实现***********";cout<<"\n\t 1 >>>输入正确的前缀表达式";cout<<"\n\t 2 >>>带括弧的中缀表示式输出";cout<<"\n\t 3 >>>对变量进行赋值";cout<<"\n\t 4 >>>对算数表达式求值";cout<<"\n\t 5 >>>构造一个新的复合表达式";cout<<"\n\t 6 >>>以表达式的原书写形式输入(选作)";cout<<"\n\t 7 >>>合并表达式中所有常数运算(选作)";cout<<"\n\t 8 >>>三角函数操作 (选作)";cout<<"\n\t 9 >>>求偏导数 (选作)";cout<<"\n\t 0 >>>退出";cout<<"\n\t****************************************";cout<<"\n\t请输入你的选择(数字)>>>>>";cin >> choice;return choice;}int main(){BiTree E,E1;//两个表达式E和E1int flag=0;//表达式E构造标志,为0表示未构造,为1表示已构造char V,P;//V被赋值,P为符合表达式运算符char string[30],ExprString[30];//字符串while(TRUE){system("cls");//清屏switch(menu()) {case '1':/*1 >>>输入正确的前缀表达式*/cout<<"\n\t*************************输入提示信息************************";cout<<"\n\t输入正确的前缀表达式的要求:";cout<<"\n\t\t【变量】 a-z或A-Z";cout<<"\n\t\t【常量】 0-9,不能超过9";cout<<"\n\t\t【运算符】 +,-,*,/,^";cout<<"\n\t请输入正确的前缀表达式,后按回车键存入缓冲区,否则可能会出错!";cout<<"\n\t*************************************************************";if(InputExpr(ExprString,0))//在flag=0时,初始输入if(ReadExpr(&E,ExprString)){//前缀读入并构造Eflag=1;cout<<"\n表达式构造成功!请按任意键返回菜单";}getchar();break;case '2':/*2 >>>带括弧的中缀表示式输出*/if(flag==1){cout<<("\n\t带括弧的中缀表达式为:");WriteExpr(E);}else cout<<("\n\t表达式未构造成功!请重新构造成功的表达式!");getchar();getchar();break;case '3':/*3 >>>对变量进行赋值*/cout<<("\n\t********************赋值操作说明信息***********************************");cout<<("\n\t赋值操作:实现对表达式中的某一个变量V的赋值,即使V=C,C为一整数");cout<<("\n\t 【1】根据输出的表达式,输入要赋值的变量V,只能输入一个字符,否则出错");cout<<("\n\t 【2】输入要将变量V赋值为的整数C,只能是整数,否则出错");cout<<("\n\t 【注】如果表达式未构造,请回到主菜单选择构造表达式");cout<<("\n\t***********************************************************************");if(flag==1){int AssignFlag=0;cout<<"\n表达式E为:";WriteExpr(E);fflush(stdin);/*清理缓冲区*/cout<<"\n请输入要赋值的字符:";V=getchar();cout<<"请输入要将赋值为:";cin>>c;Assign(&E,V,c,&AssignFlag);//赋值并改变标志if(AssignFlag){cout<<"\n赋值成功!\n赋值后的表达式为:";WriteExpr(E);}else cout<<"\n表达式里没有%c这个变量!",V;}else cout<<"\n表达式未构造成功!请构造成功的表达式!";getchar();getchar();break;case '4':/*4 >>>对算数表达式求值*/cout<<"\n\t********************算数表达式求值说明信息************************";cout<<"\n\t 【注】如果表达式还有变量未赋值,即表达式不是算数表达式";cout<<"\n\t 不能求出表达式的值,请回到主菜单选择赋值操作,后再求值";cout<<"\n\t******************************************************************";if(flag==1){cout<<"\n算数表达式:";WriteExpr(E);if(Check(E)){ //检查是否全赋值result=Value(E);cout<<"\n求算数表达式的值:\t";WriteExpr(E);cout<<"="<<result;}}else cout<<"\n表达式未构造成功!请构造成功的表达式!";getchar();getchar();break;case '5':/*5 >>>构造一个新的复合表达式*/cout<<"\n\t*****************构造新的复合表达式说明信息***************************";cout<<"\n\t 【1】构造一个新的表达式E1,采用表达式的原书写形式输入";cout<<"\n\t 【2】构造表达式E1成功后,输入要复合表达式E和E1的操作运算符(+,-,*,/,^)";cout<<"\n\t 【注】如表达式E未构造,不能复合表达式;如构造表达式E1错误,复合失败";cout<<"\n\t***********************************************************************";if(flag==1){cout<<"\n表达式E1为:";WriteExpr(E);cout<<"\n请构造新的表达式E2:";fflush(stdin);/*清理缓冲区*/if(InputExpr(string,1)){//标志为1,输入字符串if(ReadInorderExpr(string,ExprString)){//入栈ReversalString(ExprString);//反转if(ReadExpr(&E1,ExprString)){flag=1;cout<<("\n表达式E2构造成功!");WriteExpr(E1);cout<<("\n请输入要构造新的复合表达式的操作运算符>>>");P=getchar();while(P!='*'&&P!='/'&&P!='+'&&P!='-'&&P!='^'){fflush(stdin);/*清理缓冲区*/cout<<"\n输入的操作运算符有误!请重新输入>>>";P=getchar();}CompoundExpr(P,E,E1);}else cout<<"\n复合新的表达式失败!请按任意键返回主菜单!";}}}else cout<<"\n表达式未构造成功!请构造成功的表达式!";getchar();getchar();break;case '6':/*6 >>>以表达式的原书写形式输入*/cout<<"\n\t*************以表达式的原书写形式输入说明信息************************";cout<<"\n\t输入正确的原书写形式表达式";cout<<"\n\t 【变量】 a-z或A-Z";cout<<"\n\t 【常量】大于等于0的正整数";cout<<"\n\t 【运算符】 +,-,*,/,^(乘幂)";cout<<"\n\t 【括弧】左括弧 ( ,右括弧 ) ";cout<<"\n\t 【注】表示式中常量最多只能是30个,超过30个,出错!";cout<<"\n\t按原书写形式输入中,请按照正确的方式输入,否则可能会出错!";cout<<"\n\t**********************************************************************";if(InputExpr(string,1))if(ReadInorderExpr(string,ExprString)){ReversalString(ExprString);if(ReadExpr(&E,ExprString)){flag=1;cout<<"\n表达式构造成功!\n输入的带括弧的中缀表达式:";WriteExpr(E);}}getchar();getchar();break;case '7':/*7 >>>合并表达式中所有常数运算*/cout<<"\n***************合并表达式中的所有常数运算*******************************";cout<<"\n 【注】合并表达式中的所有常数运算并不能一次性将常数都合并!";cout<<"\n例如:表达式'1+2*(3+3*4+9/3)'的常数合并,选择7进行合并,结果变为\n'1+2*(3+12+3)',";cout<<"根据优先级先后合并的,如果要合并到最后,需多次选择7\n进行合并,又合并一次'1+2*(15+3)',";cout<<"再次合并'1+2*18',再次合并'1+36',\n再次合并'37',后无法合并!";cout<<"\n************************************************************************";if(flag==1) {cout<<"\n原表达式为:";WriteExpr(E);MergeConst(&E);//常数合并操作cout<<"\n合并表达式中所有的常数运算后的表达式:";WriteExpr(E);}else cout<<"\n表达式未构造成功!请构造成功的表达式!";getchar();getchar();break;case '8'://三角函数操作cout<<"\t***************************三角函数操作(选作)***************************";cout<<"\n";cout<<"\n\t[注] 请按要求输入其中 s代表sin c代表cos t代表tan ";cout<<"\n\t角度用弧度表示,例如~1 即表示sin 1";cout<<"\n\t本操作只可求三角函数值,如需其他操作请将结果带入其它操作中";cout<<"\n\t输入一个字符请按回车,确保正确录入";cout<<"\n\t************************************************************************";double opr1,result1;char opr;cout<<"\n请按要求输入";cin>>opr;cin>>opr1;result1=Operate1(opr,opr1);cout<<"结果为:"<<result1;getchar();getchar();break;case '9'://求导getchar();char h;cout<<"输入需要求偏导的变量字符\n";cin>>h;Diff(E,h);WriteExpr(E);getchar();getchar();break;case '0':/*0 >>>退出*/cout<<"\n请按任意键退出!";getchar();getchar();exit(0);break;default :cout<<"\n输入有误!请按任意键回到主菜单重新选择!";getchar();getchar();getchar();//Sleep(5000);break;}}return 0;}(部分代码较长,故在word文档中较难整理格式,请参见附录源代码查看)函数调用关系:四.调试分析1.合并表达式所有常数运算功能一开始只能实现一次合并,即:1+4*6=1+24 或者8+3*2^4=8+3*16。

数据结构与算法实验源代码

数据结构与算法实验源代码

数据结构与算法实验源代码数据结构与算法实验源代码一、实验目的本实验旨在通过编写数据结构与算法的实验源代码,加深对数据结构与算法的理解,并提高编程能力。

二、实验环境本实验使用以下环境进行开发和测试:- 操作系统:Windows 10- 开发工具:IDEA(集成开发环境)- 编程语言:Java三、实验内容本实验包括以下章节:3.1 链表在本章节中,我们将实现链表数据结构,并实现基本的链表操作,包括插入节点、删除节点、查找节点等。

3.2 栈和队列在本章节中,我们将实现栈和队列数据结构,并实现栈和队列的基本操作,包括入栈、出栈、入队、出队等。

3.3 树在本章节中,我们将实现二叉树数据结构,并实现二叉树的基本操作,包括遍历树、搜索节点等。

3.4 图在本章节中,我们将实现图数据结构,并实现图的基本操作,包括广度优先搜索、深度优先搜索等。

3.5 排序算法在本章节中,我们将实现各种排序算法,包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。

3.6 搜索算法在本章节中,我们将实现各种搜索算法,包括线性搜索、二分搜索、广度优先搜索、深度优先搜索等。

四、附件本文档附带实验源代码,包括实现数据结构和算法的Java源文件。

五、法律名词及注释5.1 数据结构(Data Structure):是指数据对象中数据元素之间的关系。

包括线性结构、树形结构、图形结构等。

5.2 算法(Algorithm):是指解决问题的一系列步骤或操作。

算法应满足正确性、可读性、健壮性、高效性等特点。

5.3 链表(Linked List):是一种常见的数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。

5.4 栈(Stack):是一种遵循后进先出(LIFO)原则的有序集合,用于存储和获取数据。

5.5 队列(Queue):是一种遵循先进先出(FIFO)原则的有序集合,用于存储和获取数据。

5.6 树(Tree):是由节点组成的层级结构,其中一种节点作为根节点,其他节点按照父子关系连接。

数据结构课程设计源程序

数据结构课程设计源程序

#include <stdio.h>#include <string.h>#include <iostream>using namespace std; struct linkf{char username[16];struct links *next; };struct linkr{char name[16];int sex;struct linkr *next; };struct links{char filename[16];struct linkr *headlink;int length;struct links *next; };struct linkt{char filename[16];int flag;int length;struct linkr *headlink;struct linkt *next; };struct linkf mfd[5];struct links *ufd,*p2,*q2; struct linkr *p,*q;struct linkt *afd = NULL,*p3,*q3;char X[16],s,username[16]; int r,i,w,n,m,j,t,flag;void print1();void print2();void print3();void pcreate();void popen();//打开void pclose();//关闭void pdelete();//删除void pread();//读取void pwrite();//写void close();//关闭bool afdSearch(char* fileName);//寻找打开文件是否打开bool ufdSearch(char* fileName);//寻找文件是否存在void insertRecord(linkt* Pointer,linkr* Node);//插入记录bool pwriter(char* fileName,int recordNumber);//写记录,用于读的修改linkt* afdPosition(char* fileName);//定位afd中fileName所在的结点,返回该结点指针linkt* afdPositionForDel(char* fileName);//定位afd中fileName所在结点的前驱,返回该前驱的指针links* ufdPosition(char* fileName);//定位ufd中fileName所在的结点,返回该结点指针links* ufdPositionForDel(char* fileName);//定位ufd中fileName所在结点的前驱,返回该前驱的指针bool pdeleter(char* fileName,int recordNumber);//删除记录,用于读文件中的删除bool pcloser(char* fileName);//用于删除中的关闭/*********************************************///打开文件表查找函数//这个函数有个参数-----要查找的文件的名字//当文件打开,这个函数返回真//否则返回假bool afdSearch(char* fileName){linkt* searchPointer = (linkt*)malloc(sizeof(linkt));searchPointer = afd;bool result = false;//结果,若找到它为trueif(afd==NULL){return result;}while(!result){if(strcmp(fileName,searchPointer->filename)==0){result = true;return result;}else if(searchPointer->next == NULL) return result;//查找到最后一个结点没有找到返回searchPointer = searchPointer->next;}return result;}/**********************************************///这个函数用来定位查找文件在打开文件中的位置//这个函数有个参数-----要查找的文件的名字//他返回这个文件在打开文件链表中的位置linkt* afdPosition(char* fileName){linkt* searchPointer = (linkt*)malloc(sizeof(linkt));searchPointer = afd;bool result = false;//结果,若找到它为truewhile(!result){if(strcmp(fileName,searchPointer->filename)==0){return searchPointer;//找到后参数指针等于查找指针}else searchPointer = searchPointer->next;}return searchPointer;}/*****************************************************///////bool pcloser(char* fileName){linkt* afdTempPointer = (linkt*)malloc(sizeof(linkt));//用来定位读取记录在打开文件表的中位置links* ufdTempPointer = (links*)malloc(sizeof(links));linkt* afdDelPointer = (linkt*)malloc(sizeof(linkt));if(afdSearch(fileName)){afdTempPointer = afdPosition(fileName);//定位记录在打开文件表中的位置afdDelPointer = afdPositionForDel(fileName);if(strcmp(afd->filename,X)==0){//删除第一个打开文件afd = afd->next;free(afdTempPointer);return true;}if(afdTempPointer->next!=NULL){//删除打开文件链表的中间结点afdDelPointer->next = afdTempPointer->next;free(afdTempPointer);return true;}if(afdTempPointer->next==NULL){//删除最后一个结点afdDelPointer->next = NULL;free(afdTempPointer);return true;}}else return false;return false;}/******************************************************/links* ufdPositionForDel(char* fileName){links* searchPointer = (links*)malloc(sizeof(links));searchPointer = ufd;if(ufd->next==NULL||strcmp(fileName,ufd->filename)==0) return searchPointer;while(true){if(strcmp(searchPointer->next->filename,fileName)==0){ return searchPointer;}else searchPointer = searchPointer->next;}}/****************************************************/ //这个函数用来定位文件在用户文件链表中的位置//这个函数有一个参数-----要查找的文件的名字//它返回这个文件在用户文件链表中的位置links* ufdPosition(char* fileName){links* searchPointer = (links*)malloc(sizeof(links));searchPointer = ufd;while(true){if(strcmp(searchPointer->filename,fileName)==0){return searchPointer;}else {if(searchPointer->next!=NULL)searchPointer = searchPointer->next;}}}/*****************************************************/ bool ufdSearch(char* fileName){links* searchPointer = (links*)malloc(sizeof(links));searchPointer = ufd;while(true){if(strcmp(searchPointer->filename,fileName)==0){return true;}else {if(searchPointer->next==NULL) return false;searchPointer = searchPointer->next;}}}/*****************************************************///这个函数用来定位查找文件的前驱节点的位置//它有一个参数----要查找的文件的名字//它返回该文件在打开文件链表中前驱结点的位置linkt* afdPositionForDel(char* fileName){linkt* searchPointer = (linkt*)malloc(sizeof(linkt));searchPointer = afd;if(searchPointer->next==NULL||strcmp(fileName,afd->filename)==0) return searchPointer;//只有一个打开文件bool result = false;//结果,若找到它为truewhile(!result){if(strcmp(fileName,searchPointer->next->filename)==0){return searchPointer;//找到后参数指针等于查找指针}else searchPointer = searchPointer->next;}return searchPointer;}/*****************************************************///在文件记录链表中插入记录//该函数需要一个结点作为参数//该函数将参数结点插入链表的末尾void insertRecord(linkt* Pointer,linkr* Node){if(Pointer->headlink == NULL){Pointer->headlink = Node;p = Pointer->headlink;q = Pointer->headlink;return;}else{if(Pointer->headlink->next==NULL&&Pointer->length==1){Pointer->headlink->next = Node;q = Pointer->headlink->next;}else{q->next = Node;q = Node;}}}//写文件函数void pwrite(){linkt* afdTempPointer = (linkt*)malloc(sizeof(linkt));printf("Input the file's name you want to write:");scanf("%s",X);if(afdSearch(X)){//如果该文件已经打开linkr* newRecord = (linkr*)malloc(sizeof(linkr));afdTempPointer = afdPosition(X);printf("Input name:");scanf("%s",newRecord->name);//写记录信息nameprintf("Input sex:(1-man/other -woman)");scanf("%d",&newRecord->sex);//写记录信息sexnewRecord->next = NULL;insertRecord(afdTempPointer,newRecord);afdTempPointer->flag = 1;afdTempPointer->length++;}else cout<<"文件没有被打开"<<endl;//如果文件没有打开,那么直接返回}/*************************************************************************///写文件函数,用于其他功能调用//他包含一个参数,即要写的文件的名字//当写成功时候返回真//当文件没有打开,则返回假bool pwriter(char* fileName,int recordNumber){linkt* afdTempPointer = (linkt*)malloc(sizeof(linkt));linkr* recordSearchPointer = (linkr*)malloc(sizeof(linkr));int counter = 0;if(afdSearch(fileName)){//如果该文件已经打开afdTempPointer = afdPosition(fileName);recordSearchPointer = afdTempPointer->headlink;for(counter = 1;counter<=afdTempPointer->length;counter++){//查找记录if(counter==recordNumber){//当前的计数和查找的号码相同表示查找的是当前结点break ;}else recordSearchPointer = recordSearchPointer->next;//否则查找下个结点}printf("Input name:");scanf("%s",recordSearchPointer->name);//写记录信息nameprintf("Input sex:(1-man/other -woman)");scanf("%d",&recordSearchPointer->sex);//写记录信息sexafdTempPointer->flag = 1;return true;}else return false;//如果文件没有打开,那么直接返回}/************************************************************************/linkt* afdTempPointer = (linkt*)malloc(sizeof(linkt));//用来定位读取记录在打开文件表的中位置linkr* recordSearchPointer = (linkr*)malloc(sizeof(linkr));//用来查找记录的指针int recordNumber = 0;int counter = 0;char option;printf("Input the file name that you want to read\n");scanf("%s",X);if(afdSearch(X)){//如果文件打开cout<<"Input the number of the record"<<endl;scanf("%d",&recordNumber);//读取记录号if(recordNumber <= 0){cout<<"recordNumber must over 0"<<endl;//记录号不能小于等于0return ;}afdTempPointer = afdPosition(X);//定位记录在打开文件表中的位置if(recordNumber>afdTempPointer->length){//如果查询记录的号码大于文件长度表明该记录不存在cout<<"The record does not exist"<<endl;return ;}recordSearchPointer = afdTempPointer->headlink;for(counter = 1;counter<=afdTempPointer->length;counter++){//查找记录if(counter==recordNumber){//当前的计数和查找的号码相同表示查找的是当前结点cout<<"name: "<<recordSearchPointer->name<<endl;//输出信息cout<<"sex: "<<recordSearchPointer->sex<<endl;cout<<"希望对记录进行修改吗?"<<endl<<"(E/e-Edit)(D/d -Delete)(any other to ignore)";//询问是否修改记录cin>>option;if(option=='E'||option=='e')pwriter(X,recordNumber);if(option=='D'||option=='d')pdeleter(X,recordNumber);return ;}else recordSearchPointer = recordSearchPointer->next;//否则查找下个结点}}else cout<<"文件没有被打开"<<endl;}/************************************************************************/printf("Input the file name that you want to close\n");scanf("%s",X);linkt* afdTempPointer = (linkt*)malloc(sizeof(linkt));//用来定位读取记录在打开文件表的中位置links* ufdTempPointer = (links*)malloc(sizeof(links));linkt* afdDelPointer = (linkt*)malloc(sizeof(linkt));if(afdSearch(X)){afdTempPointer = afdPosition(X);//定位记录在打开文件表中的位置if(afdTempPointer->flag==1){ufdTempPointer = ufdPosition(X);ufdTempPointer->length = afdTempPointer->length;ufdTempPointer->headlink = afdTempPointer->headlink;}afdDelPointer = afdPositionForDel(X);if(strcmp(afd->filename,X)==0){//删除第一个打开文件afd = afd->next;free(afdTempPointer);cout<<"文件"<<X<<"已经关闭"<<endl;return ;}if(afdTempPointer->next!=NULL){//删除打开文件链表的中间结点afdDelPointer->next = afdTempPointer->next;free(afdTempPointer);cout<<"文件"<<X<<"已经关闭"<<endl;return ;}if(afdTempPointer->next==NULL){//删除最后一个结点afdDelPointer->next = afdTempPointer->next;free(afdTempPointer);cout<<"文件"<<X<<"已经关闭"<<endl;return ;}}else cout<<"文件没有打开不需要关闭"<<endl;;}void pdelete(){printf("Input the file name that you want to delete\n");scanf("%s",X);links* ufdTempPointer = (links*)malloc(sizeof(links));links* ufdTempPointerForDel = (links*)malloc(sizeof(links));if(pcloser(X)) //看X文件在afd表中是否存在,存在返回真cout<<"文件"<<X<<"已经关闭"<<endl; //返回真执行else cout<<"文件没有打开,直接进行删除"<<endl;//返回假执行if(ufdSearch(X)){//如果X存在于ufd表ufdTempPointer = ufdPosition(X);//定位删除文件在链表中的位置ufdTempPointerForDel = ufdPositionForDel(X);//定位删除文件在链表中位置的前驱if(strcmp(ufd->filename,X)==0){ //删除第一个文件ufd = ufd->next;//头指针指向它的下一个free(ufdTempPointer);cout<<"文件已经删除"<<endl;return ;}if(ufdTempPointer->next!=NULL){//删除中间文件ufdTempPointerForDel->next = ufdTempPointer->next;//前驱指向其后驱free(ufdTempPointer);//释放空间cout<<"文件已经删除"<<endl;return ;}if(ufdTempPointer->next==NULL){//删除最后一个文件ufdTempPointerForDel->next = NULL;//前驱指向其后驱,最后结点后驱固定为空free(ufdTempPointer);cout<<"文件已经删除"<<endl;return ;}}else cout<<"ERROR:你选择了不存在的文件"<<endl;}/***********************************************************///这个函数用来在删除功能中关闭将要删除的文件//它还有一个参数,也就是将要删除的文件名//他返回一个bool类型的值,若参数对应文件打开返回真,否则返回假bool pdeleter(char* fileName,int recordNumber){linkt* afdTempPointer = (linkt*)malloc(sizeof(linkt));//用来定位读取记录在打开文件表的中位置linkr* recordSearchPointer = (linkr*)malloc(sizeof(linkr));linkr* recordSearchPointerForDel = (linkr*)malloc(sizeof(linkr));int counter = 1;if(afdSearch(fileName)){//如果该文件已经打开afdTempPointer = afdPosition(fileName);recordSearchPointer = afdTempPointer->headlink;recordSearchPointerForDel = afdTempPointer->headlink;for(counter = 1;counter<=afdTempPointer->length;counter++){//查找记录if(counter==recordNumber){//当前的计数和查找的号码相同表示查找的是当前结点break ;}else recordSearchPointer = recordSearchPointer->next;//否则查找下个结点}if(afdTempPointer->length>1&&recordNumber>1){for(counter = 1;counter<=afdTempPointer->length;counter++){//查找记录if(counter==recordNumber-1){//当前的计数和查找的号码减一相同表示查找的是当前结点前驱break ;}else recordSearchPointerForDel = recordSearchPointerForDel->next;//否则查找下个结点}}cout<<"正在删除记录...."<<endl;if(recordNumber==1){ //删除第一个打开文件afdTempPointer->headlink = afdTempPointer->headlink->next;free(recordSearchPointer);afdTempPointer->length--;afdTempPointer->flag = 1;cout<<"记录删除成功"<<endl;return true;}if(recordNumber<afdTempPointer->length){ //删除打开文件链表的中间结点recordSearchPointerForDel->next = recordSearchPointer->next;free(recordSearchPointer);afdTempPointer->length--;afdTempPointer->flag = 1;cout<<"记录删除成功"<<endl;return true;}if(recordNumber==afdTempPointer->length){ //删除最后一个结点q = recordSearchPointerForDel;recordSearchPointerForDel->next = recordSearchPointer->next;free(recordSearchPointer);afdTempPointer->length--;afdTempPointer->flag = 1;cout<<"记录删除成功"<<endl;return true;}}else return false;//如果文件没有打开,那么直接返回return false;}/***********************************************************************/void print1(){int i;printf("\n MFD:\n");printf("----------------\n");for(i=0;i<n;i++){printf("| %s",mfd[i].username);printf("\n----------------\n");}}void print2(){int i;for(i=0;i<n;i++)if (flag==i && ufd!=NULL){printf("\n MFD__[%s]\n",mfd[i].username);p2=mfd[i].next;printf("+_UFD-Filename_+_ Length _+\n");while(p2!=NULL){printf("|%10s | %4d |\n",p2->filename,p2->length);p2=p2->next;printf("+--------------+--------------+\n");}}if(ufd==NULL) printf("\nUFD_[%s] is NULL\n",username);if(afd!=NULL){p3=afd;printf("\n\nAFD_[%s]\n",username);printf("+-----Filename-----+----length---+\n");while(p3!=NULL){printf("|%12s | %d |\n",p3->filename,p3->length);p3=p3->next;printf("+------------------|-------------+\n");}}else printf("\n\nAFD_[%s] is NULL\n",username);}void print3(){int i;char sex[8];p3=afd;printf("Input printing-filename:"); scanf("%s",X);if(p3!=NULL){while((strcmp(p3->filename,X)!=0)&&(p3->next!=NULL))if(strcmp(p3->filename,X)!=0)printf("The file hasn't opened!\n");elseif(p3->headlink==NULL) printf("The file is NULL!\n");else {p=p3->headlink; i=1;printf("| num | name | sex |\n");printf("---------------------------------------\n");while (p!=NULL){if(p->sex==1) strcpy(sex,"man");else strcpy(sex,"woman");printf("|%5d |%10s | %6s |\n",i,p->name,sex);i++; p=p->next;printf("---------------------------------------\n");}}}else printf("The file hasn't opened!\n");}void pcreate(){printf("Input create filename:");scanf("%s",X);q2=ufd;if(q2!=NULL){while((strcmp(q2->filename,X)!=0)&&(q2->next!=NULL))q2=q2->next;if(strcmp(q2->filename,X)==0){printf("File has already been created!\n");return;}}p2=(struct links *)malloc(sizeof(struct links));if(ufd==NULL) ufd=p2; else q2->next=p2;strcpy(p2->filename,X);p2->length=0; p2->next=NULL; p2->headlink=NULL;printf("Create File Finished!\n");}void popen(){p2=ufd;printf("Input Open filename:");scanf("%s",X);if(p2!=NULL){while((strcmp(p2->filename,X)!=0)&&(p2->next!=NULL))if(strcmp(p2->filename,X)==0){q3=afd;if(afd!=NULL){while((strcmp(q3->filename,X)!=0)&&(q3->next!=NULL))q3=q3->next;if(strcmp(q3->filename,X)==0){printf("The file \"%s\" has been opened.\n",X);return;}}p3=(struct linkt *)malloc(sizeof(struct linkt));if(afd==NULL) afd=p3; else q3->next=p3;strcpy(p3->filename,X);p3->length=p2->length;p3->headlink=p2->headlink;p3->flag=0;p3->next=NULL;printf("The file \"%s\"has been opened.\n",X);return;}}printf("Can't find \"%s\" file in \"%s\" USER.\n",X,username);}void close(){while (afd!=NULL){p3=afd; afd=afd->next; p2=ufd;while(strcmp(p2->filename,p3->filename)!=0&&p2->next!=NULL) p2=p2->next;if(strcmp(p2->filename,p3->filename)==0&&p3->flag==1){p2->length=p3->length; p2->headlink=p3->headlink;}free(p3);}}void main(){afd=NULL; ufd=NULL;for (i=0;i<5;i++){strcpy(mfd[i].username," ");mfd[i].next=NULL;}printf("User number N(N<=5)=");scanf("%d",&n);for(i=0;i<n;i++){w=0;printf("User MFD username X[%d]=",i+1);scanf("%s",X);for (j=0;j<n;j++)if (strcmp(mfd[j].username,X)==0)w=1;if(w==0) strcpy(mfd[i].username,X);else{printf("\nThe Username has been Created!\n");i--;}}do{print1();do{printf("Input user name you want to operate:");scanf("%s",username);for(i=0;(i<n&&(strcmp(mfd[i].username,username)!=0));i++);if(i>=n) {printf("Not found Username!\n");}}while(i>=n);t=0; flag=i; ufd=mfd[i].next;do{printf("\n------------------------------------\n");printf(" 1--Creat 2--Open 3--Delete\n");printf(" 4--cLose 5--Read 6--Write\n");printf(" 7--disPlay 8--fileplay 9--Quit\n");printf("------------------------------------\n");printf(" Select[ ]\b\b");scanf("%s",&s);switch(s){case '1':pcreate();break;case '2':popen();break;case '3':pdelete();break;case '4':pclose();break;case '5':pread();break;case '6':pwrite();break;case '7':print2();break;case '8':print3();break;case '9':t=1;close();}mfd[i].next=ufd;} while(!t);printf("\n---------------------------------------\n");printf("| 1--Edit other user , 2--Quit |\n" );printf("---------------------------------------\n");printf(" Select[ ]\b\b");scanf("%d",&m);if(m==2) r=1;else r=0;} while(!r);}。

数据结构课程设计(附代码)

数据结构课程设计(附代码)

应用技术学院课程设计报告课程名称《数据结构课程设计》设计题目猴子选大王;建立二叉树;各种排序;有序表的合并;成绩管理系统;院系计算机科学与信息工程专业计算机科学与技术班级学号指导教师日期一.目的与要求1. 巩固和加深对常见数据结构的理解和掌握2. 掌握基于数据结构进行算法设计的基本方法3. 掌握用高级语言实现算法的基本技能4. 掌握书写程序设计说明文档的能力5. 提高运用数据结构知识及高级语言解决非数值实际问题的能力二.课程设计容说明1. 项目一(1) 对设计任务容的概述学生成绩管理**任务:要现对学生资料的录入、浏览、插入和删除等功能。

输入:设学生成绩以记录形式存储,每个学生记录包含的信息有:学号和各门课程的成绩,设学生成绩至少3门以上。

存储结构:采用线性链式结构。

(2) 详细设计LinkList *create():输入学生成绩记录函数;void print(LinkList *head):显示全部记录函数LinkList *Delete(LinkList *head):删除记录函数LinkList *Insert(LinkList *head):插入记录函数void menu_select():菜单选择void ScoreManage():函数界面(3) 程序流程图(4) 程序模块及其接口描述该程序可以分为以下几个模块:1、菜单选择:void menu_select();提供五种可以选择的操作,在main函数过switch语句调用菜单menu_select()函数,进入不同的功能函数中完成相关操作。

2、输入功能:LinkList *create();通过一个for循环语句的控制,可以一次完成无数条记录的输入。

并将其存入链表。

3、输出功能:void print(LinkList *head);通过一个while的循环控制语句,在指针p!=NULL时,完成全部学生记录的显示。

知道不满足循环语句,程序再次回到菜单选择功能界面。

数据结构课程设计+24点游戏源代码

数据结构课程设计+24点游戏源代码

课程设计课程设计名称:数据结构课程设计专业班级:学生姓名:学号:指导教师:课程设计时间:计算机科学与技术专业课程设计任务书1.需求分析24点游戏主要有两个功能:(1)用户记算24点程序随机产生四个1-13的数,分别代表4张牌, 提示用户输入算式。

如果用户认为程序给出的一组数字不能算出24点(如1,1,2,2),则输入‘?’,然后程序对这四个数字进行计算,如果真的不能算出24点,则输出用户正确的信息,否则给出一个正确的算式,并显示用户错误的信息。

(2).程序计算24点用户输入四个1-13的数,代表4张牌,程序需要通过一定的规则添加括号和运算符来使算式的值等于24,如果用户给出的四个数字不能算出24点,则输出错误信息!2.概要设计○1抽象数据结构定义:ADT{数据对象:D={a|a为大于0小于14的整数}push(sqstack *s,int e) //压栈gettop(sqstack *s) //取得栈顶元素pop(sqstack *s,int *e) //出栈randomm() //产生四个随机数EvaluateExpression(char* MyExpression)//课本算法3.4---计算表达式的值init_sq(sqlist *l) //初始化链表insert_sq(sqlist **p,int e,int bl) //链表插入操作chang(char *s,sqlist *l) //将用户的输入转化为单链表check(sqlist l) //保证输入的数字是给出的四个数字Operate(int a,int theta, int b) //计算precede(char Aop, char Bop) //求运算符优先级ReturnOpOrd(char op,char* TestOp) //返回运算符优先级CalcOneExpress(int expression[][2])//课本算法3.4--计算表达式的值Calc24(int number[2][4])//包含下面五个函数,即表达式的五种形式CalcArray1(int iNumInput[2][4])// a * b * c * d //7 个字符CalcArray2(int iNumInput[2][4])// (a * b) * c * d //9 numberCalcArray3(int iNumInput[2][4])// (a * b * c) * d //9 numberCalcArray4(int iNumInput[2][4])// (a * b) * (c * d) //11 numbersCalcArray5(int iNumInput[2][4])// ((a * b) * c) * d //11 numbersEqual24(int n) //判定结果是否等于24gameinformation() //游戏介绍menu() //菜单main() //主函数}ADT○2模块划分3 运行环境硬件环境:PC机软件环境:Windows XPMicrosoft Visual C++ 6.04 开发工具和编程语言开发工具:Microsoft Visual C++ 6.0 编程语言:C语言5 详细设计(1)全局变量和栈,链表的定义int number[2][4];enum{eNumber = 0,//操作数eOperator = 1//算子};int oper[7]={43,45,42,47,40,41,35};课本表3.1 算符间的优先关系:unsigned char Prior[7][7] = {'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','='};线性表的定义:typedef struct sqlist{int bol; //bol是0时,num-ch是数字;bol是1时num_ch是运算符int num_ch;struct sqlist *next;}sqlist;栈的定义:typedef struct sqstack{int *base;int *top;int stacksize;}sqstack;(2)main()函数及用户界面void main(){gameinformation(); //输出作者信息menu(); //输出功能菜单,游戏开始}用户界面如图1 所示。

数据结构课程设计报告及源代码

数据结构课程设计报告及源代码
printf("\n\t**********************************************************\n");
printf("\t1.车辆到达--1 2.车辆离开--2 3.车辆信息--3 4.退出程序--4\n");
printf("\t**********************************************************\n");
4、要求栈以顺序结构实现,队列以链表实现
三、设计要求
1、独立完成全部代码的设计、编写、调试与部署,运行正确无误
2、编写设计报告书
设计报告书应包括:
(1)问题描述和系统要求
(2)系统主要功能模块设计
(3)设计中遇到的问题及其解决方法
(4)系统运行报告
(5)总结
问题描述:
设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排以便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场时,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。
typedef struct node
{ int num;
int reachtime;
int leavetime;

数据结构课程设计(串的查找与替换源代码)

数据结构课程设计(串的查找与替换源代码)
{
j++;
k++;
}
if(findString[k]=='\0')
return i; //比较结束,返回欲查找的最后一个字符匹配的位置
}
return -1;
}
//从指定的下标开始插入target数组的元素
void Insert(char source[],int index,char target[]) //source[]用来存储源字符串String,target[]用于存储欲替换的字符串,index是开始找到的位置
{
int pos,b=0;
printf("输入被ห้องสมุดไป่ตู้换的字符串:");
scanf("%s",&findString);
printf("输入要替换的字符串(且保证其长度与被替换字符串一致):");
scanf("%s",&replaceString);
do
{
{
String[b]=String[b+strlen(findString)];
b++;
}
String[b]='\0';
Insert(String,pos,replaceString);
}
pos=FindString();
break;
case 4:
Save();
exit(0);
default:
printf("\n输入错误!\n");
printf("按任意键返回....\n");

数据结构课程设计代码

数据结构课程设计代码

#include<iostream.h>#include<stdio.h>#include<malloc.h>#define MAX 25typedef struct{char data;int weight;int parent;int lchild;int rchild;} HTNode;typedef struct{char cd[MAX];int start;} HuffmanCode;int main(){HTNode ht[2*MAX];HuffmanCode hcd[MAX], d;int i, k, f, l, r, n, c, s1, s2;cout<<"\t哈夫曼编码与译码系统\n";cout<<"\n请输入哈夫曼码元素个数:";cin>>n;cout<<"请输入各个元素的结点值与权值:\n";for(i=1;i<=n;i++){cout<<" 第"<<i<<"个元素-->\n\t结点值:";cin>>&ht[i].data;cout<<"\t权值:";cin>>ht[i].weight;}for(i=1;i<=2*n-1;i++)ht[i].parent=ht[i].lchild=ht[i].rchild=0;for(i=n+1;i<=2*n-1;i++){s1=s2=32767;l=r=0;for(k=1;k<=i-1;k++)if(ht[k].parent==0)if(ht[k].weight<s1){s2=s1;r=l;s1=ht[k].weight;l=k;}else if(ht[k].weight<s2){s2=ht[k].weight;r=k;}ht[l].parent=i;ht[r].parent=i;//得到新结点,删除l.r,将l,r的双亲域由0改为iht[i].weight=ht[l].weight+ht[r].weight;//i的权值等于左右孩子之和ht[i].lchild=l; ht[i].rchild=r; //l,r为i的左右孩子}for(i=1;i<=n;i++){d.start=n+1;//start开始时指向最后,即编码结束符位置c=i;f=ht[i].parent;//f指向结点c的双亲结点while(f!=0)//从叶子结点开始向上回溯,知道根结点{if(ht[f].lchild==c) d.cd[--d.start]='0';//结点c是f的左孩子,则生成代码0elsed.cd[--d.start]='1'; //结点c是f的左孩子,则生成代码1c=f;f=ht[f].parent;//继续向上回溯}hcd[i]=d;//为第i个字符编码分配空间}cout<<"输出哈夫曼编码:\n";for(i=1;i<=n;i++){cout<<ht[i].data<<": ";for(k=hcd[i].start;k<=n;k++)cout<<hcd[i].cd[k];cout<<"\n";}l: cout<<"\n请选择编码/译码/退出系统: (B/Y/E): ";char hfm;cin>>hfm;if(hfm=='e')return 0;else{switch(hfm)case'b':{int q ;char bs;cout<<"\n哈夫曼编码\n";cout<<"请输入字符代码: "<<endl;for(q=0;bs!=10;q++){bs=getchar();for(i=1;i<=n;i++){if (bs==ht[i].data)for(k=hcd[i].start;k<=n;k++)cout<<hcd[i].cd[k];}}cout<<endl;} break;case'y':{char e;int t,u;t=2*n-1;cout<<"\n哈夫曼译码\n";cout<<"\n请输入哈夫曼码: "<<endl;for(u=0;e!=10;u++){if(ht[t].lchild!=0){e=getchar();if(e=='0')t=ht[t].lchild;elset=ht[t].rchild;}else{cout<<ht[t].data;t=2*n-1;}}cout<<endl;} break;goto l;}return 0; } //Huffman。

数据结构课程设计源代码(完整版)

数据结构课程设计源代码(完整版)

算法与数据结构课程设计报告设计题目:专业班级学生学号指导教师2014年第1学期第一部分:需求分析1、系统名称:航空客运订票系统航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。

要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。

2、要求:(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、订票量)以及等候替补的客户名单(包括姓名、所需票量)。

(2)作为模拟系统,全部数据可以只存放在内存中。

(3)通过此系统可以实现如下功能:①录入功能:可以录入航班情况②查询功能:根据客户提供的终点站名进行查询,可以输出以下信息:航班号、飞机号、星期几飞行和余票量等。

也可以根据航班号,查询飞机某个航线的情况。

③订票功能:根据客户提出的要求(姓名、终点站名、订票数量)查询该航班的余票量情况。

如尚有足够的余票,则为客户办理订票手续;若已满员或余票量少于订票数量,则需要重新询问客户要求,如需要,可登记排队候补。

④退票功能:根据客户提供的情况(姓名、日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,若有人排队,则为排在第一位的客户办理订票手续。

第二部分:系统设计图样一:设计说明1:添加航班:整个航班的信息保存在一个结构体flight中,采用结构体数组,每一个航班信息包含航班号、起飞时间、起飞城市、降落时间、降落城市、余票数量。

航班信息通过lulu()函数进行添加。

添加的信息保存在航班flight结构体数组中。

2:查询航班:查询板块分为两个部分,按姓名查找和按站名查找。

按姓名查找:通过所输入的姓名和已定客户的姓名相匹配,匹配成功则查找成功。

按站名查找:通过所输入的起始站名和终点站名进行匹配,匹配成功则查找成功。

3:订票功能:根据用户的姓名和航班号进行订票,如果所查找的航班号的余票满足用户需要的票数,则订票成功,该信息保存在Customer中,才用结构体数组,包含已定客户的姓名、客户ID、订的票数、起飞时间、起飞城市、降落时间、降落城市、航班号。

数据结构课程设计报告 (附有完整可运行出来的代码)

数据结构课程设计报告 (附有完整可运行出来的代码)

课程设计报告设计题目:公园导游图一、流程图二、程序代码#include<iostream>using namespace std;#include<stdio.h>typedef struct //定义图结构{int n; /* 图的顶点个数*/char v[100]; /* 顶点信息*/int e[100][100]; /* 边信息*/int shor; /* 最短路径信息*/}park;park *luru(park *x){int j,k;cout<<"请输入公园景点个数"<<endl;cin>>x->n;if(x->n<=0){cout<<"个数输入错误,请重新输入"<<endl;cin>>x->n;}cout<<"请输入景点名称,每个名称只允许一个字符代替"<<endl;for(j=0;j<x->n;j++)cin>>x->v[j];cout<<"请输入景点之间的路径长度,只允许整数型数值,无路径长度的输入0"<<endl;for(j=0;j<x->n;j++)for(k=0;k<x->n;k++){cout<<"请输入第"<<j+1<<"行"<<"第"<<k+1<<"列的路径长度"<<endl;cin>>x->e[j][k];}return x;}int search(park *x){char start,end,temp;int i=0,j=0,temp_1,temp1=10000;cout<<"请输入要查找的起始景点名称"<<endl;cin>>start;while(i<x->n && start!=x->v[i])i++;if(i==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}cout<<"请输入要查找的终点景点名称"<<endl;cin>>end;while(j<x->n && end!=x->v[j]){j++;if(j==x->n){cout<<"没有找到该景点,按任意键返回"<<endl;return 0;}}x->shor=x->e[i][j];temp_1=x->e[i][j];for (int k=0;k<x->n;k++)//两个顶点最小权值判断{if (x->e[i][k]==0||x->e[k][j]==0 )continue;if(x->shor > x->e[i][k] + x->e[k][j]){x->shor = x->e[i][k] + x->e[k][j];temp=x->v[k];}}if(x->shor==0){cout<<"这两个节点中没有连通路,按任意键返回"<<endl;return 0;}if(x->shor==temp_1){cout<<"最短路径信息: "<<start<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;if(x->shor<temp_1 && x->shor<=temp1){cout<<"最短路径信息: "<<start<<"->"<<temp<<"->"<<end<<endl<<"最小路径长度:"<<x->shor<<endl;x->shor=10000;getchar();return 1;}cout<<"查找失败,按任意键返回"<<endl;getchar();return 0;}int main(){park x;int i=1;luru(&x);do{search(&x);cout<<"是否继续?"<<endl<<"1.继续"<<endl<<"0.退出"<<endl;cin>>i;}while(i!=0);return 0;}三、运行结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<iostream.h>#include<string.h>#include<fstream.h>#include<stdlib.h>#include<iomanip.h>class student{ private:char name[20]; //姓名double cpro,english,math,sport,law,hbpro,computer;//课程int order, number; //名次,学号public:student(){}student(char n[20],int nu,double cc,double eng,double ma,double sp,double l,double hb,double com){strcpy(name,n);number=nu;cpro=cc; english=eng;math=ma;sport=sp;law=l;hbpro=hb;computer=com;}friend void main();};void main(){cout<<" 欢迎进入**学生成绩管理系统**!"<<endl;cout<<" ******************************************"<<endl;cout<<" **** 学生成绩管理系统****"<<endl;cout<<" ******************************************"<<endl;cout<<" **************************"<<endl;cout<<" **0、输入数据**"<<endl;cout<<" **1、增加数据**"<<endl;cout<<" **2、修改数据**"<<endl;cout<<" **3、按姓名查询**"<<endl;cout<<" **4、按学号查询**"<<endl;cout<<" **5、输出所有学生的成绩**"<<endl;cout<<" **6、退出系统**"<<endl;cout<<" **************************"<<endl;cout<<" 选择0-6数字进行操作"<<endl;char p;char w;student *s[50]; //指针对象,最多存50个学生数据ofstream *file[50]; //负责对文件插入操作int i=0;int j=0;do //flag判断输入是否有效{cin>>p;if((p>='0'&&p<='6'))flag=1;elsecout<<" 指令错误!请重新输入:"<<endl;}while(flag==0);do{switch(p) //接收功能选项{case '0': //输入数据{char c;char name[20];int number;double cpro,english,math,sport,law,hbpro,computer;do{cout<<" 请输入姓名:";cin>>name;cout<<endl<<" 请输入学号:";cin>>number;cout<<" 请输入C++成绩:";cin>>cpro;cout<<endl<<" 请输入英语成绩:";cin>>english;cout<<endl<<" 请输入数学成绩:";cin>>math;cout<<endl<<" 请输入体育成绩:";cin>>sport;cout<<endl<<" 请输入网络基础成绩:";cin>>law;cout<<endl<<" 请输入C语言成绩:";cin>>hbpro;cout<<endl<<" 请输入数据库成绩:";cin>>computer;cout<<endl;file[j]=new ofstream("D:\document",ios::ate);*file[j]<<" 姓名"<<name<<" 学号"<<number<<" C++成绩"<<cpro<<" 英语成绩"<<english<<" 数学成绩"<<math<<" 体育成绩"<<sport<<" 网络基础成绩"<<law<<" C成绩"<<hbpro<<" 数据库成绩"<<computer<<endl;j++;s[i]=new student(name, number,cpro,english,math,sport,law,hbpro,computer);cout<<" 数据输入成功,想继续输入吗(y/n):";cin>>c;cout<<endl;do{if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl<<" ";cin>>c;}elseflag=1;}while(flag==0);}while(c=='y');break;}case '1': //增加数据{char name[20];int number;double cpro,english,math,sport,law,hbpro,computer; char c;do{cout<<" 请输入您要增加的学生的姓名:";cin>>name;cout<<endl<<" 请输入学号:";cin>>number;cout<<endl<<" 请输入C++成绩:";cin>>cpro;cout<<endl<<" 请输入英语成绩:";cin>>english;cout<<endl<<" 请输入数学成绩:";cin>>math;cout<<endl<<" 请输入体育成绩:";cin>>sport;cout<<endl<<" 请输入网络基础成绩:";cin>>law;cout<<endl<<" 请输入C语言成绩:";cin>>hbpro;cout<<endl<<" 请输入数据库成绩:";cin>>computer;cout<<endl;file[j]=new ofstream("d:\document",ios::ate);*file[j]<<" 姓名"<<name<<" 学号"<<number<<" C++成绩"<<cpro<<" 英语成绩"<<english<<" 数学成绩"<<math<<" 体育成绩"<<sport<<" 网络基础成绩"<<law<<" C成绩"<<hbpro<<" 数据库成绩"<<computer<<endl;j++;s[i]=new student(name, number, cpro,english,math,sport,law,hbpro,computer);i++;cout<<" 数据输入成功,想继续数入吗(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl<<" ";cin>>c;}}while(c=='y');break;}case '2': //修改数据{char name[20];int nu;double cc,eng,ma,sp,l,hb,com;flag=0;char c;if(i==0){cout<<" 管理系统中没有输入数据!"<<endl;break;}do{cout<<" 请输入您要修改的学生的姓名:";cin>>name;cout<<endl;for(int h=0;h<i;h++) //h纪录要修改学生的位置{if(strcmp(name,s[h]->name)==0){flag=1;cout<<" 请输入新的学号:";cin>>nu;cout<<endl<<" 请输入C++成绩:";cin>>cc;cout<<endl<<" 请输入英语成绩:";cin>>eng;cout<<endl<<" 请输入数学成绩:";cin>>ma;cout<<endl<<" 请输入体育成绩:";cin>>sp;cout<<endl<<" 请输入网络基础成绩:";cin>>l;cout<<endl<<" 请输入C语言成绩:";cin>>hb;cout<<endl<<" 请输入数据库成绩:";cin>>com;cout<<endl;s[h]->cpro=cc;s[h]->english=eng;s[h]->math=ma;s[h]->sport=sp;s[h]->law=l;s[h]->hbpro=hb;s[h]->computer=com;s[h]->number=nu;cout<<" 数据修改成功!"<<endl;}}if(flag==0){cout<<" 您要修改的学生本来就不存在!请检查重新输入!"<<endl;}cout<<" 想继续修改吗(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl<<" ";cin>>c;}}while(c=='y');break;}case '3': //按姓名查询{char n[20];int j=0;char c;if(i==0){cout<<" 管理系统中没有输入数据!"<<endl;break;}do{int flag=0;cout<<" 请输入你要查询的学生姓名:";cin>>n;cout<<endl;for(int j=0;j<i;j++){if(strcmp(n,(*s[j]).name)==0){flag=1;cout<<" 您要查询的学生是:"<<(*s[j]).name<<endl;cout<<(*s[j]).name<<"的成绩是: "<<" C++: "<<(*s[j]).cpro<<" 英语: "<<(*s[j]).english<<" 数学:"<<(*s[j]).math<<" 体育:"<<(*s[j]).sport<<" 法律:"<<(*s[j]).law<<" C:"<<(*s[j]).hbpro<<" 数据库"<<(*s[j]).computer<<endl;}}if(flag==0)cout<<" 对不起!您要查询的学生不存在!"<<endl;cout<<" 您想继续查询吗?(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl;cin>>c;}}while(c=='y');break;}case '4': //按学号查询{int n,j=0;char c;if(i==0){cout<<" 管理系统中没有输入数据!"<<endl;break;}do{int flag=0;cout<<" 请输入你要查询的学生的学号:";cin>>n;cout<<endl;for(int j=0;j<i;j++){if(s[j]->number==n){flag=1;cout<<" 您要查询的学生是:"<<(*s[j]).name<<endl;cout<<(*s[j]).name<<"的成绩是: "<<" C++:"<<(*s[j]).cpro<<" 英语:"<<(*s[j]).english<<" 数学:"<<(*s[j]).math<<" 体育:"<<(*s[j]).sport<<" 法律:"<<(*s[j]).law<<" C:"<<(*s[j]).hbpro<<" 数据库"<<(*s[j]).computer<<endl;}}if(flag==0)cout<<" 对不起!您要查询的学生不存在!"<<endl;cout<<" 您想继续查询吗?(y/n):";cin>>c;cout<<endl;if(c!='y'&&c!='n'){cout<<" 指令错误!请重新输入!"<<endl;cin>>c;}}while(c=='y');break;}case '5': //输出{cout<<" 本系统所有学生数据如下:"<<endl;if(i==0)cout<<" 管理系统中没有输入数据!"<<endl;cout<<" 姓名学号c++ 英语数学体育网络基础C语言数据库"<<endl;for(int k=0;k<i;k++){cout<<s[k]->name<<setw(7)<<s[k]->number<<setw(6)<<(*s[k]).cpro<<setw(6)<<(*s[k]).english<<setw(6)<<(*s[k]).math<<setw(6)<<(*s[k]).sport<<setw(7)<<(*s[k]).law<<setw(10)<<(*s[k]).hbpro<<setw(10)<<(*s[k]).computer<<setw(10)<<endl;}break;}case'6'://退出{exit(0); cout<<"Bye bye!"<<endl;}}cout<<" 您想继续进行其他操作吗?(y/n):";int flag=0;do{cin>>w;cout<<endl;if(w!='y'&&w!='n')cout<<" 指令错误!请重新输入!"<<endl;elseflag=1;}while(flag==0);if(w=='y')cout<<" 请输入操作代码:0 输入数据"<<endl;cout<<" 1 增加数据"<<endl;cout<<" 2 修改数据"<<endl;cout<<" 3 按姓名查询"<<endl;cout<<" 4 按学号查找"<<endl;cout<<" 5 输出所有学生成绩"<<endl; cout<<" 6 退出系统"<<endl; cin>>p;}while(w=='y');}。

相关文档
最新文档