#include<iostream>
using namespace std;
struct side { //边
int start;
int end;
side *bridge;
side *next;
};
struct head { //顶点
int a;
side *in;
side *out;
};
/*
--递归版本--
void insert_out(side *box,side *a) {
if (a->next==NULL) {a->next=box;}
else {insert_out(box,a->next);}
}
void insert_in(side *box,side *a) {
if (a->bridge==NULL) {a->bridge=box;}
else {insert_in(box,a->bridge);}
}
void insert(int start,int end,head *a,int n) {
side *box=new side;
box->start=start;box->end=end;
box->bridge=NULL;box->next=NULL;
for (int i=0;i<n;i++) {
if (start==a[i].a) {
if (a[i].out==NULL) {a[i].out=box;}
else {insert_out(box,a[i].out);}
}
if (end==a[i].a) {
if (a[i].in==NULL) {a[i].in=box;}
else {insert_in(box,a[i].in);}
}
}
}
*/
void insert(int start,int end,struct head *all,int n) {
side *box=new side;
box->start=start;
box->end=end;
box->bridge=NULL;
box->next=NULL;
for (int i=0;i<n;i++) {
if (all[i].a==start) {
if (all[i].out==NULL) {
all[i].out=box;
}
else {
side *p=all[i].out;
while (p->next!=NULL) {
p=p->next;
}
p->next=box;
}
}
if (all[i].a==end) {
if (all[i].in==NULL) {
all[i].in=box;
}
else {
side *p=all[i].in;
while (p->bridge!=NULL) {
p=p->bridge;
}
p->bridge=box;
}
}
}
return;
}
void output(head a) {
side *p=a.out;
cout<<"以"<<a.a<<"为起点的边:";
while (p!=NULL) {
cout<<p->start<<"-->"<<p->end<<";";
p=p->next;
}
cout<<endl;
p=a.in;
cout<<"以"<<a.a<<"为终点的边:";
while (p!=NULL) {
cout<<p->start<<"-->"<<p->end<<";";
p=p->bridge;
}
cout<<endl;
return;
}
int main() {
int n;
cout<<"请输入有向图的顶点个数:";
cin>>n;
head *a=new head[n];
cout<<"请输入"<<n<<"个顶点"<<endl;
for (int i=0;i<n;i++) {
cin>>a[i].a;
a[i].in=NULL;
a[i].out=NULL;
}
cout<<"请输入图的边(例:3 5意为3指向5),输入-1 -1结束。"<<endl;
while(1) {
int start,end;
cin>>start>>end;
if (start==-1&&end==-1) {
break;
}
insert(start,end,a,n);
}
for (int i=0;i<n;i++) {
output(a[i]);
}
return 0;
}
十字链表(有向图)
于 2024-01-20 16:46:19 首次发布