当前位置 博文首页 > 文章内容

    C语言邻接表建立图详解

    作者:shunshunshun18 栏目:未分类 时间:2021-08-25 14:44:01

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    有向图

    代码:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<stack>
    using namespace std;
    #define maxn 200
    int v, e;
    //表结点
    typedef struct _Enode
    {
    	int ivex; //该边所指向的节点位置
    	int value;//如果边有权值的话,就对其赋值
    	struct _Enode* next_edge; //指向下一条边
    }ENode,*PENode;
    //头结点
    typedef struct _VNode
    {
    	int data;
    	ENode* fidt_edge;
    }VNode;
    
    //邻接表
    typedef struct _LGraph
    {
    	int vex_num; //点的数量
    	int edg_num; //边的数量
    	VNode vexs[maxn]; //一维数组存表头节点
    }LGraph;
    
    LGraph* create()
    {
    	LGraph* pG;
    	pG = (LGraph*)malloc(sizeof(LGraph));
    	memset(pG, 0, sizeof(LGraph));
    	pG->vex_num = v;  //顶点数
    	pG->edg_num = e; //边数
    	for (int i = 0; i < v; ++i) //初始化定点表的指针域为空
    		pG->vexs[i].fidt_edge = NULL;
    	//建立链表
    	for (int i = 0; i < e; ++i) 
    	{
    		int v1, v2;
    		scanf_s("%d%d", &v1, &v2);
    		ENode* p1 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间
    		p1->ivex = v2;//该边指向的节点
    		// 头插法建立
    		p1->next_edge = pG->vexs[v1].fidt_edge;
    		pG->vexs[v1].fidt_edge = p1;
    	}
    	return pG;
    }
    int main()
    {
    	while (~scanf_s("%d%d", &v, &e))
    	{
    		if (v == 0 && e == 0)
    			break;
    		LGraph* pG;
    		pG = create();
    	}
    	return 0;
    }
    

    无向图

    在代码的建立链表的地方变成

    //建立链表
    	for (int i = 0; i < e; ++i) 
    	{
    		int v1, v2;
    		scanf_s("%d%d", &v1, &v2);
    		ENode* p1 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间
    		p1->ivex = v2;//该边指向的节点
    		// 头插法建立
    		p1->next_edge = pG->vexs[v1].fidt_edge;
    		pG->vexs[v1].fidt_edge = p1;
    		//另一条边
    		ENode* p2 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间
    		p2->ivex = v1;//该边指向的节点
    		// 头插法建立
    		p2->next_edge = pG->vexs[v2].fidt_edge;
    		pG->vexs[v2].fidt_edge = p2;
    	}
    

    邻接表存图进行拓扑排序

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<stack>
    using namespace std;
    #define maxn 200
    int v, e;
    //表结点
    typedef struct _Enode
    {
    	int ivex; //该边所指向的节点位置
    	struct _Enode* next_edge; //指向下一条边
    }ENode,*PENode;
    //头结点
    typedef struct _VNode
    {
    	int data;
    	int indegree;//记录定点的入度
    	ENode* fidt_edge;
    }VNode;
    
    //邻接表
    typedef struct _LGraph
    {
    	int vex_num; //点的数量
    	int edg_num; //边的数量
    	VNode vexs[maxn]; //一维数组存表头节点
    }LGraph;
    
    LGraph* create()
    {
    	LGraph* pG;
    	pG = (LGraph*)malloc(sizeof(LGraph));
    	memset(pG, 0, sizeof(LGraph));
    	pG->vex_num = v;  //顶点数
    	pG->edg_num = e; //边数
    	for (int i = 0; i < v; ++i) //初始化定点表的指针域为空
    		pG->vexs[i].fidt_edge = NULL;
    	for (int i = 0; i < e; ++i)
    	{
    		int v1, v2;
    		scanf_s("%d%d", &v1, &v2);
    		ENode* p1 = (ENode*)malloc(sizeof(ENode));  //为新建的边申请空间
    		p1->ivex = v2;//该边指向的节点
    		// 头插法建立
    		p1->next_edge = pG->vexs[v1].fidt_edge;
    		pG->vexs[v1].fidt_edge = p1;
    	}
    	return pG;
    }
    void TopSort(LGraph* pG)
    {
    	stack<int>s;
    	int count, k, i;
    	ENode* p;
    	for (int i = 0; i < v; ++i) //记录各个顶点的入度
    	{
    		//遍历整个邻接表,如果表结点的值为 i,则i对应的头结点的入度加1
    		p = pG->vexs[i].fidt_edge; //获得其指向的第一条边
    		while (p)
    		{
    			pG->vexs[p->ivex].indegree++; //该边表存的位置对应的头结点的入度数量加1
    			p = p->next_edge;
    		}
    	}
    	//将入度为0的压入栈中
    	for (int i = 0; i < v; ++i)
    		if (pG->vexs[i].indegree == 0)s.push(i);
    	count = 0;//对输出的顶点计数
    	while (!s.empty())
    	{
    		int k = s.top(); //取出
    		s.pop();
    		++count;
    		//与k节点相邻的节点的入度减1
    		for (p = pG->vexs[k].fidt_edge; p; p = p->next_edge)
    		{
    			int to;
    			to = p->ivex;
    			pG->vexs[to].indegree--;
    			//减为0的话就压入栈中
    			if (pG->vexs[to].indegree == 0)
    				s.push(to);
    		}
    	}
    	if (count < pG->vex_num)
    		printf("NO\n");
    	else
    		printf("YES\n");
    }
    int main()
    {
    	while (~scanf_s("%d%d", &v, &e))
    	{
    		if (v == 0 && e == 0)
    			break;
    		LGraph* pG;
    		pG = create();
    		TopSort(pG);
    	}
    	return 0;
    }

    总结

    本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注IIS7站长之家博文的更多内容!