icoding数据结构——图

6.1

#include <stdio.h>
#include "graph.h" //请勿删除,否则检查不通过


bool del_vertex(ListGraph *G, VertexType v){
    int V =locate_vertex(G,v);
    if(V == -1) return false;
    while(G->vertex[V].firstarc){
        ArcNode *p=G->vertex[V].firstarc;
        if(p->nextarc){
            ArcNode *temp=p->nextarc;
            p->nextarc=temp->nextarc;
            free(temp);
        }else{
            free(p);
            G->vertex[V].firstarc=NULL;
        }
        G->arcnum--;
    }
    G->vexnum--;
    for(int i =V;i<G->vexnum;i++){
        G->vertex[i]=G->vertex[i+1];
    }
    for(int i=0;i<G->vexnum;i++){
        ArcNode *p=G->vertex[i].firstarc,*pNode=NULL;
        ArcNode * temp;
        while(p){
            if(V==p->adjvex){
                if(pNode==NULL){
                    temp =G->vertex[i].firstarc;
                    G->vertex[i].firstarc=p->nextarc;
                }else{
                    pNode->nextarc=p->nextarc;
                    temp=p;
                }
                p=p->nextarc;
                 free(temp);
                 G->arcnum--;
            }else{
                pNode=p;
                p=p->nextarc;
            }
        }
       
    }
    return true;
}

 6.2(这道题博主百思不得其解,最后icoding判了87分)

#include <stdio.h>
#include "graph.h" //请勿删除,否则检查不通过

bool insert_vertex(ListGraph *G, VertexType v){
    if(locate_vertex(G,v) != -1 || G->vexnum + 1 >= MAX_VERTEX_NUM){
        return false;
    }
    
    G->vertex[G->vexnum].data =v;
    G->vertex[G->vexnum].firstarc= NULL;
    G->vexnum++;
    return true;
}


bool insert_arc(ListGraph *G, VertexType v, VertexType w){
    int i, j;
	ArcNode *p,*pre = NULL;
	i = locate_vertex(G, v);
	j = locate_vertex(G, w);
	if(i == -1|| j == -1)
		return false;
	p = G -> vertex[i].firstarc;
	if(p == NULL){
	    G->vertex[i].firstarc = (ArcNode *)malloc(sizeof(ArcNode));
	    G->vertex[i].firstarc->adjvex = w;
	    G->vertex[i].firstarc->nextarc = NULL;
	}else{
	    while (p != NULL){
	        if(p -> adjvex == w){
	            return false;
	        }else{
	            pre = p;
	            p = p -> nextarc;
	        }
	    }
	    pre -> nextarc = (ArcNode *)malloc(sizeof(ArcNode));
	    pre -> nextarc ->adjvex = w;
	    pre -> nextarc ->nextarc =NULL;
	}
	if(G->type == DG){
	    G->arcnum ++;
	    return true;
	}else{
	    p = G->vertex[j].firstarc,pre=NULL;
	    if(p == NULL){
	        G->vertex[j].firstarc = (ArcNode *)malloc(sizeof(ArcNode));
	        G->vertex[j].firstarc->adjvex = v;
	        G->vertex[j].firstarc->nextarc = NULL;
    	}else{
	        while (p != NULL){
	            if(p -> adjvex == v){
	                return false;
	            }else{
	                pre = p;
	                p = p -> nextarc;
	            }
	        }
	    pre -> nextarc = (ArcNode *)malloc(sizeof(ArcNode));
	    pre -> nextarc ->adjvex = v;
	    pre -> nextarc ->nextarc =NULL;
	    }
	    G->arcnum += 2;
	    return true;
	}
 
}

 6.3

#include <stdio.h>
#include "graph.h" // 请不要删除,否则检查不通过
 
bool matrix_insert_vertex(MatrixGraph* G, VertexType v)
{
    //如果v存在或超出最大顶点数
    if (matrix_locate_vertex(G, v) != -1 || G->vexnum + 1 >= MAX_VERTEX_NUM)
        return false;
    G->vertex[G->vexnum] = v;
    G->vexnum++;
	//邻接矩阵增加v的行列
    for (int i = 0; i < G->vexnum; i++)
	{
		G->arcs[i][G->vexnum - 1] = 0;
		G->arcs[G->vexnum - 1][i] = 0;
	}       
    return true;
}
 
bool matrix_insert_arc(MatrixGraph* G, VertexType v, VertexType w)
{
    int V = matrix_locate_vertex(G, v);
    int W = matrix_locate_vertex(G, w);
    if (V == -1 || W == -1)
        return false;
	//有向图
    if (G->type == DG) 
    {
        if (G->arcs[V][W] == 1)
            return false;
        G->arcs[V][W] = 1;
        G->arcnum++;
    } 
    else {
	//无向图
        if (G->arcs[V][W] == 1 || G->arcs[W][V] == 1)
            return false;
        G->arcs[V][W] = 1;
	G->arcs[W][V] = 1;
	G->arcnum++;
    }
    
    return true;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值