DATA STRUCTURE(WORD文件及时更新)
- 格式:doc
- 大小:78.00 KB
- 文档页数:15
Bitree.cpp #include #include typedef char datatype; /*结点属性值的类型*/ typedef struct node { /*二叉树结点的类型*/ datatype data; struct node *lchild, *rchild; } bintnode; typedef bintnode *bintree;
void createbintree(bintree *t) { char ch; if ((ch=getchar())==' ') *t=NULL; else { *t=(bintnode *)malloc(sizeof(bintnode)); /*生成二叉树的根结点*/ (*t)->data=ch; createbintree(&(*t)->lchild); /*递归实现左子树的建立*/ createbintree(&(*t)->rchild); /*递归实现右子树的建立*/ } } void preorder(bintree t) { if (t) { printf("%c",t->data); preorder(t->lchild); preorder(t->rchild); } } bintree locate(bintree t, datatype x) { bintree p; if (t==NULL) return NULL; else if (t->data==x) return t; else { p=locate(t->lchild,x); if (p) return p; else return locate(t->rchild,x); } } int numofnode(bintree t) { if (t==NULL) return 0; else return(numofnode(t->lchild)+numofnode(t->rchild)+1); } main() { bintree root,p; char x; int num; createbintree(&root); preorder(root); scanf("%c",&x); /*注意:此处输入数据方式,否则容易处理成回车换行*/ p=locate(root,x); if (p) printf(" \nfound\n"); else printf("\n not found\n"); num=numofnode(root); printf("\n Number of node=%d\n",num); }
graph-dijkstra.cpp #include #include #define FINITY 5000 /*此处用5000代表无穷大*/ #define m 20 /*最大顶点数*/ typedef char vertextype; /*顶点值类型*/ typedef int edgetype; /*权值类型*/ typedef struct{ vertextype vexs[m]; /*顶点信息域*/ edgetype edges[m][m]; /*邻接矩阵*/ int n,e; /*图中顶点总数与边数*/ } mgraph; /*邻接矩阵表示的图类型*/ typedef enum{FALSE,TRUE} boolean; /*false为0,true为1*/ typedef int dist[m]; /* 距离向量类型*/ typedef int path[m]; /* 路径向量类型*/ void creatmgraph1(mgraph *g) {int i,j,k,w; /*建立有向网络的邻接矩阵存储结构*/ printf("please input n and e:\n"); scanf("%d%d",&g->n,&g->e); /*输入图的顶点数与边数*/ getchar(); /*取消输入的换行符*/ printf("please input vexs:\n"); for(i=0;in;i++) /*输入图中的顶点值*/ g->vexs[i]=getchar(); for(i=0;in;i++) /*初始化邻接矩阵*/ for(j=0;jn;j++) if (i==j) g->edges[i][j]=0; else g->edges[i][j]=FINITY; printf("please input edges:\n"); for (k=0;ke;k++) /*输入网络中的边*/ { scanf("%d%d%d", &i,&j,&w); g->edges[i][j]=w; /*若是建立无向网,只需在此加入语句g->edges[j][i]=w;即可*/ //g->edges[j][i]=w; } } void spath_dij(mgraph g,int v0,path p,dist d) { boolean final[m]; int i,k,v,min; /* 第1步 初始化集合S与距离向量d */ for (v=0;v{ final[v]=FALSE; d[v]=g.edges[v0][v]; if (d[v]驱 */ } final[v0]=TRUE; d[v0]=0; /*初始时s中只有v0一个顶点*/ /* 第2步 依次找出n-1个结点加入S中 */ for (i=1;i{ min=FINITY; for (k=0;kif (!final[k] && d[k]在V-S中 */ printf("\n%c---%d\n",g.vexs[v],min); /*输出本次入选的顶点及距离*/ if (min==FINITY) return; final[v]=TRUE; /* V加入S*/ /*第3步 修改S与V-S中各结点的距离*/ for (k=0;kif ( !final[k] && (min+g.edges[v][k]< d[k]) ) { d[k]=min+g.edges[v][k]; p[k]=v; } } /* end for */ } void print_gpd(mgraph g,path p,dist d) { /*输出有向图的最短路径*/ int st[20],i,pre,top=-1; /*定义栈st并初始化空栈*/ for (i=0;i{ printf("\nDistancd: %7d , path:" ,d[i]); st[++top]=i; pre=p[i]; /*从第i个顶点开始向前搜索最短路径上的顶点*/ while (pre!=-1) { st[++top]=pre; pre=p[pre]; } while (top>0) printf("%2d",st[top--]); } } void main() /*主程序*/ { mgraph g; /* 有向图 */ path p; /* 路径向量 */ dist d; /* 最短路径向量 */ int v0; creatmgraph1(&g); /*创建有向网的邻接矩阵*/ // print(g); /*输出图的邻接矩阵*/ printf("please input the source point v0:"); scanf("%d",&v0); /*输入源点*/ spath_dij(g,v0,p,d); /*求v0到其他各点的最短距离*/ print_gpd(g,p,d); /*输出V0到其它各点的路径信息及距离*/ }
graph-kruskal.cpp #include #include #define FINITY 5000 /*此处用5000代表无穷大*/ #define m 20 /*最大顶点数*/ #define E 50 /*最大边数*/ typedef char vertextype; /*顶点值类型*/ typedef struct edgedata { int beg,en; /*beg,en是结点序号*/ int length; /*边长*/ } edge; typedef struct{ vertextype vexs[m]; /*顶点信息域*/ edge edges[E]; /*边*/ int n,e; /*图中顶点总数与边数*/ } edgegraph; /*图类型*/ void creatgraph(edgegraph *g) {int i,j,k,w; printf("please input n and e:\n"); scanf("%d%d",&g->n,&g->e); /*输入图的顶点数与边数*/ getchar(); /*取消输入的换行符*/ printf("please input vexs:\n"); for(i=0;in;i++) /*输入图中的顶点值*/ g->vexs[i]=getchar(); printf("please input edges:\n"); for (k=0;ke;k++) /*按从小到大次序输入网络中的边*/ { scanf("%d%d%d", &i,&j,&w); g->edges[k].beg=i; g->edges[k].en=j; g->edges[k].length=w; } } void kruskal(edge adjlist[],edge tree[],int cnvx[],int n) { int v=0,j,k; for (j=0;jcnvx[j]=j; /* 设置每一个顶点的连通分量 */ for (k=0;k{ while (cnvx[adjlist[v].beg]==cnvx[adjlist[v].en] ) v++; /*找到属于两个连通分量权最小的边,边表按从小到大已排好序*/ tree[k]=adjlist[v]; /*将边v加入到生成树中*/ for (j=0;jif (cnvx[j]==cnvx[adjlist[v].en]) cnvx[j]=cnvx[adjlist[v].beg]; v++; } printf("最小生成树是:\n"); for (j=0;jprintf("%3d%3d%6d\n",tree[j].beg,tree[j].en,tree[j].length); }
main() { edgegraph g;