算法与数据结构设计题与源代码

合集下载

数据结构经典算法源程序

数据结构经典算法源程序

Huffman 算法源程序V oid huffman(int n,int w[],jd t[])) {int I,j,k,x1,x2,m1,m2; for (I=1;I<(2*n);I++) /*置初态*/{t[I].rc=t[I].lc=t[I].pa=0;if(I<=n) t[I].ww=w[I]; /*叶子结点赋权值,把W 数组 中的n 个权值分别送到T 数组的WW 域中*/ else t[I].ww=0;/*非叶子结点WW 域赋0*/}for (I=1;I<n;I++) /*每循环一次,构造一棵较大的二叉树*/ {m1=m2=MAX; /*设置可能的最大权值*/x1=x2=0; /*最小、次小权的初始位置设为0*/ for (j=1;j<(n+i);j++) /*找无双亲结点的两个最小权, 生成的新树结点放n+I 单元*/{if (t[j].ww<m1)&&(t[j].pa=0)} /*找最小权送m1*/{m2=m1;x2=x1; /*把次小权由m1送m2,并把次 小权位置由x1送到x2*/m1=t[j].ww; /*把森林中无双亲结点的最小权送m1*/ x1=j;} /*记住最小权的位置*/else if ((t[j].ww<m2)&&(t[j].pa=0){m2=t[j].ww;x2=j;}/*把无双亲的次小权送m2,并记 住次小权的位置*/k=n+I; /*生成双亲结点的树编号*/t[x1].pa=t[x2].pa=k;/*将双亲结点的地址分别送左、右孩子的pa 域*/ t[k].ww=m1+m2;/*双亲结点的权值送双亲结点的WW 域*/ t[k].lc=x1;/*把双亲结点与左孩子T[X1]相连接*/ t[k].rc=x2; /*把双亲结点与右孩子T[X2]相连接*/ } }深度优先遍历树(DFS)Dfs(td g[],int v,int c[])Int w,I=0;JD*p,*s[m];C[v]=1;printf(v);P=g[v].link;{while(p!=NULL){w=p->vex;if(c[w]==0)c[w]=1;printf(w);s[I++]=p;p=g[w].link;}else p=p->link;}if(I>0){p=s[--I];p=p->link;}}}广度优先遍历树(BFS)BFS(TD g[],int v,int c[]){int qu[m],r=0,f=0;/*qu为队列,f和r为队首和队尾*/jd *p;c[v]=1;printf(v);qu[0]=v; /*访问过的顶点V入队*/while(f<=r)/*当队列不空时*/{v=qu[f++];/*访问过的顶点出队*/p=g[v].link;/*p指向V的第一个相邻顶点*/while(p!=null){v=p->vex;if (c[v]==0){c[v]=1;printf(v);/*未访问则访问之*/qu[++r]=v;/*访问该顶点并进队*/}p=p->link;/*找P的同层下一个相邻顶点*/}}}最小生成树算法#define M 30 #define MAX 99void zxscs(int ad[][M],int n){int I,j,k,p,q,wm;/*p,q,wm 分别为最小权值所在的行数、列数和最小权值*/ q=p=1;ad[q][q]=1;/*从V1出发构造最小生成树,先把V1加入最小生成树*/ for (k=0;k<(n-1);k++)/**/ {wm=MAX;for (I=1;I<n;I++) /*从矩阵的第I 行找最小边*/ if(ad[I][I]==1)/*顶点已在生成树里*/for (j=1;j<n;j++) /*当V i 在生成树中,扫描与之有边相连的顶点Vj*/ if ((ad[j][j]==0&&(ad[I][j]<wm))/*顶点Vj 不在生成树中*/{wm=ad[I][j];p=I;q=j}/*选本次最小边的权放wm ,并记录相关顶点的位置*/ad[q][q]=1;/*把选中的顶点加入最小生成树里*/printf(p,q,ad[p][q]);if(p>q)/*把选中的边加入到最小生成树里*/ ad[p][q]=-ad[p][q]; else ad[q][p]=-ad[q][p]; } }图解最小生成树算法无向图邻接表生成算法V oid Scljb(TD ad[],int n) {JD *P ;Int I,j,k;For (k=1;k<=n;k++) ad[k].link=NULL; /*将邻接表头结点数组的链域 置空*/ Printf("vi,vj= ")Scanf("%d,%d",&I,&j); /*输入表示边的顶点序号*/ While((I>0)&&(j>0)){p=(JD*)malloc(sizeof(JD));p->vex=j;p->link=ad[I].link;ad[I].link=p;/*结点j 插入到第I 个链表*/ p=(JD*)malloc(sizeof(JD)); p->vex=i;p->link=ad[j].link;ad[j].link=p;/*结点i 插入到第j 个链表*/ Scanf("%d,%d",&I,&j); } }从一个顶点到其它顶点的最短路径算法#define M 30 #define MAX 99void zdlj1(int ad[][M],int k,int pre[],int dist[],int n) {int i,j,p,wm;k=k-1;/*用ad 数组存放邻接矩阵,数组元素的下标等于相关顶点序号减1*/ for (I=0;I<n;I++){dist[I]=ad[k][I];/*从邻接矩阵中读入从顶点k 到其它顶点I 的路径长*/ if (dist[I]<MAX)pre[I]=k+1;else pre[I]=0;}/*Vk 到V i 无路径,则用0作前一个顶点的序号*/ pre[k]=0;dist[k]=0;/*将起始顶点Vk 加入到第一组*/ for(j=0;j<(n-1);j++){wm=MAX;p=-1;/*设定除Vk 外的其它顶点的比较基准*/for (I=0;I<n;I++)if((ad[I][I]==0)&&(dist[I]<wm))/*若V i 是第二组顶点,并且其权值小于基准*/{p=I;wm=dist[I];} /*以V i为候选取顶点,dist[I]为候选最短路径长*/ if(p==-1) break;/*已没有顶点可往第一组加*/else{ad[p][p]=1;/*把第二组顶点中选出具有最小距离值的Vp加入第一组*/for (I=0;I<n;I++)if (ad[I][I]==0)/* 对于第二组中的各顶点,准备调整距离值*/if(dist[p]+ad[p][I]<dist[I])/*若加入顶点Vp+1到第一组后,由Vk到Vi+1的最短*/{dist[I]=dist[p]+ad[p][I];/*路径比加入前更短,则应修正其路径长*/pre[I]=p+1;}}}}最短路径算法#define M 30#define MAX 99void zdlj1(int ad[][M],int k,int pre[],int dist[],int n){int i,j,p,wm;k=k-1;/*用ad数组存放邻接矩阵,数组元素的下标等于相关顶点序号减1*/for (I=0;I<n;I++){dist[I]=ad[k][I];/*从邻接矩阵中读入从顶点k到其它顶点I的路径长*/if (dist[I]<MAX)pre[I]=k+1;else pre[I]=0;}/*Vk到V i无路径,则用0作前一个顶点的序号*/pre[k]=0;dist[k]=0;/*将起始顶点Vk加入到第一组*/for(j=0;j<(n-1);j++){wm=MAX;p=-1;/*设定除Vk外的其它顶点的比较基准*/for (I=0;I<n;I++)if((ad[I][I]==0)&&(dist[I]<wm))/*若V i是第二组顶点,并且其权值小于基准*/{p=I;wm=dist[I];} /*以V i为候选取顶点,dist[I]为候选最短路径长*/ if(p==-1) break;/*已没有顶点可往第一组加*/else{ad[p][p]=1;/*把第二组顶点中选出具有最小距离值的Vp加入第一组*/for (I=0;I<n;I++)if (ad[I][I]==0)/* 对于第二组中的各顶点,准备调整距离值*/if(dist[p]+ad[p][I]<dist[I])/*若加入顶点Vp+1到第一组后,由Vk到Vi+1的最短*/{dist[I]=dist[p]+ad[p][I];/*路径比加入前更短,则应修正其路径长*/pre[I]=p+1;}}}}关键路径算法(1) 计算各事件的最早发生时间ve[j]V e[1]=0V e[2]=ve1[1]+w12=0+6=6V e[3]=ve[1]+w13=0+4=4V e[4]=ve[1]+w14=0+5=5V e[5]=max{ve[2]+w25,ve[3]+w35}=max{7,5}=7V e[6]=ve4+w46=5+2=7V e[7]=ve[5]+w57=7+7=14V e[8]=max{ve[5]+w58,ve[6]+w68}=max{12,11}=12V e[9]=max{ve[7]+w79,ve[8]+w89}=max{14+2,12+4}=16 (2) 计算各事件的最迟发生时间vl[j]vl[9]=ve[9]=16vl[8]=vl[9]-w89=16-4=12vl[7]=v[9]-w79=16-2=14vl[6]=vl[8]-w68=12-4=8vl[5]=min{vl[7]-w57,vl[8]-w58}=min{14-7,12-5}=7vl[4]=vl[6]-w46=8-2=6vl[3]=vl[5]-w35=7-1=6vl[2]=vl[5]-w25=7-1=6vl[1]=min{vl[2]-w12,vl[3]-w13,vl[4]-w14}=min{6-6,6-4,6-5}=0 (3) 由此,求出各顶点的发生时间如下表:(4) 求每一活动ai的e[I]和l[I]直接插入排序算法1.链式存储的直接插入排序:ArrayJD *zjcrpx1(JD *h)JD t,p,*r,*q;If (h!=NULL){t=h;while (t->link!=NULL){p=t->link;if ((p->key)<(h->key)) /*若p结点的键值小于第一个结点的键盘值,则*/ {t->link=p->link; /*将p的后继作为t的后继*/p->link=h;h=p;} /*将p作为原h的前趋,p作头指针*/else {q=h; /*以q为头开始与待插入结点p的键值相比*/ r=q->link;while ((p->key)>(r->key)){q=r;r=q->link;}if (p=r) t=p;else {t->linl=p->link; /*p->key<r->key,应交换两者的位置*/p->link=r; /*将p 的后继指向r*/ q->link=p; /*原来q 的后继指向p*/ } } } } return(h); }2.二分法插入排序 void rffpx(JD r[],int n) int I,j,m,t,w;JD x;For (I=2,I<=n;I++){x=r[i];/*保留r[I]的副本*/ t=1;w=I-1;/*初始区间范围*/ while (t<=w) {m=(t+w)/2;if (x.key<r[m].key) w=m-1;else t=m+1;}for (j=I-1;j>=t;j--) /*从I-1至插入位置t 所对应的记录依次向后移一个位置*/ r[j+1]=r[I]; r[t]=x;} }基数归并排序算法1.基数排序:(1)结点类型定义:#define D 3 /*位数初定为3位*/ Typedef struct {int key;float data; int link;}JD; Int jspx(JD r[],int n){/*链式存储表示的基数排序,设每个键值为小于1000的正整数,j=10,d=3*/} int I,j,k,t,p,rd,rg,f[10],e[10];/*f[0]~f[9]是头指针数组,e[0] ~e[9]是尾指针数组*/ for (I=1;I<n;I++) /*以下是初始化链表*/ {r[I].link=I+1;} r[n].link=0;p=1;rd=1;rg=10;/*p 指向链表的第一个结点*/ for (I=1;I<=d;I++) /*下面是分配队列*/{for (j=0;j<10;j++) {f[j]=0;e[j]=0;}do {k=(r[p].key%rg)/rd;/*求关键字倒数第I位有效数字,k为待分配的“桶号”*/ if (f[k]= =0) f[k]=p;else r[e[k]].link=p;e[k]=p; /*修改链表的尾指针*/p=r[p].link;/*扫描下一个记录*/}while (p>0); /*扫描到最后,p=r[p].link=0,结束本趟分配*//*以下是收集*/j=0;while (f[j]= =0) j=j+1; /*找第一个非空的“桶”*/p=f[j];t=e[j];/*p为所收集的链表的头指针*/for (k=j+1;k<10;k++) /*取下一个“桶”*/if (f[k]>0) {r[t].link=f[k];t=e[k];}/*连接非空“桶”*/r[t].link=0; /*这是本趟收集之后链表的最后一个元素*/rg=rg*10;rd=rd*10; /*准备下趟的分配与收集*/}return (p)}2.合并算法:void hbgc(JD r[],int h,int m,int w,JD t[])int I,j,k;/*I,j,k 的初值分别指向三个子表的起始位置*/I=h;j=m+1;K=h-1;While ((I<=m)&&(j<=w)){k++;if (r[I].key<=r[j].key) t[k]=r[I++];else t[k]=r[j++];}if (I>m) while (j<=w) t[++k]=r[j++]; /*I已尽,则第二个子表余下的部分接入t数组*/ else while (i<=m) t[++k]=r[i++]; /*j已尽,则第一个子表余下的部分接入t数组*/}。

数据结构经典题目及c语言代码

数据结构经典题目及c语言代码

数据结构经典题目及c语言代码一、线性表1. 顺序表顺序表是一种利用连续存储空间存储元素的线性表。

以下是一个顺序表的经典题目及C语言代码实现:```c#define MaxSize 50typedef struct {int data[MaxSize]; // 存储元素的数组int length; // 顺序表的当前长度} SeqList;// 初始化顺序表void initList(SeqList *L) {L->length = 0;}// 插入元素到指定位置void insert(SeqList *L, int pos, int elem) {if (pos < 1 || pos > L->length + 1) {printf("插入位置无效\n");return;}if (L->length == MaxSize) {printf("顺序表已满,无法插入\n"); return;}for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i - 1];}L->data[pos - 1] = elem;L->length++;}// 删除指定位置的元素void delete(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("删除位置无效\n");return;}for (int i = pos - 1; i < L->length - 1; i++) {L->data[i] = L->data[i + 1];}L->length--;}// 获取指定位置的元素值int getElement(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("位置无效\n");return -1;}return L->data[pos - 1];}```2. 链表链表是一种利用非连续存储空间存储元素的线性表。

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

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

数据结构与算法实验源代码数据结构与算法实验源代码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;}}}。

C语言课程设计报告停车场管理系统

C语言课程设计报告停车场管理系统

算法与数据结构课程设计题目:停车场管理专业班级:软件四班姓名:学号:指导教师:成绩:______________目录一、题目及要求 (2)二、题目分析 (3)三、数据结构说明 (4)四、各函数算法分析 (5)(1)主函数 (5)(2)车辆到达函数 (7)(3)车辆离开函数 (8)(4)列表显示函数 (10)五、程序测试 (14)(1)测试信息对错误的处理 (14)(2)列表显示 (15)(3)同时输出等待的提示作息 (16)(4)计算它们的应交费用 (17)六、课程设计感悟与收获 (18)七、源代码 (19)八、参考文献 (25)一、题目及要求[要求]设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。

车辆按到达停车场时间的早晚依次从停车场最里面向大门口停放(最先到达的第一辆车放在停车场的最里面)。

如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆国就进入停车场。

停车场内如有某辆车要走,在它之后进来的车都必须退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。

每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。

如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且其他在便道上等待的车辆的次序不变。

编制一程序模拟停车场管理。

[提示]汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去时刻)。

例如:(’A’,1,5)表示1号牌照车在5这个时刻到达,而(’D’,5,20)表示5号牌照车在20这个时刻离去,整个程序可以在输入信息为(’E’,0,0)时结束。

基本要求:要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交的费用和它在停车场内停留的时间。

根据题目要求,停车场可以用一个长度为n的堆栈来模拟。

由于停车场内如有某辆车要开走,在它之后进来的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。

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

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

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

二、实验环境本实验使用以下环境进行开发和测试:- 操作系统: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):是由节点组成的层级结构,其中一种节点作为根节点,其他节点按照父子关系连接。

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

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

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

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

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

4、删除功能:LinkList *Delete(LinkList *head);按想要删除的学生的学号首先进行查找,通过指针所指向结点的下移来完成,如果找到该记录,则完成前后结点的连接,同时对以查找到的结点进行空间的释放,最后完成对某个学生记录进行删除,并重新存储。

5、插入功能:LinkList *Insert(LinkList *head);输入你想插入的位置,通过指针所指向结点的下移,找到该位置,将该新的学生记录插入到该结点,并对该结点后面的指针下移。

链表长度加一,重新存储。

(5) 程序的输入与输出描述输入:调用LinkList *create()函数,输入学生的姓名、学号、三门功课的成绩;输出:调用void print(LinkList *head)函数,输出学生的记录。

(6) 程序测试主菜单:成绩管理系统的主界面:学生成绩记录的输入:输出学生成绩记录:学生成绩记录的删除(删除学号是1101的学生记录)插入新的学生成绩记录(插入学号为1103的学生记录)(7) 尚未解决的问题或改进方向尚未解决的问题:该成绩管理系统还存在不少缺陷,而且它提供的功能也是有限的,只能实现学生成绩的输入、输出、删除、插入。

数据结构与算法题库(含参考答案)

数据结构与算法题库(含参考答案)

数据结构与算法题库(含参考答案)一、单选题(共100题,每题1分,共100分)1、在一次校园活动中拍摄了很多数码照片,现需将这些照片整理到一个PowerPoint 演示文稿中,快速制作的最优操作方法是:A、创建一个 PowerPoint 相册文件。

B、创建一个 PowerPoint 演示文稿,然后批量插入图片。

C、创建一个 PowerPoint 演示文稿,然后在每页幻灯片中插入图片。

D、在文件夹中选中所有照片,然后单击鼠标右键直接发送到PowerPoint 演示文稿中。

正确答案:A2、下面对“对象”概念描述错误的是A、对象不具有封装性B、对象是属性和方法的封装体C、对象间的通信是靠消息传递D、一个对象是其对应类的实例正确答案:A3、设栈与队列初始状态为空。

首先A,B,C,D,E依次入栈,再F,G,H,I,J 依次入队;然后依次出队至队空,再依次出栈至栈空。

则输出序列为A、F,G,H,I,J,E,D,C,B,AB、E,D,C,B,A,J,I,H,G,FC、F,G,H,I,J,A,B,C,D,E,D、E,D,C,B,A,F,G,H,I,J正确答案:A4、设表的长度为 20。

则在最坏情况下,冒泡排序的比较次数为A、20B、19C、90D、190正确答案:D5、设二叉树的前序序列为 ABDEGHCFIJ,中序序列为 DBGEHACIFJ。

则后序序列为A、DGHEBIJFCAB、JIHGFEDCBAC、GHIJDEFBCAD、ABCDEFGHIJ正确答案:A6、Excel工作表B列保存了11位手机号码信息,为了保护个人隐私,需将手机号码的后 4 位均用“*”表示,以 B2 单元格为例,最优的操作方法是:A、=REPLACE(B2,7,4,"****")B、=REPLACE(B2,8,4,"****")C、=MID(B2,7,4,"****")D、=MID(B2,8,4,"****")第 10 组正确答案:B7、小金从网站上查到了最近一次全国人口普查的数据表格,他准备将这份表格中的数据引用到 Excel 中以便进一步分析,最优的操作方法是:A、通过 Excel 中的“自网站获取外部数据”功能,直接将网页上的表格导入到 Excel 工作表中。

数据结构算法设计题及答案

数据结构算法设计题及答案

数据结构算法设计题及答案一、题目设计一个算法,用于在一个未排序的整数数组中查找第二小的元素。

二、算法思路首先,我们可以通过遍历数组找到最小的元素。

然后,再次遍历数组,排除已经找到的最小元素,找到剩余元素中的最小元素,即为第二小的元素。

三、算法实现(使用 Python 语言)```pythondef find_second_smallest(arr):min1 = float('inf')min2 = float('inf')for num in arr:if num < min1:min2 = min1min1 = numelif num < min2 and num!= min1:min2 = numreturn min2```四、示例输入与输出假设我们有数组`5, 3, 8, 1, 9` 。

当我们调用`find_second_smallest(5, 3, 8, 1, 9)`时,算法首先找到最小的元素`1` ,然后在剩余元素`5, 3, 8, 9` 中找到最小的元素`3` ,所以返回`3` 。

五、题目给定一个链表,判断链表中是否存在环。

六、算法思路我们可以使用快慢指针的方法来解决这个问题。

慢指针每次移动一步,快指针每次移动两步。

如果在移动过程中,快慢指针相遇,那么就说明链表中存在环;如果快指针到达链表末尾,那么就说明链表中不存在环。

七、算法实现(使用 Python 语言)```pythonclass ListNode:def __init__(self, val=0, next=None):selfval = valselfnext = nextdef has_cycle(head):slow = headfast = headwhile fast and fastnext:slow = slownextfast = fastnextnextif slow == fast:return Truereturn False```八、示例输入与输出假设我们有一个链表`1 > 2 > 3 > 4 > 5 > 2` (其中 5 指向 2 形成环)。

算法设计与分析(详细解析(含源代码)

算法设计与分析(详细解析(含源代码)

常用算法设计方法要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。

计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。

算法数据结构是程序的两个重要方面。

算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。

指令正确地描述了要完成的任务和它们被执行的顺序。

计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。

通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。

其次是算法所需要的存储空间少和执行更快等。

算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。

另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。

一、迭代法迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。

设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。

若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。

上述算法用C程序的形式表示为:【算法】迭代法求方程的根{ x0=初始近似根;do {x1=x0;x0=g(x1);/*按特定的方程计算新的近似根*/} while ( fabs(x0-x1)>Epsilon);printf(“方程的近似根是%f\n”,x0);}迭代算法也常用于求方程组的根,令X=(x0,x1,…,x n-1)设方程组为:x i=g i(X) (I=0,1,…,n-1)则求方程组根的迭代算法可描述如下:【算法】迭代法求方程组的根{ for (i=0;i<n;i++)x[i]=初始近似根;do {for (i=0;i<n;i++)y[i]=x[i];for (i=0;i<n;i++)x[i]=gi(X);for (delta=0.0,i=0;i<n;i++)if (fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]);} while (delta>Epsilon);for (i=0;i<n;i++)printf(“变量x[%d]的近似根是%f”,I,x[i]);printf(“\n”);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

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

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

实验二#include<stdio.h>#include<stdlib.h>#define Maxlen 100typedef struct{int data[Maxlen];int last;}Sequenlist;Sequenlist *SqLsetnull(){ //建立一个空的顺序表Sequenlist *L;L=(Sequenlist *)malloc(sizeof(Sequenlist));L->last=-1;return L;}void *SqLset(Sequenlist *L){ //对顺序表输入数据int n;printf("请输入要输入的元素数量:");scanf("%d",&n);printf("请输入要输入的元素:");for(int i=0;i<n;i++){scanf("%d",&L->data[i]);}L->last=i;return L;}int SqLdelete(Sequenlist *L,int i){ //删除顺序表中的元素//因为只是调用该函数删除顺序表中多余的元素省略的一些数据判断int j;for(j=i;j<=L->last+1;j++)L->data[j]=L->data[j+1];L->last--;return 1;}void SqLdel(Sequenlist *L){ //寻找顺序表中多余的元素并删除int i,j;if(L->last<0){printf("\n顺序表为空\n");}else{for(i=0;i<=L->last;i++){for(j=i+1;j<=L->last;j++)if(L->data[j]==L->data[i]){SqLdelete(L,j); //调用函数删除下标为j的结点}}}}void SqLsc(Sequenlist *L){ //输出顺序表中的数据int i;if(L->last<0)printf("\n顺序表为空\n");else{printf("顺序表中的元素:");for(i=0;i<L->last;i++){printf("%d ",L->data[i]);}}printf("\n");}int main(void){Sequenlist *L;L=SqLsetnull();int choice;printf("1,输入数据2,删除重复多余的数据3,输出数据0,退出\n");do{printf("请输入选择:");scanf("%d",&choice);switch(choice){case 1:SqLset(L);printf("\n");break;case 2:SqLdel(L);printf("\n");break;case 3:SqLsc(L);printf("\n");break;default:printf("请输入正确的选择!\n");break;case 0:break;}}while(choice!=0);return 0;}实验三#include<stdio.h>#include<stdlib.h>#define SIZE 15typedef struct{int data[SIZE];int last;}RecordList;RecordList *shuru(){ //向顺序表中输入数据int s,i=0;RecordList *L;L=(RecordList *)malloc(sizeof(RecordList));printf("请输入要输入到顺序表中数据的数量:");scanf("%d",&s);if(s>15){printf("超过最大的数据长度");}else{printf("请输入要输入的数据:");for(i=0;i<s;i++)scanf("%d",&L->data[i]);}printf("成功输入%d个数据\n\n",i);L->last=i-1;return L;}void paixu(RecordList *L){ //冒泡排序法对顺序表中的数据进行排序int x,change=1,i,j;for(i=0;i<L->last&&change!=0;i++){change=0;for(j=0;j<L->last-i;j++){if(L->data[j]>L->data[j+1]){x=L->data[j+1];L->data[j+1]=L->data[j];L->data[j]=x;change=1;}}}}int BinSrch(RecordList *L,int k){ //二分查找int low=0,i=-1,high,mid;high=L->last;while(low<=high){mid=(low+high)/2;if(k==L->data[mid]){i=mid;break;}else if(k<L->data[mid])high=mid-1;elselow=mid+1;}return i;}int main(void){RecordList *L=NULL;int i,choice,data1;printf("1,输入数据2,二分法查找0,退出\n");do{printf("请输入选择:");scanf("%d",&choice);switch(choice){case 1:L=shuru(); //输入数据paixu(L); //数据排序break;case 2:if(L==NULL||L->last==-1){ //查找前检验表中是否有数据printf("\n顺序表为空\n\n");break;}else{printf("请输入要查找的数据:");scanf("%d",&data1);i=BinSrch(L,data1);printf("数据%d的序号(下标)是%d \n\n",data1,i);break;}default:printf("\n请输入正确的选择\n\n");break;case 0:break;}}while(choice!=0);return 0;}实验四#include<stdio.h>#include<stdlib.h>#define SIZE 15typedef struct{int data[SIZE];int last;}RecordList;RecordList *shuru(){ //向顺序表中输入数据int s,i=0;RecordList *L;L=(RecordList *)malloc(sizeof(RecordList));printf("请输入要输入到顺序表中数据的数量:");scanf("%d",&s);if(s>15){printf("超过最大的数据长度");}else{printf("请输入要输入的数据:");for(i=0;i<s;i++)scanf("%d",&L->data[i]);}printf("成功输入%d个数据\n\n",i);L->last=i-1;return L;}void paixu(RecordList *L){ //冒泡排序法对顺序表中的数据进行排序int x,change1=1,change2=1,i,j;for(i=0;change1!=0||change2!=0;i++){change1=0;change2=0;if(i%2==0){for(j=1;j<L->last;j=j+2){if(L->data[j]>L->data[j+1]){x=L->data[j+1];L->data[j+1]=L->data[j];L->data[j]=x;change1=1;}}}else{for(j=0;j<L->last;j=j+2){if(L->data[j]>L->data[j+1]){x=L->data[j+1];L->data[j+1]=L->data[j];L->data[j]=x;change2=1;}}}}}void shuchu(RecordList *L){int i;for(i=0;i<=L->last;i++){printf("%d ",L->data[i]);}}int main(void){RecordList *L=NULL;int choice;printf("1,输入数据2,冒泡排序3,输出0,退出\n");do{printf("请输入选择:");scanf("%d",&choice);switch(choice){case 1:L=shuru(); //输入数据break;case 2:paixu(L); //数据排序printf("排序成功\n\n");break;case 3:shuchu(L);printf("\n");break;default:printf("\n请输入正确的选择\n\n");break;case 0:break;}}while(choice!=0);return 0;}实验五#include<stdio.h>#include<stdlib.h>typedef struct node{int data;struct node *next;}LinkList;LinkList *CreatList(){LinkList *head,*r,*s; //建立带头结点的链表,head为链表的头结点int n;head=(LinkList *)malloc(sizeof(LinkList));head->next=NULL;r=head;printf("请输入要输入的数据的个数:");scanf("%d",&n);printf("请输入要输入的数据:");for(int i=0;i<n;i++){s=(LinkList *)malloc(sizeof(LinkList));scanf("%d",&s->data);s->next=NULL;r->next=s;r=s; //r指向链表的尾节点}return head;}void Add(LinkList *head,int x){LinkList *s,*r,*t;t=(LinkList *)malloc(sizeof(LinkList));r=head;s=head->next;for(;s!=NULL&&x>=s->data;s=s->next){ //要寻找要插入节点的位置r=r->next;}t->data=x;if(s==NULL){ //插入在链表的表尾r->next=t;t->next=NULL;}else{ //插入在链表的中间t->next=r->next;r->next=t;}}void Out(LinkList *head){ //输出表中的数据LinkList *L;L=head->next;printf("表中的数据:");for(;L;L=L->next){printf("%d ",L->data);}printf("\n");}int main(void){LinkList *head;int x;head=CreatList();Out(head);printf("请输入要插入的数据:");scanf("%d",&x);Add(head,x);Out(head);return 0;}实验七#include<stdio.h>#include<stdlib.h>typedef struct node{int data;struct node *next;}LinkList;typedef struct{LinkList *rear;}LinkQueue;LinkQueue *SetQueue(){ //建立空的队列LinkQueue *Q;LinkList *head;Q=(LinkQueue *)malloc(sizeof(LinkQueue));head=(LinkList *)malloc(sizeof(LinkQueue));head->data=-1;head->next=head;Q->rear=head;return Q;}int QueueEmpty(LinkQueue *Q){ //检验对列是否为空LinkList *p;p=Q->rear;if(p->data==-1){return 1;}elsereturn 0;}LinkQueue *Add(LinkQueue *Q,int x){ //数据入队LinkList *p;p=(LinkList *)malloc(sizeof(LinkList));p->data=x;p->next=Q->rear->next;Q->rear->next=p;Q->rear=p;return Q;}void Out(LinkQueue *Q){ //数据出队LinkList *p1,*p2;p1=Q->rear;p2=Q->rear;p2=p2->next;p1=p2->next;if(p1->data==-1){printf("队列为空");return;}printf("出队的数据是%d\n",p1->data);p2->next=p1->next;}LinkQueue *SetNull(LinkQueue *Q){ //队列置空Q->rear=Q->rear->next;Q->rear->next=Q->rear;return Q;}int main(void){LinkQueue *Q=NULL;int choice,x,i;printf("1,建立空队列2,数据入队3,数据出队4,置队空5,检验队空0,退出\n");do{printf("\n请输入选择:");scanf("%d",&choice);switch(choice){case 1:Q=SetQueue();printf("已建立空队列\n");break;case 2:printf("请输入要入队的数据:");scanf("%d",&x);Q=Add(Q,x);break;case 3:Out(Q);break;case 4:Q=SetNull(Q);printf("队列已置空");break;case 5:i=QueueEmpty(Q);if(i==1)printf("队列为空\n");elseprintf("队列未空\n");break;case 0:break;}}while(choice!=0);return 0;}实验八#include<stdio.h>#define SIZE 100void zhuanzhi(int sa[],int n){ //转置函数int m,t;for(int i=0;i<3*n-2;i++){if(i%3!=0){m=i+1;t=sa[i];sa[i]=sa[m]; //交换对称的两个数据sa[m]=t;i++; //跳过矩阵的下三角数据} //矩阵对角线上的数据不进行操作}}void JPrintf(int sa[],int n){ //输出函数int i,j;for(i=1;i<=n;i++){for(j=1;j<=n;j++){if(i==j-1||i==j||i==j+1){ //i==j-1 对角线下方的元素i==j对角线上的元素i==j+1对角线上方的元素printf(" %d",sa[2*i+j-3]);//非零元素在数据中的下标为2*i+j-3}elseprintf(" 0");}printf("\n");}}int main(void){int n,sa[SIZE];printf("请输入三对角矩阵的阶数:");scanf("%d",&n);printf("请依次输入三对角矩阵中的非零数据:");for(int i=0;i<3*n-2;i++){ //三对角矩阵共有3*n-2g个非零元素scanf("%d",&sa[i]);}JPrintf(sa,n);zhuanzhi(sa,n);printf("转置后的矩阵:\n");JPrintf(sa,n);return 0;}实验九#include<stdio.h>#include<stdlib.h>#define maxsize 10typedef struct node{char data;struct node *lchild,*rchild;}Bitree;Bitree *Q[maxsize]; //使用队列临时记录节点地址Bitree *Creatree(){ //建立一个二叉树char ch;int front,rear;Bitree *T,*s;T=NULL;front=1;rear=0;printf("请输入一个二叉树(以#号结束):");ch=getchar();while(ch!='#'){ //以输入“#”结束输入s=NULL;if(ch!='@'){ //输入“@”表示虚节点s=(Bitree *)malloc(sizeof(Bitree)); //如果不是虚节点就建立新节点s->data=ch;s->lchild=s->rchild=NULL;}rear++;Q[rear]=s;if(rear==1) //输入的第一个节点为根节点T=s;else{if(s!=NULL&&Q[front]!=NULL)if(rear%2==0) //若rear为偶数则该节点为父节点的左孩子,否则为右孩子Q[front]->lchild=s;elseQ[front]->rchild=s;if(rear%2==1)front++;}ch=getchar();}return T;}void visite(Bitree *T,int *m){if(T->lchild==NULL&&T->rchild==NULL){ //没有左孩子也没有右孩子就是叶子节点(*m)++;}}void Preorder(Bitree *T,int *m){ //使用递归遍历二叉树if(T){visite(T,m); //访问根节点Preorder(T->lchild,m);Preorder(T->rchild,m);}}int main(void){int *m,n=0;m=&n; //使用一个指针用于记录叶子节点的个数Bitree *T;T=Creatree();Preorder(T,m);printf("该二叉树的叶子节点数:%d\n",n);return 0;}实验十#include<stdio.h>#include<stdlib.h>#define maxsize 10typedef struct node{char data;struct node *lchild,*rchild;}Bitree;Bitree *Q[maxsize]; //使用队列临时记录节点地址Bitree *Creatree(){ //建立一个二叉树char ch;int front,rear;Bitree *T,*s;T=NULL;front=1;rear=0;printf("请输入一个二叉树(以#号结束):");ch=getchar();while(ch!='#'){ //以输入“#”结束输入s=NULL;if(ch!='@'){ //输入“@”表示虚节点s=(Bitree *)malloc(sizeof(Bitree)); //如果不是虚节点就建立新节点s->data=ch;s->lchild=s->rchild=NULL;}rear++;Q[rear]=s;if(rear==1) //输入的第一个节点为根节点T=s;else{if(s!=NULL&&Q[front]!=NULL)if(rear%2==0) //若rear为偶数则该节点为父节点的左孩子,否则为右孩子Q[front]->lchild=s;elseQ[front]->rchild=s;if(rear%2==1)front++;}ch=getchar();}return T;}void visite(Bitree *T,char m[]){ //把中序遍历的数据保存到数据m中int i=0;while(m[i]!='*'){ // * 是数组的结束标志i++;}m[i]=T->data;m[i+1]='*';}void Inorder(Bitree *T,char m[]){ //中序遍历递归算法if(T){Inorder(T->lchild,m);visite(T,m);Inorder(T->rchild,m);}}int Pan(char m[]){int i=0,j=0; //j==0是表示是二叉树while(m[i+1]!='*'){if(m[i]>m[i+1]){j=1; //j==1是表示不是二叉树break;}i++;}return j;}int main(void){Bitree *T;int j;T=Creatree();char m[50];m[0]='*';Inorder(T,m);j=Pan(m);if(j==1){printf("该二叉树不是二叉排序树\n");}elseprintf("该二叉树是二叉排序树\n");return 0;}实验十一#include<stdio.h>#include<stdlib.h>#include<iostream.h>#define MAX_VERTEX_NUM 100/* 临接表的数据类型定义*/typedef struct node{int adjvex; //邻接点位置struct node *nextarc; //指向下一个结点char info; //边得信息}ARCNODE;typedef struct VEXNODE{char vexdata; //顶点信息ARCNODE *firstarc; //指向第一个邻接点}VEXNODE,AdjList[MAX_VERTEX_NUM];typedef struct{ //邻接表类型AdjList vextices;int vexnum,arcnum; //顶点数目,边数目}ALGraph;ALGraph create_AdjListGraph(){ //建立邻接表int n,e,i,j,k;ALGraph alg;ARCNODE *p,*q;printf("请输入顶点数:");scanf("%d",&n);for(i=0;i<=n;i++){ //初始化邻接表alg.vextices[i].vexdata=(char)i;alg.vextices[i].firstarc=NULL;}printf("请输入边数:");scanf("%d",&e);printf("请输入图的信息:\n");for(i=0;i<e;i++){ //建立无向图的邻接表scanf("%d%d",&j,&k); //输入边的信息p=(ARCNODE *)malloc(sizeof(ARCNODE));p->adjvex=k;p->info=' ';p->nextarc=alg.vextices[j].firstarc; //把节点接到链表上alg.vextices[j].firstarc=p;q=(ARCNODE *)malloc(sizeof(ARCNODE));q->adjvex=j;q->info=' ';q->nextarc=alg.vextices[k].firstarc; //把节点接到链表上alg.vextices[k].firstarc=q;}alg.vexnum=n;alg.arcnum=e;return alg;}/* 邻接矩阵的数据类型定义*/typedef struct{int num; //顶点序号char data; //顶点数据}VERTEX;typedef struct{ //邻接矩阵类型int n; //顶点数目int e; //边的数目VERTEX vexs[MAX_VERTEX_NUM]; //存储顶点int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵,存储边}MGraph;MGraph *ALG_MG(ALGraph alg){ //邻接表转化为邻接矩阵MGraph *mg;ARCNODE *arc;mg=(MGraph *)malloc(sizeof(MGraph));mg->n=alg.vexnum;mg->e=alg.arcnum;int i,j;for(i=0;i<=alg.vexnum;i++) //初始化邻接矩阵for(j=0;j<=alg.vexnum;j++){mg->edges[i][j]=0;}for(i=1;i<=alg.vexnum;i++){mg->vexs[i].num=i; //依次从邻接表中把顶点信息读入到邻接矩阵中mg->vexs[i].data=alg.vextices[i].vexdata;arc=alg.vextices[i].firstarc;for(;arc!=NULL;arc=arc->nextarc){ //从邻接表中把边得信息读入到邻接矩阵中mg->edges[i][arc->adjvex]=1;}}return mg;}void Palg(ALGraph G){ //输出邻接表int i,j;ARCNODE *p;printf("输出图为:\n");for(i=1;i<=G.vexnum;i++){p=G.vextices[i].firstarc;j=0;while(p!=NULL){printf("(%d,%d)",i,p->adjvex);p=p->nextarc;j=1;}if(j==1)cout<<endl;}}void Pmg(MGraph *mg){ //输出邻接矩阵for(int i=1;i<=mg->n;i++){ //遍历邻接矩阵for(int j=1;j<=mg->n;j++){printf("%d ",mg->edges[i][j]);}printf("\n");}}int main(void){ALGraph alg;MGraph *mg;alg=create_AdjListGraph();Palg(alg);mg=ALG_MG(alg);printf("转化为邻接矩阵为:\n");Pmg(mg);return 0;}实验十二#include<stdio.h>#include<string.h>#define MAX 50typedef struct{ //学生信息结构char name[20];char id[10];int age;char address[20];char tel[15];}PersonInfo;typedef struct{ //班级信息结构PersonInfo person[MAX];char classid[10];int count;}ClassInfo;int xCinfo(ClassInfo Cinfo[]){ //寻找班级号对应的下标char cid[10];printf("请输入班级号:");scanf("%s",cid);strcpy(Cinfo[0].classid,cid);for(int i=1;Cinfo[i].count>0;i++);i--;for(;i>0;i--){if(strcmp(Cinfo[i].classid,cid)==0)break;}if(i==0){printf("不存在该班级\n");return -1;}elsereturn i;}void inSinfo(ClassInfo Cinfo[]){PersonInfo si;int i;i=xCinfo(Cinfo);if(i==-1)return;printf("请输入学生姓名:");scanf("%s",);printf("请输入学生学号:");scanf("%s",si.id);printf("请输入学生年龄:");scanf("%d",&si.age);printf("请输入学生宿舍号:");scanf("%s",si.address);printf("请输入学生电话:");scanf("%s",si.tel);for(int j=1;Cinfo[i].person[j].age>0;j++);Cinfo[i].person[j]=si;Cinfo[i].person[j+1].age=-1;Cinfo[i].count++;printf("信息已插入\n");}void CreateClass(ClassInfo Cinfo[]){ //建立班级ClassInfo ci;printf("请输入班号:");scanf("%s",ci.classid);printf("请输入班级成员总数:");scanf("%d",&ci.count);for(int i=1;Cinfo[i].count>0;i++);Cinfo[i]=ci;for(int j=1;j<=Cinfo[i].count;j++){ //输入学生信息printf("请输入学生姓名:");scanf("%s",Cinfo[i].person[j].name);printf("请输入学生学号:");scanf("%s",Cinfo[i].person[j].id);printf("请输入学生年龄:");scanf("%d",&Cinfo[i].person[j].age);printf("请输入学生宿舍号:");scanf("%s",Cinfo[i].person[j].address);printf("请输入学生电话:");scanf("%s",Cinfo[i].person[j].tel);printf("\n");}Cinfo[i+1].count=-1;}int xSinfo(ClassInfo Cinfo[],int i){//寻找学号对应的下标char sid[10];printf("请输入学生的学号:");scanf("%s",sid);int j;for(j=Cinfo[i].count;j>0;j--){if(strcmp(Cinfo[i].person[j].id,sid)==0)break;}if(j==0){printf("不存在该学号的学生");return -1;}elsereturn j;}void OutSinfo(ClassInfo Cinfo[]){ //输入学生的信息int i;i=xCinfo(Cinfo);if(i==-1)return;int j;j=xSinfo(Cinfo,i);if(j==-1)return;else{printf("该学生的信息:\n");printf("学号:%s\n",Cinfo[i].person[j].id);printf("姓名:%s\n",Cinfo[i].person[j].name);printf("年龄:%d\n",&Cinfo[i].person[j].age);printf("宿舍:%s\n",Cinfo[i].person[j].address);printf("电话:%s\n",Cinfo[i].person[j].tel);}}void OutCinfo(ClassInfo Cinfo[]){//输入班级信息int i;i=xCinfo(Cinfo);if(i==-1)return;else{printf("班级号:%s\n",Cinfo[i].classid);printf("成员总数:%d\n",Cinfo[i].count);printf("学生信息:\n");for(int j=1;j<=Cinfo[i].count;j++){ //输入班级中学生的信息printf("学号:%s\n",Cinfo[i].person[j].id);printf("姓名:%s\n",Cinfo[i].person[j].name);printf("年龄:%d\n",&Cinfo[i].person[j].age);printf("宿舍:%s\n",Cinfo[i].person[j].address);printf("电话:%s\n",Cinfo[i].person[j].tel);printf("\n");}}}void DelCinfo(ClassInfo Cinfo[]){ //删除班级信息int i;i=xCinfo(Cinfo);if(i==-1)return;else{for(;Cinfo[i].count>0;i++){Cinfo[i]=Cinfo[i+1];}printf("信息已删除\n");}}void DelSinfo(ClassInfo Cinfo[]){ //删除学生信息int i,j;i=xCinfo(Cinfo);if(i==-1){return;}else{j=xSinfo(Cinfo,i);if(j==-1)return;else{for(;j<=Cinfo[i].count;j++){Cinfo[i].person[j]=Cinfo[i].person[j+1];}Cinfo[i].count--;printf("信息已删除\n");}}}void UpdataCinfo(ClassInfo Cinfo[]){ //修改班级信息int i;i=xCinfo(Cinfo);if(i==-1)return;printf("请输入修改后的班号:");scanf("%s",Cinfo[i].classid);printf("信息已修改\n");}void UpdataSinfo(ClassInfo Cinfo[]){ //修改学生信息int i,j;i=xCinfo(Cinfo);if(i==-1){return;}j=xSinfo(Cinfo,i);if(j==-1){return;}printf("请输入学生姓名:");scanf("%s",Cinfo[i].person[j].name);printf("请输入学生学号:");scanf("%s",Cinfo[i].person[j].id);printf("请输入学生年龄:");scanf("%d",&Cinfo[i].person[j].age);printf("请输入学生宿舍号:");scanf("%s",Cinfo[i].person[j].address);printf("请输入学生电话:");scanf("%s",Cinfo[i].person[j].tel);printf("信息已修改\n");}void Infile(ClassInfo Cinfo[]){ //把信息写入文件FILE *fp;int i=1;if((fp=fopen("Cinfo1.txt","wb"))==NULL){printf("打开文件失败\n");return;}for(;Cinfo[i].count>0;i++){if(fwrite(&Cinfo[i],sizeof(ClassInfo),1,fp)!=1)printf("文件写入失败\n");}fclose(fp);}void Outfile(ClassInfo Cinfo[]){ //把文件中的信息写入到程序FILE *fp;int i=1;if((fp=fopen("Cinfo1.txt","rb"))==NULL){printf("打开文件失败\n");return;}for(;!feof(fp);i++){fread(&Cinfo[i],sizeof(ClassInfo),1,fp);}fclose(fp);}int main(void){int choice;ClassInfo Cinfo[MAX];printf("--------------------菜单----------------------\n");printf("1,建立班级 2,插入学生信息3,显示班级信息\n");printf("4,显示学生信息5,删除班级6,删除学生信息\n");printf("7,修改班级信息 8,修改学生信息9,写入文件\n");printf("10,载入文件0,退出\n");do{printf("\n请输入选择:"); //分别调用不同的函数实现不同的功能scanf("%d",&choice);switch(choice){case 1:CreateClass(Cinfo);break;case 2:inSinfo(Cinfo);break;case 3:OutCinfo(Cinfo);break;case 4:OutSinfo(Cinfo);break;case 5:DelCinfo(Cinfo);break;case 6:DelSinfo(Cinfo);break;case 7:UpdataCinfo(Cinfo);break;case 8:UpdataSinfo(Cinfo);break;case 9:Infile(Cinfo);printf("保存文件成功\n");break;case 10:Outfile(Cinfo);printf("载入成功\n");break;case 0:break;}}while(choice!=0);return 0;}。

源代码--数据结构与算法(Python版)chap8 图

源代码--数据结构与算法(Python版)chap8 图
22
最短路径
最短路径是指两个顶点(源点到终 点)之间经过的边上权值之和最少 的路径。
下面介绍两种计算最短路径算法:
迪杰斯特拉(Djikstra)算法
佛洛伊德(Floyd)算法。
23
最短路径
1. 迪杰斯特拉(Djikstra)算法 迪杰斯特拉算法并非一下子求出起始点到结束点的 最短路径,而是一步步求出它们之间顶点的最短路 径,即基于已经求出的最短路径,逐步求得更远顶 点的最短路径,最终达到目的。通过Dijkstra计算图 G中的最短路径时,需要引进两个集合S和U。其中 ,集合S用于存放已求出最短路径的顶点(以及相 应的最短路径长度),集合U用于存放还未求出最 短路径的顶点(以及该顶点到起点的距离)。
u = q.popleft() print(u," ",end="") for w in G[u]:
if w not in visited: q.append(w) visited.add(w)
print('广度深度优先bfs') bfs(G, 0)
16
最小生成树
构造连通图的最小代价生成树称为 最小生成树。 最小生成树实现算法:
11
递归深度优先
from collections import deque def dfs(G, v, visited=set()):
print(v," ",end="") visited.add(v) # 用来存放已经访问过的顶点 # G[v] 是这个顶点的相邻的顶点 for u in G[v]:
24
最短路径
迪杰斯特拉算法具体步骤包括:
步骤1:初始时,S只包含起点s;U包含除s外的其他顶点,且U中顶点 的距离为"起点s到该顶点的距离,若s和v不相邻,则距离为∞。 步骤2:从U中选出距离最短的顶点k,并将顶点k加入到S中;同时,从 U中移除顶点k。 步骤3:更新U中各个顶点到起点s的距离。之所以更新U中顶点的距离 ,是由于上一步中确定了k是求出最短路径的顶点,从而借助中间定点后 的距离可能小于两顶点的直接距离,即 (s,k)+(k,v)可能小于(s,v)。 步骤4: 重复步骤步骤2和步骤3,直到遍历完所有顶点。

数据结构与算法源代码

数据结构与算法源代码

课程说明:数据结构一共四天课程,day01~~~day04.CSD DataStructure DAY011.基于顺序表的堆栈2.基于链式表的堆栈1 基于顺序表的堆栈栈是一种特殊的线性表,是限定在线性表表尾进行插入删除操作的线性表。

由栈的概念衍生出几个子概念,它们是:1)栈顶,即允许进行插入、删除操作的一端,又称为表尾,用栈顶指针()来指示栈顶元素。

2)栈底,即固定端,又称为表头3)空栈,即栈当中没有数据元素。

顺序栈是采用顺序存储结构的栈,即使用一组连续的存储单元(一般使用数组)来模拟栈,依次存放栈中的数据元素。

1.1 方案顺序栈的基本操作包括:1) 初始化操作,在初始化操作中将建立一个空栈。

2) 判断栈空,判断栈中的数据元素个数是否为0。

3) 入栈,在栈中加入一个数据元素。

4) 出栈,在栈中删除一个数据元素。

5) 取栈顶元素,将栈顶元素取出,但并不在栈中删除该元素。

1.2 步骤实现此案例需要按照如下步骤进行。

步骤一:定义栈在C语言中:1)定义一个一维数组来表示栈的顺序存储空间。

2)定义一个变量来指出栈顶的位置。

3)这两方面的信息共同描述一个栈,可将它们用结构体封装在一起。

代码如下:1.#define LISTSIZE 102.typedef int DataType;3.struct Stack {4.DataType data[LISTSIZE];5.int;//除了记录大小还可以记录栈顶位置6.};上述代码中,以下代码:1.#define LISTSIZE 100是用一个宏常量来定义顺序表的容量,这样定义的好处是当需要修改顺序表的容量的时候,只需要修改该宏常量即可。

上述代码中,以下代码:1.typedef int DataType;是将数据类型int起了一个别名叫做DataType,并在后面的程序中只使用DataType,而不使用int。

这样做的好处是当堆栈中的数据类型发生变化时,只需要修改此句中的int 为要改变的数据类型,即可将程序中所有数据变量的数据类型变成指定的类型。

数据结构实验源代码

数据结构实验源代码

数据结构实验源代码【附】数据结构实验源代码范本一、实验背景与目的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 顺序表:一种物理上相邻的存储结构,元素按照顺序依次存放。

数据结构题目及c语言代码

数据结构题目及c语言代码

数据结构题目及c语言代码Pleasure Group Office【T985AB-B866SYT-B182C-《数据结构》课程设计题目(程序实现采用C语言)题目1:猴子选王(学时:3)一堆猴子都有编号,编号是1,2,3 ...m,这群猴子(m个)按照1-m 的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。

要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。

n");return;}n", position+1);}}}ame,&stuff[i].department,&stuff[i].basepay,&stuff[i].allowance);if((fp=fopen("","wb"))==NULL){printf("Can't open file\n");return 0;}for(i=0;i<SIZE;i++)if(fwrite(&stuff[i],LENTH,1,fp)!=1)printf("文件写入出错\n");fclose(fp);if((fp=fopen("","rb"))==NULL){printf("Can't open file\n");}printf("修改过后的结果:\n");for(i=0;i<SIZE;i++){fread(&stuff[i],LENTH,1,fp);stuff[i].total=stuff[i].basepay+100+stuff[i].allowance;printf("%-10s%-10s %f %f %f\n",stuff[i].name,stuff[i].department,stuff[i].basepay+100,stuff[i].allo wance,stuff[i].total);}fclose(fp);return 0;}题目4:满足条件的有序表生成(学时:3)已知三个有序表A、B、C,它们皆由同一类元素构成,现要求对于表A 作以下运算而获得有序表D:排出A中所有的既在B中又在C中出现的元素。

数据结构与算法编程题

数据结构与算法编程题

数据结构与算法编程题以下是一些数据结构与算法的编程题:1. 实现一个栈(Stack)数据结构,包括入栈(push)、出栈(pop)、获取栈顶元素(top)和判断栈是否为空(isEmpty)的操作函数。

2. 实现一个队列(Queue)数据结构,包括入队(enqueue)、出队(dequeue)、获取队首元素(front)和判断队列是否为空(isEmpty)的操作函数。

3. 实现一个链表(LinkedList)数据结构,包括在指定位置插入元素(insert)、删除指定位置的元素(remove)、获取链表的长度(size)和判断链表是否为空(isEmpty)的操作函数。

4. 实现一个二叉树(Binary Tree)数据结构,包括创建二叉树(create)、遍历二叉树的前序遍历(preorder)、中序遍历(inorder)和后序遍历(postorder)的操作函数。

5. 给定一个整数数组,找出数组中两个数的和等于给定目标值的所有组合。

例如,给定数组[2, 7, 11, 15]和目标值9,返回[[2, 7]]。

6. 给定一个无序数组,找出数组中长度最长的连续子序列的长度。

例如,给定数组[100, 4, 200, 1, 3, 2],最长连续子序列为[1, 2, 3, 4],返回4。

7. 给定一个数组,找出数组中两个数的乘积最大的值。

例如,给定数组[1, 2, 3, 4],乘积最大的两个数为3和4,返回12。

8. 给定一个字符串,判断它是否是有效的括号序列。

例如,给定字符串"({})",返回true;给定字符串"{(})",返回false。

以上问题只是一小部分例子,数据结构与算法的编程题非常广泛,可以根据自己的兴趣和需求选择适合的题目进行练习。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、有较好的出错处理机制,算法高效
4、有较好的图形界面便于人机交互,路径长度和道路编号明晰【可选】
附录如下——
#include<stdio.h>
#include <stack>
#include<string>
#include<iostream>
using namespace std;
const int in=65535;
cout << " 2鼓楼12莫愁湖" << endl;
cout << " 3草场门13总统府" << endl;
cout << " 4中央门14杨公井" << endl;
cout << " 5南京西站15夫子庙" << endl;
cout << " 6长途东站16雨花台" << endl;
cout << " 7南邮仙林17江宁" << endl;
{
int A[MAXVEX][MAXVEX],path[MAXVEX][MAXVEX]; //数组A保存最短路线的长度,数组path保存最短路线
int i,j,k,pre;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
A[i][j]=cost[i][j]; //初始化数组A和数组path
int i,j;
for(i=0;i<MAXVEX;i++)
for(j=0;j<MAXVEX;j++)
if(i==j)
w[i][j]=w[j][i]=0;
=in;
//道路存在且不堵塞时,赋值
w[0][1]=w[1][0]=1;
w[0][2]=w[2][0]=3;
w[0][3]=w[3][0]=5;
const int MAXVEX=20; //地点的个数
stack <int >a; //声明1个存储int型元素的栈,栈名是a
struct node //创建节点类,保存地点编号和地点名称
{
int size; //地点编号
string name; //地点名称
}locat[20];
void Floyd(int cost[][MAXVEX],int n,int m,int x) //弗洛伊德算法,求最短路线和最短路线长度
cout<<endl;
cout<<"是否继续查询(1/0):";
cin>>h;
cout<<endl;
}while(h);
return 0;
}
cout << " 8紫金山18长江大桥" << endl;
cout << " 9珠江路19四牌楼" << endl;
cout<<endl;
}
int main() //主函数
{ int i,j,x,y;
Menu(); //调用菜单函数、地址函数
Place();
int length[MAXVEX][MAXVEX]; //定义一个二维数组,存放路径长度
locat[10].size=10; locat[10].name="月牙湖";
locat[11].size=11; locat[11].name="新街口";
locat[12].size=12; locat[12].name="莫愁湖";
locat[13].size=13; locat[13].name="总统府";
a.pop();
i++;
if(i==5)
cout<<endl;
}
cout << endl;
}
else cout<<"您还是在原点!"<<endl; //起始地点与终止地点相同
}
void Place() //地址函数,初始化地点编号、地点名称
{
locat[0].size=0; locat[0].name="三牌楼";
算法与数据结构设计题与源代码
------关于最短路径的问题
该最短路径算法主要以南京市的道路交通为模板(具体见附录图),简单实现任意两个地点之间最短路径查询(例如三牌楼——新街口),该最短路径剔除了那些由于某些原因堵塞不通的路径。
具体要求:
1、编程实现,数据结构选用邻接矩阵或邻接表来实现
2、输出最短路径的完整信息(起点、终点、中间遍历点、路径总长度)
cout<<"请重新输入:";
cin>>y;
}
cout<<y<< "\t" << locat[y].name << endl;
cout<<"以下是从"<<locat[x].name<<"出发到"<<locat[y].name<<"的最短路径:"<<endl ;
cout<<endl;
Floyd(length,MAXVEX,x,y); //调用弗洛伊德算法
w[5][6]=w[6][5]=5;
w[5][9]=w[9][5]=12;
w[5][18]=w[18][5]=4;
w[6][7]=w[7][6]=7;
w[6][8]=w[8][6]=4;
w[7][8]=w[8][7]=7;
w[8][9]=w[9][8]=6;
w[9][10]=w[10][6]=3;
w[11][14]=w[14][11]=3;
locat[1].size=1; locat[1].name="山西路";
locat[2].size=2; locat[2].name="鼓楼";
locat[3].size=3; locat[3].name="草场门";
locat[4].size=4; locat[4].name="中央门";
locat[5].size=5; locat[5].name="南京西站";
w[11][19]=w[19][11]=3;
w[13][14]=w[14][13]=2;
w[13][19]=w[19][13]=2;
w[14][15]=w[15][14]=3;
w[14][16]=w[16][14]=4;
w[16][17]=w[17][16]=5;
return w[p][q];
}
void Menu() //菜单函数
}
}
if(m!=x) //起始地点与终止地点不同时,用栈存储最短路径,进行以下操作
{
cout << "您所查询的最短路径长度是:" << A[m][x] << "米\n";
cout << "具体路径为:" << locat[m].name;
a.push(x); //终点的编号入栈
pre=path[m][x];
locat[18].size=18; locat[18].name="长江大桥";
locat[19].size=19; locat[19].name="四牌楼";
}
int Value(int p,int q) //数值函数,初始化权值,并输出从p点到达q点的路径长度
{
int w[MAXVEX][MAXVEX];
while(1) //最短路径的地点入栈,一直到pre为起始地点的编号,才结束
{
a.push(pre);
pre=path[m][pre];
if (pre==m) break;
}
i=1;
while (!a.empty()) //栈为非空时,数据出栈
{
cout << " ---> " << locat[a.top()].name;
{
cout << "欢迎使用南京市地图最短路线查询:" << endl;
cout << "----------序号--地点名称-------------序号---地点名称-----------" << endl;
cout << " 0三牌楼10月牙湖" << endl;
cout << " 1山西路11新街口" << endl;
locat[14].size=14; locat[14].name="杨公井";
locat[15].size=15; locat[15].name="夫子庙";
locat[16].size=16; locat[16].name="雨花台";
locat[17].size=17; locat[17].name="江宁";
w[0][4]=w[4][0]=2;
相关文档
最新文档