⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tu.cpp

📁 以邻接表为存储结构
💻 CPP
字号:
#include<iostream.h>
#define exit 0 ;
#define MAX_VERTEX_NUM 20
typedef int InfoType  ;
typedef struct ArcNode {                         //表结点
  int       adjvex;                              // 该弧所指向的顶点的位置
  struct ArcNode *nextarc;                       // 指向下一条弧指针
  InfoType  info;                                // 该弧相关信息的指针
} ArcNode;
typedef char VertexType ;
typedef struct VNode {                           //头结点
 VertexType  data;                               // 顶点信息
  ArcNode  *firstarc;                            // 指向第一条依附该顶点的弧
  } VNode, AdjList[MAX_VERTEX_NUM];
typedef struct { 
    AdjList  vertices;
    int  vexnum,arcnum;                          //图的当前顶点数和弧数
}ALGraph;
typedef struct QNode{
    VertexType  data;
      struct QNode *next;
     } QNode,*QueuePtr;
typedef struct{
         QueuePtr front;
         QueuePtr rear;
    }LinkQueue; 
 void InitQueue(LinkQueue  &Q)
          {
             Q.front=Q.rear=new QNode;
             if(!Q.front) exit(1);
             Q.front->next=NULL;
           }
void EnQueue(LinkQueue &Q,VertexType e)
{                                               // 在当前队列的尾元素之后,插入元素 e 为新的 队列尾元素
QNode *p;
p=new QNode;
if(!p)exit(1);                                  // 存储分配失败
p->data=e;
p->next=NULL;
Q.rear->next=p;                                 // 修改尾结点的指针
Q.rear=p;                                       // 移动队尾指针 
}
void DeQueue(LinkQueue &Q,VertexType &e)        // 若队列不空,则删除当前队列 Q 中的头元素,用 e 返回其值,
                                                //并返回 TRUE;否则返回 FALSE 
{
if(Q.front==Q.rear)exit(1);                     // 链队列中只有一个头结点
QNode *p;
p=Q.front->next;
e=p->data;                                      // 返回被删元素
Q.front->next=p->next;                          // 修改头结点指针
if(Q.rear==p)Q.rear=Q.front;
delete p;                                       // 释放被删结点
}    
void CreateGraph (ALGraph &G) {
int head,tail;
InfoType weight;
cout<<"输入顶点数和边数"<<endl;
    cin >> G.vexnum >> G.arcnum;                //输入顶点数和边数
	cout<<"输入各顶点的信息"<<endl;
    for ( int i = 0; i < G.vexnum; i++) { 
		//cout<<"输入顶点"<<i<<"的信息"<<endl;
        cin >> G. vertices[i].data;             //输入顶点信息
        G. vertices[i].firstarc = NULL;
    }
	cout<<"**************逐条边输入各边的信息**************"<<endl;
    for ( i = 0; i < G.arcnum; i++) {           //逐条边输入
	
	cout<<"请输入第 "<<i+1<<"条边的尾结点"<<'\t'<<"头结点"<<'\t'<<"权值"<<endl;
        cin >> tail >> head >> weight;
        ArcNode * p = new ArcNode;
		p->adjvex = head;  
		p->info = weight; 
       p->nextarc = G. vertices[tail].firstarc; //链入第
                                                //  tail 号链表的前端
        G. vertices[tail].firstarc = p;
     }
}
int visited[MAX_VERTEX_NUM];                    //对顶点是否被访问进行标记,若未被访问则标记为0;否则标记为1
int FirstAdjVex(ALGraph G,int v)
{
	if(G.vertices[v].firstarc)
		return G.vertices[v].firstarc->adjvex;
	else
         return -1;
}
int NextAdjVex(ALGraph G,int v,int w)
{
	ArcNode *p=G.vertices[v].firstarc;
    while(p->nextarc&&p->adjvex!=w)
         p=p->nextarc;
	if(p->nextarc)
	{p=p->nextarc;
	return p->adjvex;}

	else
         return -1;
}
void DFS(ALGraph G,int v)
{
cout<<G. vertices[v].data<<'\t';
visited[v]=1;
for(int w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
 if(!visited[w]) DFS(G,w);                       //对v的尚未访问的邻接顶点w递归调用DFS

}
void DFSTraverse(ALGraph G, int v)
{
for(int i=0;i<G.vexnum;++i)
visited[i]=0;
//for(v=0;v<G.vexnum;++v)
 if(visited[v]==0)  DFS(G,v);
}  

void BFSTraverse(ALGraph G)
{                                                //按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组visited.
    LinkQueue Q;
	VertexType u;
	for(int v=0;v<G.vexnum;++v)
		visited[v]=0;
	InitQueue(Q);
	for(v=0;v<G.vexnum;++v)
		if(!visited[v])
		{
		visited[v]=1;
		cout<<G. vertices[v].data<<'\t';
		EnQueue(Q,v);
		while(Q.front!=Q.rear)
		{
		DeQueue(Q,u);
		 for(int w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
			 if(!visited[w])
			 {
				visited[w]=1;
				cout<<G. vertices[w].data<<'\t';
			 EnQueue(Q,w);
			 }
		}
		}
}
void main()
{
ALGraph G;
cout<<"**************************图的基本操作**************************"<<endl;
cout<<"---------创建图---------"<<endl;
CreateGraph( G) ;
int v; 
cout<<"输入要开始的结点下标:";
cin>>v;
cout<<"-------图的深度遍历-------"<<endl;
DFSTraverse( G,v);
cout<<endl;
cout<<"-------图的广度遍历-------"<<endl;
BFSTraverse( G);
cout<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -