//顶点的度 //邻接表 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; }