1.图的邻接表储存(并实现找入度出度)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long
#define mod 1000000007
#define INF 1e9
using namespace std;
typedef struct edgenode
{
int adjvex;
struct edgenode *next;
}edgenode,*edgetree;
typedef struct vextexnode
{
char data;
edgenode *firstedge;
}vextexnode,*vextextree;
int n,m;
vextexnode adjlist[100];
//创建
void createadjlist()
{
cout<<"请输入顶点数和边关系数:";
cin>>n>>m;
cout<<"请依次输入所有顶点:\n";
for(int i=0;i<n;i++)
{
char c;cin>>c;
adjlist[i].data=c;
adjlist[i].firstedge=NULL;
}
cout<<"请依次输入所有边关系:\n";
for(int i=0;i<m;i++)
{
char c1,c2;cin>>c1>>c2;
for(int i=0;i<n;i++)
{
if(adjlist[i].data==c1)
{
edgetree p=new edgenode;
if(adjlist[i].firstedge==NULL)
{
adjlist[i].firstedge=p;
p->next=NULL;
for(int j=0;j<n;j++)
{
if(adjlist[j].data==c2)
{
p->adjvex=j;
break;
}
}
}
else
{
edgetree q=adjlist[i].firstedge;
while(q->next)q=q->next;
q->next=p;
p->next=NULL;
for(int j=0;j<n;j++)
{
if(adjlist[j].data==c2)
{
p->adjvex=j;
break;
}
}
}
}
}
}
}
//找出度入度
void findvextex1()
{
char c;
cout<<"请输入操作点:";
cin>>c;
for(int i=0;i<n;i++)
{
if(adjlist[i].data==c)
{
int k=0;
if(adjlist[i].firstedge==NULL)
{
cout<<"该点出度为:0\n";
break;
}
else
{
edgetree p=adjlist[i].firstedge;
cout<<"该点的出度邻接点:";
while(p)
{
k++;
cout<<adjlist[p->adjvex].data<<" ";
p=p->next;
}
cout<<"\n该点出度为:"<<k<<"\n";
break;
}
}
}
int k=0;
for(int i=0;i<n;i++)
{
if(adjlist[i].data!=c)
{
edgetree p=adjlist[i].firstedge;
while(p)
{
if(adjlist[p->adjvex].data==c)
{
k++;
if(k==1)
{
cout<<"该点的入度邻接点为:"<<adjlist[i].data<<" ";
}
else
{
cout<<adjlist[i].data<<" ";
}
break;
}
else p=p->next;
}
}
}
if(k==0)cout<<"该点的入度为:0\n";
else cout<<"\n该点的入度为:"<<k<<"\n";
}
int main()
{
createadjlist();
cout<<"请输入操作次数:";
int v;cin>>v;
while(v--)
{
findvextex1();
}
return 0;
}
2.图的邻接矩阵储存
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#define ll long long
#define mod 1000000007
#define INF 1e9
#define MAX 1000
using namespace std;
class mgraph
{
private:
char vertex[100];
int arc[100][100];
int vertexnum,arcnum;
public:
mgraph(int n,int m)
{
vertexnum=n;arcnum=m;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)arc[i][j]=0;
else arc[i][j]=INF;
}
}
}
void input()
{
cout<<"请依次输入所有顶点:\n";
for(int i=1;i<=vertexnum;i++)
{
char c;cin>>c;
vertex[i]=c;
}
cout<<"请依次输入所有边关系:\n";
for(int i=1;i<=arcnum;i++)
{
char c1,c2;cin>>c1>>c2;
arc[c1-'A'][c2-'A']=arc[c2-'A'][c1-'A']=1;
}
}
void findarc()
{
cout<<"请输入操作节点:";
char c;cin>>c;
int flag=0;
for(int i=0;i<vertexnum;i++)
{
if(arc[c-'A'][i]==1)
{
char x=i+'A';
if(flag==0)cout<<c<<"的邻接点为:\n";
cout<<x<<" ";
flag++;
}
}
if(flag==0)
{
cout<<c<<"无邻接点\n";
cout<<c<<"的度为0\n";
}
else
{
cout<<"\n";
cout<<c<<"的度为:"<<flag<<"\n";
}
}
};
int main()
{
int n,m;
cout<<"请输入顶点数和边关系数:";
cin>>n>>m;
mgraph t(n,m);
t.input();
int v;
cout<<"请输入操作次数:";
cin>>v;
while(v--)
{
t.findarc();
}
return 0;
}