//顶点的度
//邻接表
int count_Degree(Graph G,int v){
int count=0;
ENode *p;
for(p=adjList[v].firstarc;p!=null;p=p->nextarc){
count++;
}//出度
for(int i=0;i<G.vertices;i++){
if(i==v) continue;
for(p=adjList[i].firstarc;p!=null;p=p->nextarc){
if(p->adjvex==v){
count++;
break;
}
}
}//入度
return count;
}
//有向图 邻接表插入 邻接表的插入边 (无向图插入需要两个)
bool Insert(Graph *G,int u,int v){
ENode *p;
if(u<0 || v< 0 || u>G->vertices-1 || v>G->vertices-1 || u==v)
return false;
if(isExist(G,u,v)) return false; //此边已存在
p = (ENode*)malloc(sizeof(ENode));
p->adjVex=v;
p->nextarc=G->adjList[u].firstarc;//将新的边结点插入单链表的最前面
G->adjList[u].firstarc=p;
G->ecount++;//边加1
return true;
}
//有向图 邻接表的删除边 (无向图插入需要两个)
bool Remove(Graph *G,int u,int v){
ENode *p,*q;
if(u<0 || v< 0 || u>G->vertices-1 || v>G->vertices-1 || u==v)
return false;
p=G->adjList[u];
while(p!=null && p->adjVex!=v){//查找待删除边是否存在
q=p;
p=p->nextArc;
}
if(p==null) return false; //p为空,待删除边不存在
if(G->adjList[u].firstarc==p){
G.adjList[i].firstarc==p->nextarc;
}else{
q->nextarc=p->nextarc;
}
free(p);
G->ecount--;
return true;
}
//邻接表销毁 邻接表的撤销(改成了int型,有返回值)
int Destory(Graph *G){
ENode *p,*q;
for(int i=0;i<G->vertices;i++){
p=G->adjList[i].firstarc; //指针p指向顶点i的单链表的第一个边结点
q=p;
while(p){ //释放顶点i的单链表中所有边结点
p=p->nextarc;
free(q);
q=p;
}
}
free(G->adjList); //释放一维指针数组a的存储空间
return 1;
}