数据结构课程设计 文章编辑 源代码
数据结构课设报告规范 数据结构课设 Python课程设计 源代码 实验报告 源码 世界杯查询系统
Ssize=0;
}
~lnkStack(){
clear();
}
void clear(){
while(top!=NULL){
Link<T> *tmp=top;
top=top->next;
delete tmp;
}
Ssize=0;
}
bool SisEmpty(){
if(Ssize==0)
return true;
世界杯查询系统
一.【需求分析】
1.输入
1.1.1输入来自3个文本文件.
1.1.2c.txt用于输出比赛的详细信息,如两队的队名,比分,进球球员姓名,进球时间等。
1.1.3file.txt用于输出对阵时间表。
1.1.4射手榜存档.txt用于存放进球球员的信息(姓名,国籍,进球数初始均设为1)。
2.输出
{
// TODO: Add your control notification handler code here
int point1;//比赛国家1比分
int point2;//比赛国家2比分
lnkList<xinxi> jinqiu;//比赛详细比分存入队列名为jinjiu,类定义为xinxi的队列中
};
2.1.2信息类
class xinxi{
public:
string time;
string country;
按下“某场比赛”则会在下方编辑框显示该场比赛的详细信息。
按下“射手榜”则会在下方编辑框显示该届世界杯结束后的射手榜。
按下“退出系统”则会清空编辑框以便下次输入。
二【数据结构设计】
数据结构课程设计报告含代码完整版
数据结构课程设计报告含代码HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】西安邮电学院数据结构课程设计报告题目:校园导航系统院系名称:计算机学院专业名称:计算机科学与技术班级:学生姓名:学号(8位):指导教师:设计起止时间:2011年12月11日~2011年12月15日一. 设计目的1.通过本次课程设计巩固《数据结构》中所学的内容;2.提高自己上机编程以及调试能力。
二. 设计内容1.设计所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
2.为来访客人提供图中任意景点相关信息的查询。
3.为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
三.概要设计1.功能模块图;2.各个模块详细的功能描述。
1. 可以手动创建一个校园图。
2. 可以直接从文件读取校园各个景点的信息。
3. 可选择从任意个景点作为起点进行遍历。
4. 输入景点序号查询该景点相关信息。
5. 输入两个景点查询两个景点的最短,最佳及其所有的路径。
6. 将校园图信息保存入文件。
四.详细设计1.功能函数的调用关系图2.各功能函数的数据流程图1. Adjmatrix *g即结构体对象在main()中被创建在其他子函数中进行参数传递。
2. 全局变量visited数组中用。
3. 全局变量shorest[][],path[][]在floyd()中被赋值来分别记录v[i]-v[j]最短路径和 v[i]-v[j]所经过景点。
3.重点设计及编码两景点最短距离弗洛伊德算法void floyd(adjmatrix *g){int i,j,k;for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++)shortest[i][j]=0;for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++){shortest[i][j]=g->arcs[i][j].adj;path[i][j]=0;}for(i=0;i<g->vexnum;i++)for(j=0;j<g->vexnum;j++)for(k=0;k<g->vexnum;k++)if(shortest[i][j]>(shortest[i][k]+shortest[k][j])){shortest[i][j]=shortest[i][k]+shortest[k][j];path[i][j]=k;path[j][i]=k;}}五.测试数据及运行结果1.正常测试数据和运行结果要求提供3组正常测试数据和运行结果2(遍历功能)1(起始景点序号)1 校门呈长方形,校训:爱国、求实、奋进2 喷泉呈鸽子形状,喷射出水花3 教学楼传授知识和学习知识4 实验楼供学生进行课程实验和教师办公5 洗浴中心供学生洗澡,内设单人间和双人间6 美食广场仅一层,快餐味道不错7 图书馆共七层,存储大量书籍供学生查阅和学习8 旭日苑共三层,主要的就餐场所9 体育馆内设篮球场,羽毛球场和观看席10 宿舍休息的场所5(查询景点信息)2(景点序号)2 喷泉呈鸽子形状,喷射出水花6(查询两景点最短路径)1 9(两景点序号)1->2->7->91->9 最短距离:570米2.异常测试数据及运行结果要求提供2组异常测试数据和运行结果9无此功能模块请重新输入5(功能模块)11(景点序号)无此景点请重新输入六.调试情况,设计技巧及体会1.改进方案1. 可将景点文件,边文件及账户密码合并为一个文件。
数据结构课程设计报告模板(内附C代码)
数据结构课程设计报告学院专业:软件工程班级:学号:学生姓名:指导老师:彭伟民日期: 2016.01.01目录1猴子吃桃子问题 (3)1.1 需求分析 (3)1.2 程序设计思想 (3)1.3 程序源代码 (3)1.4 程序运行结果 (5)2进制数转化问题 (5)2.1 需求分析 (5)2.2 程序设计思想 (6)2.3 程序源代码 (6)2.4 程序运行结果 (7)3长整数运算 (8)3.1 需求分析 (8)3.2 程序设计思想 (8)3.3 程序源代码 (8)3.4 程序运行结果 (12)4学生成绩管理系统 (13)4.1 需求分析 (13)4.2 程序设计思想 (13)4.3 程序源代码 (14)4.4 程序运行结果 (20)5哈夫曼编码应用 (22)5.1 需求分析 (22)5.2 程序设计思想 (22)5.3 程序源代码 (23)5.4 程序运行结果 (24)6学校超市选址问题 (26)6.1 需求分析 (26)6.2 程序设计思想 (26)6.3 程序源代码 (26)6.4 程序运行结果 (30)7学生成绩管理系统 (30)7.1 需求分析 (30)7.2 程序设计思想 (30)7.3 程序源代码 (30)7.4 程序运行结果 (36)8排序综合 (37)8.1 需求分析 (37)8.2 程序设计思想 (38)8.3 程序源代码 (38)8.4 程序运行结果 (46)9课程设计总结 (47)1猴子吃桃子问题1.1需求分析有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
1.2程序设计思想已知第十天只余下1个桃子,第一天开始每天都吃当前桃子一半再多一个,那么就只需要从第十天开始倒推即可,用链表、数组、递推、常规方法都可以采用这种思路实现计算第一天桃子数量。
1.3程序源代码#include<iostream>using namespace std;//有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
数据结构课设(完整代码可直接运行)附注释
char adjvex;//最小生成树的节点
int lowcost;//到该节点的最小权值开销
}closedges[MAX_VERTEX_NUM];
int option; //图的类型标识符
int visited[MAX_VERTEX_NUM]; //顶点访问标记数组
for(i=1;i<=G.vexnum;++i) {//输入矩阵的各顶点
fflush(stdin); //清除缓存,略过
scanf("%c",&G.vexs[i]);
}//for
if(G.kind==DG||G.kind==UDG){//1.有向图和无向图的矩阵创建
for(i=1;i<=G.vexnum;i++)//矩阵初始化
if(!S.base) return ERROR;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;
}
*S.top++=e;
return OK;
}
/*·················元素出栈··········*/
int Pop(SqStack &S,int &e){
··········*/
int LocateVex(ALGraph G,char v){
int m;
for(m=1;m<=G.vexnum;m++){
if(G.vertices[m].data==v) return m;
}
printf("您输入的顶点不存在");
数据结构与算法课程设计源程序
程序:#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")```这个代码示例实现了一个简单的链表数据结构,在命令行中提供了添加元素、删除元素和显示元素的选项。
数据结构课程设计源代码(完整版)
算法与数据结构课程设计报告设计题目:专业班级学生学号指导教师2014年第1学期第一部分:需求分析1、系统名称:航空客运订票系统航空客运订票的业务活动包括:查询航线、客票预定和办理退票等。
要求在TC或VC环境下设计一个航空客运订票系统,以使上述业务可以借助计算机来完成。
2、要求:(1)每条航线所涉及的信息有:终点站名、航班号、飞机号、飞行日期(星期几)、乘员定额、余票量、已经订票的客户名单(包括姓名、订票量)以及等候替补的客户名单(包括姓名、所需票量)。
(2)作为模拟系统,全部数据可以只存放在内存中。
(3)通过此系统可以实现如下功能:①录入功能:可以录入航班情况②查询功能:根据客户提供的终点站名进行查询,可以输出以下信息:航班号、飞机号、星期几飞行和余票量等。
也可以根据航班号,查询飞机某个航线的情况。
③订票功能:根据客户提出的要求(姓名、终点站名、订票数量)查询该航班的余票量情况。
如尚有足够的余票,则为客户办理订票手续;若已满员或余票量少于订票数量,则需要重新询问客户要求,如需要,可登记排队候补。
④退票功能:根据客户提供的情况(姓名、日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,若有人排队,则为排在第一位的客户办理订票手续。
第二部分:系统设计图样一:设计说明1:添加航班:整个航班的信息保存在一个结构体flight中,采用结构体数组,每一个航班信息包含航班号、起飞时间、起飞城市、降落时间、降落城市、余票数量。
航班信息通过lulu()函数进行添加。
添加的信息保存在航班flight结构体数组中。
2:查询航班:查询板块分为两个部分,按姓名查找和按站名查找。
按姓名查找:通过所输入的姓名和已定客户的姓名相匹配,匹配成功则查找成功。
按站名查找:通过所输入的起始站名和终点站名进行匹配,匹配成功则查找成功。
3:订票功能:根据用户的姓名和航班号进行订票,如果所查找的航班号的余票满足用户需要的票数,则订票成功,该信息保存在Customer中,才用结构体数组,包含已定客户的姓名、客户ID、订的票数、起飞时间、起飞城市、降落时间、降落城市、航班号。
数据结构课程设计字典序(源代码)..
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#define NULL 0#define ERROR -1#define stack_in_size 100#define stackincrement 10struct TreeNode /*树结点*/{char ch;int number; /*以该字符为结束的单词出现的个数*/struct TreeNode* pt[26]; /*指向后继的字母的26个指针*/};struct TreeNode *root;typedef struct TreeNode *Link_TreeNode;struct MAX_TEN /*存放出现频率最高的十个单词数据结构*/{char STRING[35];int count; /*字符串出现的次数*/int xiabao; /*字符数组位置的下标*/};struct MAX_TEN MAX[10];struct MAX_TEN MIN;struct DocumentNode /*文件结点*/{char ch; /*存放某个单词的一个字符*/int number; /*以该字符为结束的单词出现的个数*/ struct DocumentNode* pt[26]; /*指向后继的字母的26个指针*/struct Locationn *next; /*连接以该字符为结束的单词所在的位置*/ };typedef struct DocumentNode *Link_DocumentNode;Link_DocumentNode ROOT[301]; /*300个根节点指针,零号单元不用*/ struct Locationn /*单词在文件中的位置*/{int num;struct Locationn *next;};struct WORD /*单词链表结构*/{char strr[35];struct WORD *next;};typedef struct{char *base;char *top;int stacksize;}SQSTACK;SQSTACK S,T;SQSTACK Creat() /*创建空栈*/{SQSTACK s;s.base=(char*)malloc(stack_in_size*sizeof(char));s.top=s.base;s.stacksize=stack_in_size;return s;} /*全局变量栈*/char pop(SQSTACK &s) /*出栈*/{char e;if(s.top==s.base)return ERROR;e=*(--s.top);return e;}void push(SQSTACK &s,char e) /*入栈*/{if(s.top-s.base>=s.stacksize){ s.base=(char*)realloc(s.base,(s.stacksize+stackincrement )*sizeof(char));s.top=s.base+s.stacksize;s.stacksize+=stackincrement;}*s.top=e;s.top=s.top+1;}int isempty(SQSTACK s) /*判断栈是否为空*/{if(s.base==s.top)return 1;elsereturn 0;}Link_TreeNode creat() /*创建树结点,并返回指向该节点的指针*/ {int i;Link_TreeNode pt;pt=(Link_TreeNode)malloc(sizeof(TreeNode));pt->number=0;for(i=0;i<26;i++)pt->pt[i]=NULL;return pt;}void CREAT_DicTree() /*创建字典树*/{root=creat();Link_TreeNode q;FILE *fp;char *p;int ctmp;int jieshu;char str[35]; /*存放从文件中读入的单词*/ if((fp=fopen("vocabulary.txt","r"))==NULL)printf("cannot open vocabulary.txt\n");while(1){jieshu=fscanf(fp,"%s",str);/*从文件中读入字符串*/q=root;if(jieshu==-1)break;else{p=str;while(*p!='\0'){ctmp=*p-97;if(q->pt[ctmp]!=NULL)q=q->pt[ctmp];else{q->pt[ctmp]=creat();q=q->pt[ctmp];q->ch=*p;}p++;if(*p=='\0'){q->number++;break;}}}}}int Search(char str[],Link_TreeNode root) /*在字典树中搜索字符串str,并返回其出现的次数不存在时返回次数为0*/{int count,ctmp;char *p;p=str;Link_TreeNode q;q=root;while(*p!='\0'){ctmp=*p-97;if(q->pt[ctmp]==NULL){count=0; /*不存在时count置为0*/break;}else{q=q->pt[ctmp];p++;if(*p=='\0')count=q->number;}}return count;}Link_TreeNode Get_Last_Link(char str[]){int k;char *p;Link_TreeNode q=root;p=str;T.top=T.base;S=Creat();while(*p!='\0') /*前缀存入栈S中*/{push(S,*p);p++;}p=str;while(*p!='\0'){k=*p-97;if(q->pt[k]==NULL){q=q->pt[k];break;}else{q=q->pt[k]; /*指针q指向的结点中字符为当前*p的字符值*/p++;}}return q;}bool OutPrint(Link_TreeNode p,FILE *fp) /*递归将指针p所指的结点的指针数组所指向的所有单词写入文件中*/{int k;char temp;Link_TreeNode q;for(k=0;k<26;) /*扫描26个指针*/{if(p->pt[k]==NULL)k++;else{q=p->pt[k];push(S,q->ch);if(q->number>0) /*输出该单词*/{while(!isempty(S)){temp=pop(S);push(T,temp); /*将栈S中的元素全部弹入T栈中*/}char shuzu[35];char tempp[2];shuzu[0]='\0';while(!isempty(T)) /*逐个将T栈中元素弹入S栈中*/{tempp[0]=pop(T);tempp[1]='\0';strcat(shuzu,tempp);push(S,tempp[0]);}fprintf(fp,"%s\n",shuzu);/*将出现的该单词写入文件中*/}OutPrint(q,fp); /*递归调用*/pop(S);k++;}}if(k==26)return true; /*没有后继指针*/}void RECHANGE_MIN(char tepp[],int cunt) /*数组中保存的十个最大的单词*/{strcpy(MAX[MIN.xiabao].STRING,tepp);MAX[MIN.xiabao].count=cunt;int k;MIN=MAX[0];for(k=1;k<10;k++){if(MIN.count>MAX[k].count)MIN=MAX[k];}}bool GOT_MAX_TEN(Link_TreeNode p)/*递归得到指针p所指的结点的指针数组所指向的所有单词中出现次数最高的十个单词*/{int k;char temp;Link_TreeNode q;for(k=0;k<26;) /*扫描26个指针*/{if(p->pt[k]==NULL)k++;else{q=p->pt[k];push(S,q->ch);if(q->number>0){if(q->number>MIN.count){while(!isempty(S)){temp=pop(S);push(T,temp);}char shuzu[35];char tempp[2];shuzu[0]='\0';while(!isempty(T)){tempp[0]=pop(T);tempp[1]='\0';strcat(shuzu,tempp);push(S,tempp[0]);}RECHANGE_MIN(shuzu,q->number);}}GOT_MAX_TEN(q);pop(S);k++;}}if(k==26)return true;}Link_DocumentNode CREAT()/*创建一个文件型的数据结构结点,并返回指向该节点的指针*/{int i;Link_DocumentNode p;p=(Link_DocumentNode)malloc(sizeof(struct DocumentNode));p->number=0;for(i=0;i<26;i++){p->pt[i]=NULL;}p->next=NULL; /*文件初始化*/return p;}void CREAT_DocumentTree() /*读入文件,创建文件树*/{Link_DocumentNode q;struct Locationn *LL;FILE *fp;char *p;int ctmp;int jieshu;int Location; /*定位单词在文章中的位置*/int k;char str[35]; /*存放从文件中读入的单词*/if((fp=fopen("Document.txt","r"))==NULL)printf("cannot open Document.txt\n");while(1){jieshu=fscanf(fp,"%s",str);if(jieshu==-1)break; /*文件中单词已读完*/if(!strcmp(str,"Document")){fscanf(fp,"%d",&k);ROOT[k]=CREAT();Location=1;fscanf(fp,"%s",str);}q=ROOT[k];p=str;while(*p!='\0') /*处理每个单词*/{ctmp=*p-97;if(q->pt[ctmp]!=NULL)q=q->pt[ctmp];else{q->pt[ctmp]=CREAT();q=q->pt[ctmp];q->ch=*p;}p++;if(*p=='\0'){q->number++;if(q->next==NULL){LL=(struct Locationn *)malloc(sizeof(struct Locationn));LL->num=Location;q->next=LL;LL->next=NULL;Location++;break;}else{LL=q->next;while(LL->next!=NULL)LL=LL->next;LL->next=(struct Locationn *)malloc(sizeof(struct Locationn));LL=LL->next;LL->next=NULL;LL->num=Location;Location++;break;}}}}}int Search_Doc(char str[],Link_DocumentNode root)/*在文件树中搜索字符串str,不存在时返回次数为0,存在返回其出现的次数*/{int count,ctmp;char *p;p=str;Link_DocumentNode q;q=root;while(*p!='\0') /*逐个扫描该字符串中的每个字符*/{ctmp=*p-97;if(q->pt[ctmp]==NULL){count=0;break;}else{q=q->pt[ctmp];p++;if(*p=='\0')count=q->number;}}return count;}void SORT_MAX_Ten() /*对出现频率最高的十个单词从大到小排序*/ {int i,j,temp;struct MAX_TEN ctmp;for(i=0;i<9;i++) /*选择排序*/{temp=i;for(j=i+1;j<10;j++)if(MAX[temp].count<MAX[j].count)temp=j;if(temp!=i){ctmp=MAX[temp];MAX[temp]=MAX[i];MAX[i]=ctmp;}}}struct WORD *Creat_two_word_link(char str1[],char str2[]){struct WORD *head,*tempary,*pt;tempary=head=NULL;char ttmp[35];char *p,*q;int count;for(count=1;count<=2;count++){ /*扫描两个单词*/if(count==1)p=str1;else{p=str2;}q=ttmp;while(*p!='\0'){*q=*p;p++;q++;}*q='\0';pt=(struct WORD *)malloc(sizeof(struct WORD));strcpy(pt->strr,ttmp);if(head==NULL) /*扫描第一个单词的情况*/{tempary=head;}else /*扫描第二个单词的情况*/{tempary->next=pt;tempary=pt;}}tempary->next=NULL;return head;}struct WORD *Creat_multi_word_link(int length,FILE *fp){char ttmp[35];char string[35]; /*存放读入是的字符串*/int count;char *p;char *q;struct WORD *head,*pt,*tempary;tempary=head=NULL; /*对指针进行初始化*/ for(count=1;count<=length;count++){fscanf(fp,"%s",string);p=string;q=ttmp;while(*p!='\0'){*q=*p;p++;q++;}*q='\0';pt=(struct WORD *)malloc(sizeof(struct WORD));strcpy(pt->strr,ttmp);if(head==NULL){head=pt;tempary=head;}else{tempary->next=pt;}}tempary->next=NULL;return head;}void Search_Match_Word(struct WORD *head,int length,FILE *fp){Link_DocumentNode q;int circle;int ctmp;struct WORD *point;struct Locationn *list1;struct Locationn *list2;list1=(struct Locationn*)malloc(sizeof(struct Locationn));list2=(struct Locationn*)malloc(sizeof(struct Locationn));list2->next=NULL;struct Locationn *pt1;struct Locationn *pt2;struct Locationn *pt3;int i;char *p;for(circle=0;circle<=300;){nextcircle:circle++;if(circle>300)break; /*文件树扫描结束*/ for (i=1,point=head->next;i<=length;i++){ /*逐个扫描从文件中读入的n个字符串*/p=point->strr; /*指向当前扫描的该字符串的首地址*/q=ROOT[circle]; /*q指向第circle个文件数*/while (*p!='\0'){ctmp=*p-97;if(q->pt[ctmp]==NULL)goto nextcircle;else{ /*存在时继续在文件树中扫描直到该单词的结尾*/q=q->pt[ctmp];}p++;if(*p=='\0'){if(i==1)list1->next=q->next;else{pt1=list1->next;while (pt1!=NULL){pt2=q->next;while (pt2!=NULL){if(pt1->num+1!=pt2->num)pt2=pt2->next;else{pt3=list2;while (pt3->next!=NULL)pt3=pt3->next;pt3->next=(struct Locationn *)malloc(sizeof(struct Locationn));pt3=pt3->next;pt3->num=pt2->num;pt3->next=NULL;pt2=pt2->next;}}pt1=pt1->next;}//whilelist1->next=list2->next;if(list1->next==NULL)goto nextcircle;list2->next=NULL;}//else}}point=point->next; /*扫描该字符串的下一个单词*/}if(list1->next!=NULL){fprintf(fp,"%d ",circle);}list2->next=NULL;}//circle}void OPEN_SearchWordInV ocabulary() /*生成SearchWordInV ocabulary_Result.txt*/ {FILE *fp1;FILE *fp2;char str[35];int count; /*存放查找该单词时出现的次数*/int k=1;int jieshu; /*结束判断的标志*/if((fp1=fopen("SearchWordInV ocabulary.txt","r"))==NULL)printf("cannot open SearchWordInV ocabulary.txt\n");if((fp2=fopen("SearchWordInVocabulary_Result.txt","w"))==NULL)printf("cannot write SearchWordInV ocabulary_Result.txt\n");jieshu=fscanf(fp1,"%s",str); /*文件读取结束的标志*/while(jieshu!=-1){fprintf(fp2,"%s %d:\n","CASE",k);k++;count=Search(str,root);if(count==0)fprintf(fp2,"%s\n","NO");elsefprintf(fp2,"%d\n",count);jieshu=fscanf(fp1,"%s",str);}fclose(fp1);fclose(fp2);}void OPEN_TotPrefixWord() /*生成TotPrefixWord_Result.txt*/{FILE *fp1;FILE *fp2;char str[35];int count;int k=1;int jieshu;Link_TreeNode p_link;if((fp1=fopen("TotPrefixWord.txt","r"))==NULL)printf("cannot open SearchWordInV ocabulary.txt\n");if((fp2=fopen("TotPrefixWord_Result.txt","w"))==NULL)printf("cannot write SearchWordInV ocabulary_Result.txt\n");jieshu=fscanf(fp1,"%s",str); /*读入一个单词*/while(jieshu!=-1){fprintf(fp2,"%s %d:\n","CASE",k);k++;p_link=Get_Last_Link(str); /*找到在单词树中指向该单词最后一个字符的指针*/if(p_link!=NULL){fprintf(fp2,"%s\n",str);OutPrint(p_link,fp2);}jieshu=fscanf(fp1,"%s",str); /*从文件中读入下一个单词*/ }fclose(fp1);fclose(fp2);}void OPEN_PrefixFrequence() /*生成PrefixFrequence_Result.txt*/{FILE *fp1;FILE *fp2;char str[35];int count;int k=1;int i;int jieshu;Link_TreeNode p_link;if((fp1=fopen("PrefixFrequence.txt","r"))==NULL)printf("cannot open SearchWordInVocabulary.txt\n");if((fp2=fopen("PrefixFrequence_Result.txt","w"))==NULL)printf("cannot write SearchWordInV ocabulary_Result.txt\n");jieshu=fscanf(fp1,"%s",str); /*从文件中读入一个该单词*/ while(jieshu!=-1){fprintf(fp2,"%s %d:\n","CASE",k);k++;p_link=Get_Last_Link(str);if(p_link!=NULL){for(i=0;i<10;i++){MAX[i].xiabao=i;MAX[i].count=0;}MIN=MAX[0];GOT_MAX_TEN(p_link);SORT_MAX_Ten();if(p_link->number>0){for(i=0;i<10;i++){if(MAX[i].count==0){strcpy(MAX[i].STRING,str);MAX[i].count=p_link->number;break;}}}SORT_MAX_Ten();for(i=0;i<10;i++){if(MAX[i].count>0){fprintf(fp2,"%s %d\n",MAX[i].STRING,MAX[i].count);}}}jieshu=fscanf(fp1,"%s",str);}fclose(fp1);fclose(fp2);}void OPEN_MostFrequenceWord() /*生成MostFrequenceWord.txt*/ {FILE *fp;int k;for(k=0;k<10;k++){MAX[k].xiabao=k;MAX[k].count=0;}MIN=MAX[0];if((fp=fopen("MostFrequenceWord.txt","w"))==NULL)printf("cannot write MostFrequenceWord.txt\n");S=Creat();GOT_MAX_TEN(root);SORT_MAX_Ten();for(k=0;k<10;k++)if(MAX[k].count>0)fprintf(fp,"%s %d\n",MAX[k].STRING,MAX[k].count);fclose(fp);}void main(){printf("*****************基本型问题************************\n");CREAT_DicTree();/*第一题,读入vocabulary文件,建立存放单词的字典树*/printf("The First problem has been solved,a dictionary tree has been buildt\n");OPEN_SearchWordInVocabulary();/*第二题,生成SearchWordInV ocabulary_Result.txt*/ printf("The Second problem has been solved,SearchWordInVocabulary_Result.txt formed \n"); printf("*****************扩展型问题************************\n");OPEN_TotPrefixWord();/*第三题,生成TotPrefixWord_Result.txt*/printf("The Third problem has been solved,TotPrefixWord_Result.txt formed \n");OPEN_PrefixFrequence();/*第四题,生成PrefixFrequence_Result.txt*/printf("The Forth problem has been solved,PrefixFrequence_Result.txt formed \n");OPEN_MostFrequenceWord();/*第五题,生成MostFrequenceWord.txt*/printf("The Fifth problem has been solved,MostFrequenceWord.txt formde\n");printf("*****************高级型问题************************\n");CREAT_DocumentTree();/*第六题,读入Document文件,建立存放文件的树*/printf("The Sixth problem has been solved,WordInDocument_Result.txt formed\n");}。
数据结构课程设计报告(附源代码)-学生管理系统
课程设计报告(一)一.报告题目:学生管理系统二.实验目的: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()。
数据结构课本算法源代码
void Union(List &La, List Lb) { // 算法2.1// 将所有在线性表Lb中但不在La中的数据元素插入到La中int La_len,Lb_len,i;ElemType e;La_len = ListLength(La); // 求线性表的长度Lb_len = ListLength(Lb);for (i=1; i<=Lb_len; i++) {GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给eif (!LocateElem(La, e, equal)) // La中不存在和e相同的数据元素ListInsert(La, ++La_len, e); // 插入}} // unionvoid MergeList(List La, List Lb, List &Lc) { // 算法2.2// 已知线性表La和Lb中的元素按值非递减排列。
// 归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。
int La_len, Lb_len;ElemType ai, bj;int i=1, j=1, k=0;InitList(Lc);La_len = ListLength(La);Lb_len = ListLength(Lb);while ((i <= La_len) && (j <= Lb_len)) { // La和Lb均非空GetElem(La, i, ai);GetElem(Lb, j, bj);if (ai <= bj) {ListInsert(Lc, ++k, ai);++i;} else {ListInsert(Lc, ++k, bj);++j;}}while (i <= La_len) {GetElem(La, i++, ai); ListInsert(Lc, ++k, ai);}while (j <= Lb_len) {GetElem(Lb, j++, bj); ListInsert(Lc, ++k, bj);}} // MergeListStatus InitList_Sq(SqList &L) { // 算法2.3// 构造一个空的线性表L。
实验报告数据结构课程设计源代码
表达式类型的实现——实习报告一.需求分析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。
数据结构课程设计:文章编辑系统源代码
数据结构课程设计:文章编辑系统源代码#include"stdio.h"#include"string.h"#include"math.h"#include"malloc.h"#include#include#include"time.h"#include#include#include#include"stdlib.h"#pragma comment(lib,"WinMM.Lib")typedef struct Line{char data[100];//每行内容用这样一个结点存放struct Line *next;}Line,*Article;int m=0;//该全局变量用来改变系统所使用的语言..登录时默认语言为中文int times;//此全局变量为删除和替换字符串时使用int ii;//跟times同一功能int tt=0;int colori=1;int music=0;//设置系统颜色void color(){int col;col=colori;if(m!=1){printf("\t\t ¤1.黑底白字");printf("\t\t●2.蓝底红字\n");printf("\t\t ¤3.白底黑字");printf("\t\t●4.绿底红字\n");printf("\t\t ¤5.红底绿字");printf("\t\t●6.白底紫字\n");printf("\t\t ¤7.紫底白字");printf("\t\t●8.黑底黄字\n");printf("\t\t ¤9.黑底蓝字");printf("\t\t●10.黑底灰字\n");printf("\t\t ¤11.白底红字");printf("\t●0.返回\n\n");printf("\t 请输入你要更换的颜色并回车:"); scanf("%d",&colori);if(colori==0)colori=col;switch(colori){case 1:system("color 07");break;case 2:system("color 9c");break;case 3:system("color f0");break;case 4:system("color 2c");break;case 5:system("color c2");break;case 6:system("color fd");break;case 7:system("color df");break;case 8:system("color 0e");break;case 9:system("color 09");break;case 10:system("color 08");break;case 11:system("color fc");break;case 0:break;default:printf("\t\t输入错误!");system("pause");break;}}else{printf("\t ¤1.Black and White");printf("\t\t●2.Blue and Red\n");printf("\t ¤3.White and Black");printf("\t\t●4.Green and Red\n");printf("\t ¤5.Red and Green");printf("\t\t●6.White and purple\n");printf("\t ¤7.Purple and White");printf("\t●8.Black and Yellow\n");printf("\t ¤9.Black and Blue");printf("\t\t●10.Black and Gray\n");printf("\t ¤11.White and Red");printf("\t\t●0.Exit\n\n");printf("\t Please select the number of color and then preass enter:");scanf("%d",&colori);if(colori==0)colori=col;switch(colori){case 1:system("color 07");break;case 2:system("color 9c");break;case 3:system("color f0");break;case 4:system("color 2c");break;case 5:system("color c2");break;case 6:system("color fd");break;case 7:system("color df");break;case 8:system("color 0e");break;case 9:system("color 09");break;case 10:system("color 08");break;case 11:system("color fc");break;case 0:break;default:printf("\t\tERROR!");system("pause");break; }}}void restorecolor(){switch(colori){case 1:system("color 07");break;case 2:system("color 9c");break;case 3:system("color f0");break;case 4:system("color 2c");break;case 5:system("color c2");break;case 6:system("color fd");break;case 7:system("color df");break;case 8:system("color 0e");break;case 9:system("color 09");break;case 10:system("color 08");break;case 11:system("color fc");break;}}//从文件中读取void ReadFile(Article &head){Line *p,*tail=head;char s[100];FILE *fp;if((fp=fopen("D:\\article.txt","r"))==NULL)//先判断文章是否存在{if(m!=1)printf("\n\t\t无法读取article.txt文件中的文章!\n");elseprintf("\n\t\tthe file of article.txt can't be read!\n");return;}while((fgets(s,100,fp))!=NULL){s[strlen(s)-1]='\0';p=(Line*)malloc(sizeof(Line));p->next=NULL;strcpy(p->data,s);if(head==NULL)head=p;elsetail->next=p;tail=p;}if(m!=1)printf("\n\t\t已成功从D盘的article.txt目录中读取文章!\n");elseprintf("\n\t\tThe article in D:\article.txt has succeed to read!\n");fclose(fp);}//更改后保存到文件中void SaveArticle(Article head){FILE*fp;char s[100];int n;Line *p=head;if((fp=fopen("D:\\article.txt","w"))==NULL){if(m!=1)printf("\n\t\t无法打开article.txt文件中的文章!\n");elseprintf("\n\t\tCan not open file article.txt!\n");return;}while(p != NULL) //将文章写入文件中{strcpy(s,p->data);n=strlen(s);s[n]='\n';s[n+1]='\0';fputs(s,fp);p=p->next;}fclose(fp);}//是否要保存到文本中??...新建文章void CreateFile(Article head){FILE*fp;char s[100];int n;Line *p=head;if((fp=fopen("D:\\article.txt","w"))==NULL){if(m!=1)printf("\n\t\t无法打开article.txt文件中的文章!\n"); elseprintf("\n\t\tCan not open file article.txt!\n"); return;}while(p!=NULL) //将文章写入文件中{strcpy(s,p->data);n=strlen(s);s[n]='\n';s[n+1]='\0';fputs(s,fp);p=p->next;}if(m!=1)printf("\n\t\t文章已成功写入D盘的article.txt目录中!\n");elseprintf("\n\t\tThe article has been successfully written in the D:article.txt!\n");fclose(fp);}//是否现在输入内容在指定盘里存放该文章void CreateArticle(Article &head){Line *p,*tail;char ch[100];if(m!=1)printf("\n\t\t请输入文章内容(按ctrl+e结束):\n");elseprintf("\n\t\tPlease input the content,end with (ctrl+e):\n");while(1){gets(ch);p=(Line*)malloc(sizeof(Line));p->next=NULL;strcpy(p->data,ch);if(p->data[strlen(p->data)-1]==5) {p->data[strlen(p->data)-1]='\0'; break;}if(head==NULL){head=p;tail=p;}else{tail->next=p;tail=tail->next;}}if(strlen(p->data)>0){if(head==NULL){head=p;tail=p;}else{tail->next=p;tail=tail->next;}}}//是否保存文章到指定目录的文件void IsSave(Article head){char ch;if(m!=1)printf("\t\t是否要将文章保存到指定目录的文件中?\n\t\t若是,请输入Y,若否,按其它任意键:");elseprintf("\t\tDo you want to save the file to the directory?\n\t\tIf yes,please input Y,or input any keys:");ch=getchar();if(ch=='Y'||ch=='y')CreateFile(head);}//计算中文个数int CountChinese(Article head){int num=0;Line *p=head;int i;int n;while(p!=NULL){n=strlen(p->data);for(i=0;i<n;i++){if(p->data[i]<0)num++;}p=p->next;}return num/2;}//计算字母个数int CountLetter(Article head){int num=0;Line *p=head;int i;int n;while(p!=NULL){n=strlen(p->data);for(i=0;i<n;i++){if(('a'<=p->data[i]&&'z'>=p->data[i])||('A'<=p->data[i]&&' Z'>=p->data[i]))num++;}p=p->next;}return num;}//计算空格个数int CountSpace(Article head) {int num=0;Line *p=head;int i;int n;while(p!=NULL){n=strlen(p->data);for(i=0;i<n;i++){if(p->data[i]==' ')num++;}p=p->next;}return num;}//计算数字个数int CountFigure(Article head){int num=0;Line *p=head;int i;int n;while(p!=NULL){n=strlen(p->data);for(i=0;i<n;i++){if('0'<=p->data[i]&&p->data[i]<='9')num++;}p=p->next;}return num;}//计算总字数int CountArticle(Article head){int num=0;num=CountLetter(head)+CountSpace(head)+CountFigure(h ead)+CountChinese(head);return num;}//找串...统计某一字符串在文章中出现的次数,并输出该次数int FindString(Article head,char *s){int num=0;Line *p=head;int i,j,k=1,t;int n,mm;while(p!=NULL){n=strlen(p->data);mm=strlen(s);for(i=0;i<=(n-mm);){k=1;for(j=i,t=0;t<mm;j++,t++)if(p->data[j]!=s[t]){k=0;break;}if(k){num++;i=i+strlen(s);}else}p=p->next;}return num;}//删除模块(删除全部要删除的串)char* delstring1(char *ch,char *s) {int n=strlen(ch),mm=strlen(s); int i,j,k,t;for(i=0;i<=n-mm;){k=1;for(j=i,t=0;t<mm;j++,t++)if(ch[j]!=s[t]){k=0;break;}if(k){for(j=i;j<n;j++)ch[j]=ch[j+mm];ch[j]='\0';}elsen=strlen(ch);}return ch;}//全部删除void DeleteString1(Article &head,char *s){Line *p=head;while(p!=NULL){strcpy(p->data,delstring1(p->data,s));p=p->next;}if(m!=1)printf("\t\t全部已成功删除!\n");elseprintf("\t\tDelete all successfully!\n");}void delprint(char *ch,char *s){int i;int mm=strlen(s);char c[100];int k;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_G</n;j++)</mm;j++,t++)</mm;j++,t++)</n;i++)</n;i++)</n;i++)</n;i++)REEN);for(i=ii,k=0;i<ii+mm;i++,k++)c[k]=ch[i];c[k]='\0';printf("%s",c);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);}//判断该行是否出现该字符串,出现返回1int deljudge(char *ch,char *s){int n=strlen(ch),mm=strlen(s);int i,j,k,t;for(i=ii;i<=n-mm;i++){k=1;for(j=i,t=0;t<mm;j++,t++)if(ch[j]!=s[t])k=0;break;}if(k){times++;ii=i;return 1;}}return 0;}char* delstring2(char *ch,char *s) {int n=strlen(ch),mm=strlen(s); int i,j,k,t;for(i=ii;i<=n-mm;i++){k=1;for(j=i,t=0;t<mm;j++,t++)if(ch[j]!=s[t]){k=0;break;}if(k)for(j=i;j<n;j++)ch[j]=ch[j+mm];ch[j]='\0';ii=i;break;}}if(m!=1)printf("\t\t删除成功!\n");elseprintf("\t\tDelete successfully!\n");return ch;}//删除模块(删除一个指定位置要删除的串)void DeleteString2(Article &head,char *s){Line *p=head;int flag;char c;int mm=strlen(s);int i;ii=0;times=0;while(p!=NULL) //这里出现的问题应该还是读入问题1!!{flag=deljudge(p->data,s);if(flag)if(m!=1)printf("\t\t第%d次出现该字符串的所在行如下:\n",times);elseprintf("\t\tThe line that this string appears the %d time is:\n",times);for(i=0;i<ii;i++)printf("%c",p->data[i]);delprint(p->data,s);for(i=ii+mm;idata);i++)printf("%c",p->data[i]);printf("\n");if(m!=1)printf("\t\t是否要删除?\n\t\tY是,N否:");elseprintf("\t\tDelete or not?\n\t\tY to yes,N to no:");c=getchar(); getchar();if(c=='Y'||c=='y')strcpy(p->data,delstring2(p->data,s));elseii+=mm;printf("\n");if(m!=1)printf("\t\t是否要继续删除?\n\t\tY是,N否:");elseprintf("continue to delete?\n\t\tY to yes ,N to no:");c=getchar();getchar();if(c=='N'||c=='n')break;}else{p=p->next;ii=0;}}if(m!=1)printf("\t\t删除结束!\n");elseprintf("\t\tDeleting ends!\n");}//删除管理模块void deletemanage(Article &head,char *s){int choice;if(m!=1)printf("\t\t1.全部删除\n\t\t2.部分删除\n\n\t\t请选择:");elseprintf("1.Delete all\n 2.Delete sections\n\n\t\tPlease select:"); scanf("%d",&choice);getchar();if(choice==1)DeleteString1(head,s);elseDeleteString2(head,s);}//字符串替换//全部替换char* repstring1(char *ch,char *s1,char *s2) {int n,mm,x,y;int i,j,k,t;n=strlen(ch);mm=strlen(s1);for(i=0;i<=n-mm;){k=1;for(j=i,t=0;t<mm;t++,j++)if(ch[j]!=s1[t]){k=0;break;}if(k){x=strlen(s2);if(x<=mm){for(j=i,t=0;t<x;t++,j++)ch[j]=s2[t</x;t++,j++)</mm;t++,j++)</ii;i++)</n;j++)</mm;j++,t++)</mm;j++,t++)</ii+mm;i++,k++)];for(t=mm+i;j<n;j++,t++)ch[j]=ch[t];ch[j]='\0';}else{y=x-mm;for(t=n-1;t>=mm+i;t--)ch[t+y]=ch[t];ch[n+y]='\0';for(j=i,t=0;t<x;t++,j++)ch[j]=s2[t];}i=i+x;}elsei++;}return ch;}void ReplaceString1(Article &head,char *s1,char *s2)//s2替换s1{Line *p=head;while(p!=NULL){strcpy(p->data,repstring1(p->data,s1,s2));p=p->next;}if(m!=1)printf("\t\t全部已成功替换!\n");elseprintf("\t\tReplace all successfully!\n");}//部分替换void repprint(char *ch,char *s){int i;int mm=strlen(s);char c[100];int k;SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE), FOREGROUND_RED | FOREGROUND_GREEN);for(i=ii,k=0;i<ii+mm;i++,k++)c[k]=ch[i];c[k]='\0';printf("%s",c);SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HAN DLE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);}int repjudge(char *ch,char *s){int n=strlen(ch),mm=strlen(s);int i,j,k,t;for(i=ii;i<=n-mm;i++){k=1;for(j=i,t=0;t<mm;j++,t++)if(ch[j]!=s[t]){k=0;break;}if(k){times++;ii=i;return 1;}}return 0;}char* repstring2(char *ch,char *s1,char *s2) {int n,mm,x,y;int i,j,k,t;n=strlen(ch);mm=strlen(s1);for(i=ii;i<=n-m;i++){k=1;for(j=i,t=0;t<mm;t++,j++)if(ch[j]!=s1[t]){k=0;break;}if(k){x=strlen(s2);if(x<=mm){for(j=i,t=0;t<x;t++,j++)ch[j]=s2[t];for(t=mm+i;j<n;j++,t++)ch[j]=ch[t];ch[j]='\0';}else{y=x-mm;for(t=n-1;t>=mm+i;t--)ch[t+y]=ch[t];ch[n+y]='\0';for(j=i,t=0;t<x;t++,j++)ch[j]=s2[t];}ii=i+strlen(s2);break;}}if(m!=1)printf("\t\t替换成功!\n");elseprintf("\t\tReplace successfully!\n");return ch;}void ReplaceString2(Article &head,char *s1,char *s2)//s2替换s1{Line *p=head;int flag;char c;int i;int mm=strlen(s1);ii=0;times=0;while(p!=NULL){flag=repjudge(p->data,s1);if(flag){if(m!=1)printf("\t\t第%d次出现该字符串的所在行如下:\n",times);elseprintf("\t\tThe line that this string appears the %d time is:\n",times);for(i=0;i<ii;i++)printf("%c",p->data[i]);repprint(p->data,s1);for(i=ii+mm;idata);i++)printf("%c",p->data[i]);printf("\n");if(m!=1)printf("\t\t是否要替换?\n\t\tY是,N否:");elseprintf("\t\tReplace or not?\n\t\tY to yes ,N to no:");c=getchar(); getchar();if(c=='Y'||c=='y')strcpy(p->data,repstring2(p->data,s1,s2));elseii+=mm;printf("\n");if(m!=1)printf("\t\t是否要继续替换?\n\t\tY是,N否:");elseprintf("\t\tContinue to replace?\n\t\tY to yes ,N to no:");c=getchar();getchar(</ii;i++)</x;t++,j++)</n;j++,t++)</x;t++,j++)</mm;t++,j++)</mm;j++,t++)</ii+mm;i++,k++)</x;t++,j++)</n;j++,t++));if(c=='N'||c=='n')break;}else{p=p->next;ii=0;}}if(m!=1)printf("\t\t替换结束!\n");elseprintf("\t\tReplacing ends!\n");}void PrintArticle(Article head);//删除和替换结束后是否输出删除后或替换后的文章void IsPrint(int mm,Article head){char ch;if(mm==1){if(m!=1)printf("\t\t是否要输出续写后的文章?\n\t\tY是,N否:");elseprintf("\t\tDo you want to output the followed article?\n\t\tY to yes,N to no:");ch=getchar();if(ch=='Y'||ch=='y')PrintArticle(head);}if(mm==2){if(m!=1)printf("\t\t是否要输出替换后的文章?\n\t\tY是,N否:");elseprintf("\t\tDo you want to output the replaced article?\n\t\tY to yes,N to no:");ch=getchar();if(ch=='Y'||ch=='y')PrintArticle(head);}}//替换管理模块void replacemanage(Article &head,char *s1,char*s2){int choice;if(m!=1)printf("\t\t1.全部替换\n\t\t2.部分替换\n\n\t\t请选择:");elseprintf("\t\t1.Replace all\n\t\t2.Replace sections\n\n\t\tPlease select:");scanf("%d",&choice);getchar();if(choice==1)ReplaceString1(head,s1,s2);elseReplaceString2(head,s1,s2);}void PrintArticle(Article head){Line *p;int n,i;p=head;if(head==NULL){if(m!=1)printf("\t\t该文章中没有内容!\n");elseprintf("\t\tThe article is empty!\n"); }else{if(m!=1){ printf("\n\n\n ┎━━━━━━━━━━┒\n"); printf(" ┃ 该文章的内容如下┃\n"); printf(" ┖━━━━━━━━━━┚\n\n");}else{printf("\n\n\n ┎━━━━━━━━━━┒\n"); printf(" ┃ The article is ┃\n");printf(" ┖━━━━━━━━━━┚\n\n");}}while(p!=NULL){n=strlen(p->data);for(i=0;i<n;i++)printf("%c",p->data[i]);printf("\n");p=p->next;}}//追加模块void CatchArticle(Article &head){Line*p=head,*tail;char ch[100];if(m!=1)printf("\t\t请输入要续写的文章内容(按ctrl+e结束):\n");elseprintf("\t\tPlease input the content following with the article(end with ctrl+e):\n");if(head==NULL){CreateArticle(head);}else{while(p->next!=NULL)p=p->next;tail=p;while(1){gets(ch);p=(Line*)malloc(sizeof(Line));p->next=NULL;strcpy(p->data,ch);if(p->data[strlen(p->data)-1]==5){p->data[strlen(p->data)-1]='\0';break;}tail->next=p;tail=tail->next;}if(strlen(p->data)>0){tail->next=p;tail=tail->next;}}}void diaoshi();void menu(){int i;if(m!=1){if(tt!=0){printf("\n\n");diaoshi();printf("\n\n\n\</n;i++)n");}for(i=1;i<=19;i++)printf("★☆"); printf("\n☆ ★");printf("\n★ 这里是文章编辑系统☆"); printf("\n★ ☆\n");for(i=1;i<=19;i++)printf("☆★");printf("\n\n");printf("\t\t¤1.新建文章\t\t");printf("●2.读取文章\n");printf("\t\t¤3.输出文章\t\t");printf("●4.文章统计\n");printf("\t\t¤5.文章编辑\t\t");printf("●6.更改语言\n");printf("\t\t¤7.选择颜色\t\t");printf("●8.帮助说明\n");//关于系统使用的介绍说明及关于我们的团队介绍printf("\t\t¤9.背景音乐");printf("\t\t●0.返回\n");printf("\n");}else{if(tt!=0){printf("\n\n");diaoshi();printf("\n\n\n\n");}for(i=1;i<=19;i++)printf("☆★");printf("\n★ ☆");printf("\n☆ This is article editing system ★");printf("\n☆ ★\n");for(i=1;i<=19;i++)printf("★☆");printf("\n\n");printf("\t¤1.creat a new article\t\t");printf("●2.read the article\n");printf("\t¤3.output the article\t\t");printf("●4.article statistic\n");printf("\t¤5.edit the article\t\t");printf("●6.change language\n");printf("\t¤7.select color\t\t");printf("●8.help(about)\n");printf("\t¤9.background music\t\t");printf("●0.exit\n");}}void tongjimenu(Article head){if(m!=1){printf("\n\n\n ┎━━━━━━━━━━┒\n");printf(" ┃ 统计结果如下┃\n");printf(" ┖━━━━━━━━━━┚\n\n");printf("\t\t\t文章中的字母数为:%d\n",CountLetter(head)); printf("\t\t\t文章中的空格数为:%d\n",CountSpace(head)); printf("\t\t\t文章中的数字数为:%d\n",CountFigure(head)); printf("\t\t\t文章中的汉字数为:%d\n",CountChinese(head)); printf("\t\t\t文章的总字数为:%d\n",CountArticle(head));}else{printf("\n\n\n ┎━━━━━━━━━━━━━━┒\n");printf(" ┃ The statistical result is ┃\n");printf(" ┖━━━━━━━━━━━━━━┚\n\n");printf("\t\t\tthe number of letters is:%d\n",CountLetter(head));printf("\t\t\tthe number of blank space is:%d\n",CountSpace(head));printf("\t\t\tthe number of figures is:%d\n",CountFigure(head));printf("\t\t\tthe number of Chinese is:%d\n",CountChinese(head));printf("\t\t\tthe number of the total words is:%d\n",CountArticle(head));}}void editmenu(){if(m!=1){printf("\n\n\n\t\t ┏━━━━━━━━━━━━━━━━━━━━┓\n");printf("\t\t ┃ 文章编辑┃\n");printf("\t\t ┗━━━━━━━━━━━━━━━━━━━━┛\n");printf("\t\t / ┃ ┃ \\\n");printf("\t\t / ┃ ┃ \\\n");printf("\t\t ↙ ┃ ┃ ↘\n");printf("\t\t ┏━━┓ ┏━━┓ ┏━━┓ ┏━━┓\n");printf("\t\t ┃1、┃ ┃2、┃ ┃3、┃ ┃4、┃\n");printf("\t\t ┃字符┃ ┃字符┃ ┃字符┃ ┃续写┃\n");printf("\t\t ┃ 串┃ ┃ 串┃ ┃ 串┃ ┃ ┃\n");printf("\t\t ┃统计┃ ┃删除┃ ┃替换┃ ┃文章┃\n");printf("\t\t ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃\n");printf("\t\t ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃\n");printf("\t\t ┗━━┛ ┗━━┛ ┗━━┛ ┗━━┛\n\n");printf("\t\t ●-● ●-● ●-● ●-●\n");printf("\t\t ¤ ¤\n");printf("\t\t ¤ 0、返回上层菜单¤\n");printf("\t\t ¤ ¤\n");printf("\t\t ●-● ●-● ●-● ●-●\n");}else{printf("\n\n\n\t\t ┏━━━━━━━━━━━━━━━━━━━━┓\n");printf("\t\t ┃ edit the article ┃\n");printf("\t\t ┗━━━━━━━━━━━━━━━━━━━━┛\n");printf("\t\t / ┃ ┃ \\\n");printf("\t\t / ┃ ┃ \\\n");printf("\t\t ↙ ┃ ┃ ↘\n");printf("\t\t ┏━━━━┓ ┏━━━━┓ ┏━━━━┓┏━━━━┓\n");printf("\t\t ┃1、┃ ┃2、┃ ┃3、┃┃4、┃\n");printf("\t\t ┃sum up ┃ ┃delete ┃ ┃replace ┃┃continue┃\n"); printf("\t\t ┃ ┃ ┃ ┃ ┃ ┃┃to write┃\n");printf("\t\t ┃string ┃ ┃string ┃ ┃string ┃┃ the ┃\n");printf("\t\t ┃ ┃ ┃ ┃ ┃ ┃┃ article┃\n");printf("\t\t ┃ ┃ ┃ ┃ ┃ ┃┃ ┃\n");printf("\t\t ┗━━━━┛ ┗━━━━┛ ┗━━━━┛┗━━━━┛\n\n");printf("\t\t ●-● ●-● ●-● ●-● ●-● ●-●\n");printf("\t\t ¤ ¤\n");printf("\t\t ¤ 0、Return to the above menu ¤\n");printf("\t\t ¤printf("\t\t ●-● ●-● ●-● ●-● ●-● ●-●\n");}}//文章编辑模块的实现void editmanage(Article &head){int choice;Line *p=head;char cc;int num;char s[100],s1[100],s2[100];do{editmenu();if(m!=1)printf("\t\t请输入您的选择(若要返回上层菜单,请按0):");elseprintf("\t\tPlease input your choice(return to the above menu,please press 0):");scanf("%d",&choice);getchar();//在这里读入得好好处理一下,因为读入整型后就要读入一个字符型。
数据结构实验源代码
数据结构实验源代码【附】数据结构实验源代码范本一、实验背景与目的1.1 实验背景在计算机科学中,数据结构是指数据元素之间的关系,以及为操作这些数据元素所提供的方法。
数据结构对于程序的设计和性能优化具有重要影响。
1.2 实验目的本实验旨在通过编写和实现不同的数据结构,加深学生对数据结构的理解,掌握基本的数据结构操作方法。
二、实验内容2.1 线性表2.1.1 顺序表2.1.1.1 初始化顺序表2.1.1.2 插入元素到顺序表2.1.1.3 删除顺序表中的元素2.1.1.4 遍历顺序表2.1.1.5 查找指定元素在顺序表中的位置2.1.2 链表2.1.2.1 初始化链表2.1.2.2 插入元素到链表2.1.2.3 删除链表中的元素2.1.2.4 遍历链表2.1.2.5 查找指定元素在链表中的位置2.2 栈2.2.1 初始化栈2.2.2 进栈操作2.2.3 出栈操作2.2.4 获取栈顶元素2.2.5 判断栈是否为空2.3 队列2.3.1 初始化队列2.3.2 入队操作2.3.3 出队操作2.3.4 获取队首元素2.3.5 判断队列是否为空三、实验步骤3.1 线性表实现在实现顺序表和链表时,首先需要定义数据结构和所需的操作函数。
然后进行初始化、添加元素、删除元素等操作。
最后进行遍历和查找操作,并检验实验结果是否符合预期。
3.2 栈实现栈的实现过程与线性表类似,需要定义栈的数据结构和所需的函数,然后进行初始化、进栈、出栈等操作。
3.3 队列实现队列的实现也与线性表类似,需要定义队列的数据结构和函数,进行初始化、入队、出队等操作。
四、数据结构实验源代码以下是实验代码的源代码范本,包括线性表、栈和队列的实现。
(代码略,如需获取,请查看附件)五、附件本文档附带的附件为数据结构实验源代码。
六、法律名词及注释6.1 数据结构:计算机科学中,数据结构是指数据元素之间的关系,以及为操作这些数据元素所提供的方法。
6.2 顺序表:一种物理上相邻的存储结构,元素按照顺序依次存放。
数据结构课程设计(串的查找与替换源代码)
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");
学生管理系统数据结构课程设计报告之代码
数据构造课程设计学生信息管理系统C语言编写仅供参考:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#define LEN sizeof(LNode)typedef struct LNode{//用于存放学生信息节点int stuNumber;char telenum[50];int age;char chass[50];char deptName[50];/*char zhuanYe[50];char adress[50];*/char name[20];struct LNode *next;}LNode,*Link;//****************创立链表结点************************************************************************** Link createLink(Link L){ //初始化定义函数,声明变量void inserStu(Link L,Link Elem);//定义插入函数int count(Link L);int temp;temp=count(L);printf("节点个数为%d:\n",temp);Link p;int num=1, stuNumber;char telenum[50];char name[20];int age;/* char deptName[50];char adress[50];char zhuanYe[50];*/char chass[50];//开场输出学生信息while(1){printf("请输入学生的信息:学号,,年龄,班级,院系,专业,家庭住址,\n");printf("学号输入负数完毕!\n");printf("请输入学号%d: ",num);scanf("%10d",&stuNumber);if(stuNumber<0) {break;}printf("请输入%d: ",num);getchar();gets(name);printf("请输入年龄%d: ",num);scanf("%d",&age);printf("请输入班级%d: ",num);getchar();gets(chass);printf("请输入: ",num);getchar();gets(telenum);/* printf("请输入院系%d: ",num);getchar();gets(deptName);*/if(stuNumber>=0){p=(Link)malloc(LEN);p->stuNumber=stuNumber;strcpy(p->chass,chass);/* strcpy(p->deptName,deptName);*/p->age=age;strcpy(p->telenum,telenum);strcpy(p->name,name);//插入新结点inserStu(L,p);num++;}}return (L);}//******************打印头结点为L的学生记录********************************************************void printList(Link L){printf("\n*********************学号,,年龄,班级,**************************\n");printf("\n 学号年龄专业班级\n");int n=1;Link p=L;int count(Link L);int temp;temp=count(L);//结点个数:if(temp==0)printf("系统中没有元素\n");//判断学生管理系统中有无信息elsewhile(p->next!=NULL){printf("%2d %-9d",n,p->next->stuNumber);printf("%-8s %-5d %-12s %s \n",p->next->name, p->next->age,p->next->chass,p->next->telenum/*p->next->deptName*/);//首个字符打印不出来p= p->next;n++;}printf("\n****************************************************************************** *****\n");return;}//********************************插入学生信息**************************************void inserStu(Link L,Link Elem){Link prior(Link L,Link p);Link p=L->next;//*******%%%%****while(p!=NULL&&Elem->stuNumber>=p->stuNumber){if(p->stuNumber==Elem->stuNumber){printf("重复输入学号,输入失败!");return ;}p=p->next;}//确定Elem的插入位置if(p==NULL){p=prior(L,p);Elem->next=NULL;p->next=Elem;//假设为空表,插入到头结点之后}else{p=prior(L,p);Elem->next=p->next;p->next=Elem;}}//***********************找到当前地址元素的前一元素的地址*************************************************************************Link prior(Link L,Link p){if(L->next==NULL)return(L);Link p_prior=L;while(p_prior->next!=p){p_prior= p_prior->next ;}return (p_prior);}//********************************8按学号查询学生信息***************************************************************************int searchName(Link L,char n[]){int flag=0;//标志要查找的学生和学生记录中的是否匹配Link p=L->next;int seat=1;if(L->next==NULL||L==NULL)printf("没有学生信息\n");else{while(p!=NULL){if(!strcmp(p->name,n))//比拟要查找的是否和当前学生信息所指的匹配{flag=1;//输入匹配printf("要查找的是第%d位学生\n",seat);printf("学号是:%d 名字:%s 年龄:%d 班级:%s 手机号:%s\n",p->stuNumber,p->name,p->age,p->chass,p->telenum);}p=p->next ;seat++;}}return flag;}//****************************************按学号查找学生信息*********************************************************************int searchNum(Link L,int n){int flag=0;//标志要查找的学生和管理信息系统中的学号是否匹配Link p=L->next;int seat=1;if(L->next==NULL)printf("没有学生信息\n");else{while(p!=NULL){if(p->stuNumber<=n){if(p->stuNumber==n)//比拟要查找的学号是否和当前学生信息所指的学号匹配{flag=1;//输入学号匹配printf("要查找的是第%d位学生\n",seat);printf("学号是:%d 名字:%s 年龄:%d 班级:%s 手机号:%s\n",p->stuNumber,p->name,p->age,p->chass,p->telenum);}}p=p->next ;seat++;}}return flag;}//*******************************从通讯录中删除第i个元素***************************************************************************void deleteElem(Link L,int i){Link p=L;int j=0;while(p->next&&j<i-1){p= p->next;j++;}if(!(p->next))//判断i时候合法,i不能大于元素的个数,也不能小于等于0{printf("第%d个学生删除失败\n",i);return;}Link q=p->next;p->next=q->next;free(q);}//*******************按删除学生信息******************************************************************************************** **int deleName(Link L, char n[]){ void deteStu(Link);int flag=0;//判断要删除的学生与系统中的是否匹配Link p=L->next;int seat =1;if(L->next==NULL){printf("\n删除提示:系统中没有元素,删除失败!\n");deteStu( L);} else{while(p!=NULL){if(!strcmp(p->name ,n))//比拟名字是否匹配{flag=1;printf("%s",p->name );p=p->next;deleteElem(L,seat);//删除第i个学生的信息}else{p=p->next ;seat++;}if(flag)printf("被删除了\n");}}return flag;}//*****************按学号删除学生信息*****************************************************************int deleNum(Link L,int n){ void deteStu(Link);int flag=0;Link p=L->next ;int seat=1;if(L->next==NULL){printf("\n删除提示:系统中没有元素,删除失败!\n");deteStu( L);}else{while(p!=NULL){if(p->stuNumber==n){flag=1;printf("%d",p->stuNumber);p=p->next;deleteElem(L,seat);break;}p=p->next ;seat++;}if(flag){printf("被删除了\n");}else{printf("没有找到学生信息\n");}}return flag;}//************************************************************************************* void searchWay1(Link L){ void searchMenu(Link L);int searchWay=0;//控制跳出循环,再次选择查询方式if(searchWay==0){printf("请输入要查询的学生的学号:\n");int n,s;scanf("%d",&n);s=searchNum(L, n);if(s==0)printf("查找失败\n");searchWay=1;}if(searchWay==1){searchMenu( L);}}//********************************************************************************void searchWay2(Link L){ void searchMenu(Link L);int searchWay=0;//控制跳出循环,再次选择查询方式if(searchWay==0){char n[20];int flag;printf("请输入要查询的学生\n");char temp2=getchar();gets(n);flag= searchName(L,n);if(flag==0)printf("查找失败!\n");searchWay=1;}if(searchWay==1){searchMenu( L);}}//*****************************************************************8void searchMenu(Link L){int mainMenu();printf(" ********************** 查询菜单************************************** \n");printf(" *** 1 输入学生学号查询学生信息\n");printf(" *** 2 输入学生查询学生信息\n");printf(" *** 3 返回上级菜单\n");printf(" ********************** 查询菜单************************************** \n");printf("请选择1-3: ");int menu;scanf("%d",&menu);switch(menu){case 1:{ searchWay1(L);break;}case 2:{ searchWay2(L);break;}case 3:{break;//跳回主菜单程序}}}//************************************更新学生信息模块*****************************************void alterStu(Link L)//按学号更新学生信息{int n;printf("请输入要修改的学生学号:");scanf("%d",&n);Link p=L->next;if(p==NULL){printf("学生管理系统没有学生信息!");}while(p!=NULL)//循环查找学生信息,如果找到该学号那么进入循环体更改学生信息{//**************************************************************************************** ******if(p->stuNumber==n){int num=1, stuNumber,age;char telenum[50];char name[20];char chass[50];printf("***********************更改学生信息*****************************************\n");printf("请输入学生的学号,和\n");printf("请输入学号%d: ",num);scanf("%d",&stuNumber);printf("请输入%d: ",num);getchar();gets(name);printf("请输入年龄%d: ",num);scanf("%d",&age);printf("请输入班级%d: ",num);getchar();gets(chass);printf("请输入: ",num);getchar();gets(telenum);p->age=age;p->stuNumber=stuNumber;strcpy(p->telenum,telenum);strcpy(p->name,name);strcpy(p->chass,chass);//更新新结点printf("***********************更改学生信息完毕*****************************************\n");//****************************************************************************************** *******}p=p->next;}}//****************保存学生信息模块***************************************************************************void keepStu(Link L){Link p=L->next;FILE* fp;if((fp=fopen("student.txt","r"))==NULL)//翻开文件,不存在此文件那么新建{fp=fopen("E:\\测试\\student.txt","w");fclose(fp);}fp=fopen("E:\\测试\\student.txt","a");while(p!=NULL){fprintf(fp,"%d\t%s\t%s\n",p->stuNumber,p->name,p->telenum);p=p->next;}fclose(fp);printf("文件保存成功!\n");}//********************统计结点个数模块***********************************************************************************int count(Link L){int n=0;Link p=L->next;if(p==NULL){printf("不存在学生信息\n");}while(p!=NULL){p=p->next;n++;}return n;}//********************************导入学生信息模块**********************************************************************Link stuEntry(){FILE* fp;Link p,q ,L;if((fp=fopen("E:\\测试\\student.txt","r"))==NULL)//翻开文件,不存在此文件那么新建{;}L=q=(Link)malloc(LEN);printf("\n学号手机号\n");printf("**********************************************************\n");while(!feof(fp)){p=(Link)malloc(LEN);fscanf(fp,"%d\t%s\t%s\n",&p->stuNumber,&p->name,&p->telenum);printf("\n%d\t%s\t%s\n",p->stuNumber,p->name,p->telenum);q->next=p;q=p;}q->next=NULL;fclose(fp);printf("按任意键完毕:");getch();//返回return L;}//********************添加学生信息**************************************************************************void AddStu(Link L){ int temp;temp=count(L);printf("节点个数为%d:\n",temp);if(temp==0){createLink(L);}//如果没有学生信息那么调用初始化函数createLink(L);}//****************删除学生菜单****************************************************void deteStu(Link L){int flag=0,way,n;printf("\n************************ 删除菜单********************\n");printf("\n选择操作方式************* 1:按学号********************\n");printf(" ************* 2:按********************\n");printf(" ************* 3: 返回主菜单*********************\n");printf("\n请输入删除方式:");scanf("%d",&way);if(way<1||way>3){deteStu(L);}switch (way){case 1: {printf("请输入要删除的学生学号:");scanf("%d",&n);flag= deleNum(L,n);break;}case 2:{char n[20];printf("请输入要删除的学生:");char temp1=getchar();gets(n);flag=deleName(L,n);break;}case 3:{break;}}if(flag){printf("删除成功!\n");deteStu(L);}}//**********************主菜单程序******************************************************************************int mainMenu(){printf("\n****************************欢送使用学生管理信息系统***********************************************\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("* *** 0 退出管理信息系统**** * \n");printf("****************************欢送使用学生管理信息系统***********************************************");int menu=0;printf("请选择0-8:");scanf("%d",&menu);if(menu<0&&menu>8){printf("输入无效,请正确输入有效序号0-8:");scanf("%d",&menu);}return menu;}//**************************main()程序******************************************************************************************** *********void main(){Link L=(Link)malloc(LEN);//在主函数上首先让构造体指针初始化;L->next=NULL;int flag=0;//学生信息是否建立int menu=0;//菜单项选择项do{menu=mainMenu();switch(menu)//用于调用子菜单{case 1:{L=createLink(L);break;}case 2:{printList(L); break;}case 3:{searchMenu(L); break;}case 4:{alterStu(L) ;break;}case 5:{createLink(L);break;}case 6:{deteStu( L); break;}case 7:{keepStu( L); break;}case 8:{L=stuEntry();break;}case 0:{return;}}}while(1);}//****************************************************************************************** ************************************。
数据结构课程设计代码
#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。
数据结构课程设计报告 (附有完整可运行出来的代码)
课程设计报告设计题目:公园导游图一、流程图二、程序代码#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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdio.h>#include<stdlib.h>#include <string.h>#include<malloc.h>#define MAXSIZE 1000typedef char DataType;typedef struct node{DataType ch[MAXSIZE];struct node *next;}Lstring;/*****输入文章*****/Lstring *input(){Lstring *p,*head;int i=0;printf ("请输入一页文章,若要换行,请直接敲回车键,若想结束请按@:\n");p=(Lstring *)malloc(sizeof(Lstring));head=p;p->ch[i]=NULL;p->next=NULL;char str[200];while(1){gets(str);if(strlen(str)>100){printf("每行最多输入100字符");break;}if(str[0]==64){str[0]='\0';p->ch[0]=str[0];break;}p->next=(Lstring *)malloc(sizeof(Lstring));strcpy(p->ch,str);if(str[strlen(str)-1]==64){p->ch[strlen(str)-1]='\0';break;}p=p->next;}p->next=NULL;return head;}/****输出文章*****/Lstring *OutPut(Lstring *head){Lstring *p=head;do{printf("%s\n",p->ch);}while((p=p->next)!=NULL);return head;}/****统计字母的个数*****/int Alphabet(Lstring *head){Lstring *p=head;int count=0;do{int Len;Len=strlen(p->ch);for(int i=0;i<Len;i++)if((p->ch[i]>='a'&&p->ch[i]<='z')||(p->ch[i]>='A'&&p->ch[i]<='Z')) count++;}while((p=p->next)!=NULL);return count;}/****统计数字的字数*****/int Num(Lstring *head){Lstring *p=head;int count=0;do{int Len;Len=strlen(p->ch);for(int i=0;i<Len;i++)if(p->ch[i]>='0' && p->ch[i]<='9')count++;}while((p=p->next)!=NULL);return count;}/****统计空格的字数*****/int Space(Lstring *head){Lstring *p=head;int count=0;do{int Len;Len=strlen(p->ch);for(int i=0;i<Len;i++)if(p->ch[i]==32)count++;}while((p=p->next)!=NULL);return count;}/*统计文章的总字数*/int All(Lstring *head){Lstring *p=head;int count=0;do{count+=strlen(p->ch);}while((p=p->next)!=NULL);return count;}/****串的简单模式匹配*****/int FindString(Lstring *head,char *str){Lstring *p=head;int count=0;int h=0;int len1=0;int len2=strlen(str);int i,j,k;do{len1=strlen(p->ch);for(i=0;i<len1;i++){if(p->ch[i]==str[0]){k=0;for(j=0;j<len2;j++)if(p->ch[i+j]==str[j]) k++;if(k==len2){count++;i=i+k-1;}}}}while((p=p->next)!=NULL);return count;}void delstringword(char *s,char *str){char *p;int count,len,i,j;char s1[80];p=strstr(s,str);len=strlen(s);i=len-strlen(p);j=i+strlen(str);count=0;for(int m=0;m<i;m++)s1[count++]=s[m];for(int n=j;n<len;n++)s1[count++]=s[n];s1[count]='\0';strcpy(s,s1);}Lstring *DelString(Lstring *head,char *str){Lstring *p=head;do{while(strstr(p->ch,str)!=NULL)delstringword(p->ch,str);}while((p=p->next)!=NULL);return head;}void main(){int i=0;int m;Lstring *head;char s1[20],s2[20];head=input();printf("输入的文章为:\n");head=OutPut(head);printf("\n");printf("全部字母数:%d \n",Alphabet(head));printf("数字个数:%d \n",Num(head));printf("空格个数: %d \n",Space(head));printf("文章总字数: %d \n",All(head));printf("\n");printf("**********************\n");printf("* 菜单 *\n");printf("**********************\n");printf("* 1---统计字符串 *\n");printf("* 2---删除字符串 *\n");printf("* 0---退出 *\n");printf("**********************\n");do{printf("请输入你要选择的操作(0~2):");scanf("%d",&m);switch(m){case 0:exit(0);break;case 1:printf("请输入要统计的字符串:");scanf("%s",&s1);printf("%s在文章中出现的次数为:%d \n",s1,FindString(head,s1));printf("\n");break;case 2:printf("请输入要删除的某一字符串:");scanf("%s",&s2);head=DelString(head,s2);printf("删除%s后的文章为:\n",s2);OutPut(head);break;}}while(m!=0);}。