十字链表的方式实现在头部插入图中节点


#include<stdio.h>
#include<malloc.h>
#define MAX_VERTEX_NUM 20

typedef struct ArcBox{
int tailvex,headvex;//该弧的头和尾定点的位置
struct ArcBox *hlink,*tlink;//分别为弧头和弧尾相同的弧的链域
int *info;
}ArcBox;
typedef struct VexNode //顶点结点
{
char data; //顶点信息(标识)
ArcBox *firstin; //该顶点的第一条入弧
ArcBox *firstout; //该顶点的第一条出弧
}VexNode;
typedef struct //图的顶点列表
{
VexNode xlist[MAX_VERTEX_NUM]; //顶点列表
int vexnum,arcnum; //定点数,弧数
}OLGraph;
int Locate(OLGraph *G, char vex)
{
int i=0;
for(;i<G->vexnum;i++)
if(vex==G->xlist[i].data)
break;
return i;
}
OLGraph* CreateDG(OLGraph *G)
{
G=(OLGraph *)malloc(sizeof(OLGraph));
char vex1,vex2;
int in,out;//分别表示头和尾巴
ArcBox *p;

printf("输入有向图的顶点数:\n");
scanf("%d",&G->vexnum);
printf("输入有向图的边数:\n");
scanf("%d",&G->arcnum);
printf("输入顶点值:");
int i=0;
printf("%d\n",G->vexnum);
for(i=0;i<G->vexnum;++i)
{
printf("第%d次输入\n",i);
printf("好奇葩\n");
fflush(stdin);
scanf("%c",&G->xlist[i].data);
G->xlist[i].firstin=G->xlist[i].firstout=NULL;
}
int k=0;
for(;k<G->arcnum;k++)
{
printf("输入弧%d(顶点1,顶点2)",k);
fflush(stdin);//清空缓冲区,避免对后面数据的影响
scanf("%c,%c",&vex1,&vex2);//输入一条弧的始点和终点
in =Locate(G,vex1);
out =Locate(G,vex2);
p=(ArcBox *)malloc(sizeof(ArcBox));
p->headvex=in; p->tailvex=out;
p->hlink=G->xlist[in].firstin;
p->tlink=G->xlist[out].firstout;
G->xlist[in].firstin=G->xlist[out].firstout=p;
scanf("%d",p->info);
}

return G;
}

int main()
{
OLGraph *G;
G=CreateDG(G);
system("pause");
}

注:环境为:dev-c++,保存为.c文件

十字链表的方式实现在头部插入图中节点,布布扣,bubuko.com

时间: 2024-10-20 22:13:37

十字链表的方式实现在头部插入图中节点的相关文章

图像旋转中原图16&#215;16分块测试2,映射后插入图中,测试边界信息

// RotateZoom.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "RotateZoom.h" #ifdef _DEBUG #define new DEBUG_NEW #endif #include <atlimage.h> #include <locale.h> // The one and onl

看数据结构写代码(21) 稀疏矩阵(十字链表方式)

写完 这个样例,花费了 我不少时间.大部分时间 花费在 调试 内存问题上. 比如在销毁十字链表时.多次释放节点空间,造成 _CrtIsValidHeapPointer(pUserData) 异常. 当使用malloc 分配 一个 空间时,会将这个空间的起始地址和长度 加到一个链表中去.free(p)的时候 ,会从 链表里 查找 是否 有 这个地址空间,找到了就将这个节点从链表中删除._CrtIsValidHeapPointer(pUserData)  这个函数 正是 检查 这个空间是否 在链表里

创建一个单链表,实现头部插入和尾部插入

/*目的:创建一个单链表,实现尾部插入,头部插入,遍历链表*/ #include <stdio.h>#include <string.h>#include <stdlib.h> //定义一个结构体,用来表示一个节点,包含指针域,数据域 struct node{ int data; //数据域 struct node *next; //指针域,指向节点的指针,用来连接两个节点}; //定义一个函数,用来创建节点,为节点分配堆内存,由于堆内存残留有随机值,创建成功后清空内存

_DataStructure_C_Impl:稀疏矩阵十字链表存储

#include<stdio.h> #include<stdlib.h> typedef int DataType; typedef struct OLNode{ int i,j; DataType e; struct OLNode *right,*down; }OLNode,*OLink; typedef struct{ OLink *rowhead,*colhead; int m,n,len; }CrossList; //初始化稀疏矩阵 void InitMatrix(Cros

数据结构之---C/C++实现稀疏矩阵的十字链表

首先这里介绍什么是矩阵的十字链表,大家可以理解稀疏矩阵是顺序存储的,那么这个就是链式存储的. 如图: 存储该矩阵 那么应该是如下的格式: 我们知道稀疏矩阵的三元组存储方式的实现很简单,每个元素有三个域分别是col,row, e.代表了该非零元的行号.列号以及值.那么在十字链表的存储方式下,首先这三个域是肯定少不了的,不然在进行很多操作的时候都要自己使用计数器,很麻烦.而十字链表的形式大家可以理解成每一行是一个链表,而每一列又是一个链表 通过上面的图我们可以知道,每个结点不止要存放row, col

使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表.双向链表.循环链表.双向循环链表 单链表:一个数据域data.一个后继指针域next.也即:上一个节点指向下一个节点,尾节点指向空. 双向链表:一个数据域data.一个前驱指针域previous.一个后继指针域next.也即:上一个节点和下一个节点互相指向,尾节点指向空. 循环链表:一个数据域da

队列(二)——队列的链表实现方式

1.队列的单向链表的实现方法 return只可以返回一个值,单向循环链表来实现队列的时候可以只保留一个指针,因为保留rear指针能够很方便的表示出front指针,所以保留rear指针. 另外由于链表的第一个结点处理比较特殊,所以在初始化的时候需要单独处理.链表实现的队列思想也是第一个单元作为头结点,不存放数据,rear指针指向的总是尾结点(在循环链表中也就是头结点的上一个结点). 2.实现方法 用带表头的单向循环链表来实现 #include <stdio.h> #include <mal

稀疏矩阵的十字链表存储表示

/* Name: 稀疏矩阵的十字链表存储表示 Copyright: Author: 巧若拙 Date: 29-10-14 21:25 Description: //------------------------------------------------------------------------- 除了用三元组顺序表来存储压缩矩阵,我们还可以用链表结构来存储,实际上后者应用更广泛, 因为当非零元素的数目较大时,三元组的时间复杂度实在太高.链表结构中最常见的是十字链表, 在十字链表中,

数据结构之---C++语言实现图的十字链表存储表示

最近一直忙着考研复习,很久都没有更新博客了,今天写一篇数据结构的存储. //有向图的十字链表存储表示 //杨鑫 #include <iostream> #include <cstdio> #include <stdlib.h> #include <cstring> using namespace std; #define MAX_VERTEX_NUM 20 #define OVERFLOW -2 #define OK 1 typedef int Status