关于图的算法应用总结

//顶点的度
//邻接表
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;                        
}
posted @ 2019-12-26 10:29  ZzUuOo666  阅读(323)  评论(0编辑  收藏  举报