#include <iostream.h>
#include "stdlib.h"
#define MAXN 50
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
int info;
}ArcNode; //边结点类型
typedef struct VNode{
char data;
ArcNode *firstarc;
}VNode,AdjList[MAXN];
typedef struct{
AdjList vertices; //邻接表
int vexnum,arcnum;
}ALGraph;
//查找顶点u的序号
int LocateVex(ALGraph G,char u)
{
int i;
for (i=0;i<G.vexnum;i++)
{ if(u==G.vertices[i].data) return i; }
if (i==G.vexnum)
{cout<<"Error u!\n";exit(1);}
return 0;
}
//建立无向网的邻接邻接表
void CreateUDG(ALGraph &G)
{ int i,j,k,w; char v1,v2;
ArcNode *p;
cout<<"输入无向网的顶点数和边数:vexnum & arcnum:";
cin>>G.vexnum>>G.arcnum;
cout<<"输入顶点:";
for (i=0;i<G.vexnum;i++)
{ cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
cout<<"Input Arcs(v1,v2 & w): ";
for (k=0;k<G.arcnum;k++)
{ cin>>v1>>v2>>w;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info = w;
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=i;
p->info = w;
p->nextarc=G.vertices[j].firstarc;
G.vertices[j].firstarc=p;
}
}
//建立有向网的邻接表
void CreateDG(ALGraph &G)
{ int i,j,k,w; char v1,v2;
ArcNode *p;
cout<<"请输入有向网的顶点数和弧数vexnum & arcnum:";
cin>>G.vexnum>>G.arcnum;
cout<<"输入顶点Vertices:";
for (i=0;i<G.vexnum;i++)
{ cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
cout<<"Input Arcs(v1,v2 & w): ";
for (k=0;k<G.arcnum;k++)
{ cin>>v1>>v2>>w;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info = w;
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
}
}
//输出图的邻接表的存储结构
void printG(ALGraph G)
{int i;ArcNode *p;
cout<<"图的邻接表是:"<<endl;
for(i=0;i<G.vexnum;i++)
{cout<<i<<" "<<G.vertices[i].data<<" ";
p=G.vertices[i].firstarc;
while(p!=0)
{cout<<"->"<<p->adjvex<<" "<<p->info;p=p->nextarc;}
cout<<endl;
}
}
int visited[MAXN];//全局变量
//从第v个顶点出发DFS
//深度优先搜索
void DFS(ALGraph G, int v)
{ ArcNode *p;
cout<<G.vertices[v].data;
visited[v]=1;
p=G.vertices[v].firstarc;
while (p)
{if (!visited[p->adjvex]) DFS(G,p->adjvex);
p=p->nextarc;
}
}
//深度优先遍历图中所有顶点
void DFSTraverse(ALGraph G){
for (int v=0;v<G.vexnum;++v)
visited[v]=0;
for (v=0;v<G.vexnum;++v)
if (!visited[v]) DFS(G,v);
cout<<endl;
}
//广度优先遍历,从顶点v出发BFS
void BFS(ALGraph G,int v)
{ ArcNode *p;
int qu[MAXN],front,rear;
front=rear=0;
cout<<G.vertices[v].data;
visited[v]=1;
rear=(rear+1)%MAXN;
qu[rear]=v;
while (front!=rear)
{ front=(front+1)%MAXN;
v=qu[front];
p=G.vertices[v].firstarc;
while (p)
{ if (!visited[p->adjvex])
{cout<<G.vertices[p->adjvex].data;
visited[p->adjvex]=1;
rear=(rear+1)%MAXN;
qu[rear]=p->adjvex;
}
p=p->nextarc;
}
}
}
//广度优先遍历图中所有顶点
void BFSTraverse(ALGraph G){
for (int v=0;v<G.vexnum;++v)
visited[v]=0;
cout<<"广度优先遍历序列为:"<<endl;
for (v=0;v<G.vexnum;++v)
if (!visited[v]) BFS(G,v);
}
//求有向网各顶点的出度
void chudu(ALGraph G)
{int i;
int du[100]; ArcNode *p;
for(i=0;i<G.vexnum;i++) du[i]=0;
for(i=0;i<G.vexnum;i++)
{
p=G.vertices[i].firstarc;
while(p!=0)
{du[i]++;
p=p->nextarc;
}
}
cout<<"有向网中各顶点的出度是:"<<endl;
for(int k=0;k<G.vexnum;k++)
cout<<G.vertices[k].data<<"的出度是:"<<du[k]<<endl;
}
int rudu[100];
//求有向网各顶点入度
void rdu(ALGraph G)
{int i;
ArcNode *p;
for(i=0;i<G.vexnum;i++) rudu[i]=0;
for(i=0;i<G.vexnum;i++)
{
p=G.vertices[i].firstarc;
while(p!=0)
{rudu[p->adjvex]++;
p=p->nextarc;
}
}
cout<<"有向网中各顶点的入度是:"<<endl;
for(int k=0;k<G.vexnum;k++)
cout<<G.vertices[k].data<<"的入度是:"<<rudu[k]<<endl;
}
//拓扑排序
int topsort(ALGraph G)
{
rdu(G);
int stack[30],top=-1;
int count,j,k;
ArcNode *p;
for(int i=0;i<G.vexnum;i++)
if(rudu[i]==0) stack[++top]=i;
count=0;
while(top!=-1)
{ j=stack[top--];
cout<<j<<" "<<G.vertices[j].data<<endl;
++count;
for(p=G.vertices[j].firstarc;p;p=p->nextarc)
{k=p->adjvex;
if(--rudu[k]==0) stack[++top]=k;
}
}
if(count<G.vexnum) return -1;
else return 1;
}
//求有向网中各顶点的度
void du(ALGraph G)
{int i;
int du[100]; ArcNode *p;
for(i=0;i<G.vexnum;i++) du[i]=0;
for(i=0;i<G.vexnum;i++)
{p=G.vertices[i].firstarc;
while(p!=0)
{du[p->adjvex]++;du[i]++;
p=p->nextarc;
}
}
cout<<"有向网中各顶点的度是:"<<endl;
cout<<"顶点"<<" 度"<<endl;
for(int k=0;k<G.vexnum;k++)
cout<<G.vertices[k].data<<" "<<du[k]<<endl;
}
//遍历算法的应用
//试写一算法,判别有向图中是否存在由顶点i到顶点j的路径(i!=j),分别用深度和广度优先搜索
//1.深度方法1
int tag[MAXN];
int pathexist(ALGraph G,int i,int j)
{ArcNode *p;
int k;
if(i==j) return 1;
else
{
tag[i]=1;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{ k=p->adjvex;
if(tag[k]==0&& pathexist(G,k,j)) return 1;
}
}
return 0;
}
//深度方法2
int ispath(ALGraph G,int i,int j)
{
int k;
for(k=0;k<G.vexnum;k++)
visited[k]=0;
DFS(G,i);
if(visited[j]==1) return 1;
else
return 0;
}
//2.基于广度
int pathBFS(ALGraph G,int i,int j)
{ ArcNode *p;
int qu[MAXN],front,rear,k,u;
front=rear=0;
rear=(rear+1)%MAXN;
qu[rear]=i;
while (front!=rear)
{ front=(front+1)%MAXN;
k=qu[front];
qu[rear]=k;
tag[k]=1;
for(p=G.vertices[k].firstarc;p;p=p->nextarc)
{ u=p->adjvex;
if(u==j) return 1;
if(tag[u]==0)
{ rear=(rear+1)%MAXN;
qu[rear]=u;
}
}
}
return 0;
}
//假设G采用邻接表存储,设计一个算法,判断无向图G是否连通
int connect(ALGraph G)
{
int i,flag=1;
for(i=0;i<G.vexnum;i++)
visited[i]=0;
DFS(G, 0);
for(i=0;i<G.vexnum;i++)
if(visited[i]==0)
{flag=0;
break;
}
return flag;
}
void main()
{
ALGraph G1;
//CreateUDG(G1);
//printG(G1);
CreateDG(G1);
printG(G1);
//BFSTraverse(G1);
//rudu(G1);
//chudu(G1);
topsort(G1);cout<<endl;
BFSTraverse(G1);cout<<endl;
DFSTraverse(G1);
if(pathBFS(G1,0,3)) cout<<"exit"<<endl;
else cout<<"no";
if (pathexist(G1,0,5)) cout<<"exit"<<endl;
else cout<<"no";
}
没有合适的资源?快使用搜索试试~ 我知道了~
C语言,C语言数据结构代码实例
共83个文件
cpp:80个
h:3个
4星 · 超过85%的资源 需积分: 5 56 下载量 78 浏览量
2009-04-30
22:03:31
上传
评论
收藏 78KB RAR 举报
温馨提示
C语言,C语言数据结构代码,代码实例。严蔚敏老师的课程,老师写的代码,全部验证通过。
资源推荐
资源详情
资源评论
收起资源包目录
.rar (83个子文件)
数据结构代码
10
排序.cpp 5KB
bubblesort.cpp 972B
mergesort.cpp 2KB
insertsort.cpp 849B
selectsort.cpp 851B
radix.cpp 1KB
heapsort.cpp 1KB
shellsort.cpp 1015B
radixsort.cpp 2KB
quicksort.cpp 1KB
1
sort.cpp 310B
5
下三角矩阵.cpp 1KB
上三角矩阵.cpp 1KB
顺序三元组.cpp 2KB
稀疏矩阵三元组行链表.cpp 1KB
sparsematrix.cpp 3KB
7.4orthlink.cpp 3KB
对角矩阵.cpp 901B
7.4creat.cpp 2KB
w对角矩阵.cpp 1KB
对称矩阵.cpp 1KB
十字链表.cpp 1KB
链式三元组.cpp 1KB
matrixlink.cpp 1KB
7
dfs.cpp 4KB
邻接表1.cpp 6KB
dijkstra.cpp 2KB
邻接矩阵.cpp 2KB
floyed.cpp 1KB
prim1.cpp 1KB
prim.cpp 2KB
bfs.cpp 3KB
邻接表.cpp 5KB
邻接矩阵1.cpp 5KB
kruskal.cpp 1KB
seque.h 1KB
topsort.cpp 3KB
9
索引顺序表查找.cpp 1KB
分块查找1.cpp 946B
seqsearch.cpp 582B
二叉排序tree.cpp 4KB
二分查找.cpp 917B
顺序查找.cpp 621B
bstree.cpp 4KB
二叉排序树.cpp 2KB
2
typdef.h 285B
ex2-2.cpp 364B
dlink.cpp 5KB
ringlink.cpp 5KB
sqlist.cpp 4KB
ex21.cpp 336B
link.cpp 6KB
initlist-sq.cpp 176B
jintailink.cpp 1KB
sq.cpp 2KB
sdlink.cpp 6KB
6
二叉树中序线索化.cpp 2KB
human.cpp 3KB
二叉树先序线索化.cpp 2KB
二叉树2非递归.cpp 6KB
二1叉树.cpp 5KB
tree.cpp 2KB
二叉树1.cpp 4KB
3
seqqueue.cpp 2KB
seqstack.cpp 1KB
LinkQueue.cpp 2KB
stackinit.cpp 124B
括号匹配问题.cpp 2KB
orderqueue.cpp 2KB
towers.cpp 539B
stack.h 148B
linkstack.cpp 2KB
4
push.cpp 140B
4-4.cpp 1KB
strlocklink1.cpp 1KB
KMP.cpp 1KB
sss.cpp 419B
strlocklink.cpp 2KB
strlink.cpp 5KB
slocklink.cpp 1KB
pop.cpp 135B
sqstring.cpp 3KB
sqstr.cpp 1KB
共 83 条
- 1
资源评论
- Hammer422013-05-14我也觉得不是太好,不过还是值得参考
- dongdundun2014-09-23我感觉不太好,就是可以看看,没多大用处
jsh_win
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- BLOCK_TYPE_HEARTBEAT_D70A3465D4EE4E9_046141_dump_1st.dmp
- 项目方法测试调用接口工具
- studyupdate
- 基于西瓜数据集的决策树实现.zip
- 60套HTML网站源码-响应式-涵盖(简历&作品展示&商业&科技&培训&商城&课设等)-适配移动设备-解压即用.zip
- 贪心算法要点和难点实例代码解析
- 65套HTML网站源码-响应式-涵盖(简历&作品展示&商业&科技&培训&商城&课设等)-适配移动设备-解压即用.zip
- 多因素决策树的Python实现.zip
- 使用Python在莺尾花数据集上实现了决策树算法,文件里有数据集.zip
- python实现决策树.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功