连接表
来源:互联网 发布:部落突击辅助软件 编辑:程序博客网 时间:2024/04/29 14:12
http://blog.csdn.net/taotaotaotao910429/article/details/7755112
图的邻接表形式:
数据结构书上表示邻接表比较复杂,一般形式如下:
typedef struct Node{int dest;//邻接边的弧头结点序号int weight;//权值信息struct Node *next;//指向下一条邻接边}Edge;//单链表结点的结构体typedef struct{DataType data;//结点的一些数据,比如名字int sorce;//邻接边的弧尾结点序号Edge *adj;//邻接边头指针}AdjHeight;//数组的数据元素类型的结构体typedef struct{AdjHeight a[MaxVertices];//邻接表数组int numOfVerts;//结点个数int numOfEdges;//边个数}AdjGraph;//邻接表结构体
其实有种简洁且高效的表示形式:
typedef struct{int to;int w;int next;}Edge;Edge e[MAX];int pre[MAX];//初始化memset(pre,-1,sizeof(pre));//输入scanf("%d %d %d",&from,&to,&w1);e[i].to = to; e[i].w = w1; e[i].next = pre[from]; pre[from] = i;i++;
上面这段代码中,边的结构体Edge由三个元素组成:弧头结点序号,边权值,下一条边的序号。e[i]指的是第i条边。pre[i]记录的是从当前输入的情况来看,序号为i的弧尾结点发出的第一条边的序号是pre[i]。
这样,在操作某个结点发出的边时,可以像这么做:
/*now为弧尾结点序号,i为now所发出的边序号,adj为弧头结点序号,w为now-->adj这条边的权值*/for(i = pre[now]; i != -1; i = edge[i].next){ int adj = edge[i].to; int w = edge[i].w; //do something...}
其实,对于哈希表这类的存储结构(链表法解决冲突),与图的邻接表类似,也可以用类似的表示方法:
typedef struct{char e[11]; //valuechar f[11]; //keyint next; //下一个结果(hash冲突)}Entry;Entry entry[M];int hashIndex[M]; //哈希值为M的结果集的第一个在entry中的序号。//输入:对key进行hash,sscanf(str,"%s %s",entry[i].e,entry[i].f);int hash = ELFHash(entry[i].f);entry[i].next = hashIndex[hash];hashIndex[hash] = i;i++;//使用:for(int k = hashIndex[hash]; k; k = entry[k].next){ //do something..}
- 表连接-内连接
- 表连接-左连接
- 表连接-右连接
- 表连接-全连接
- 连接表
- 表连接
- 表连接
- 连接表
- 连接表
- 表连接
- 表连接
- 表连接
- 连接表
- 表连接
- 表连接
- 表连接
- 表连接
- 表连接
- oracle数据文件被误删除后的灾难处理方法
- 线程同步对象速查表
- 1003_Gold_miner
- 把时间花在进步上,而不是抱怨上
- Embedded_driver_note_2012_8_4
- 连接表
- Java常用代码段
- Java中提升性能对代码作的建议
- 组播IP与组播Mac的对应关系
- .Net的异步机制(委托Delegate) - step 1
- 【复习】noip2005
- 垃圾收集器
- .Net的异步机制(Invoke,BeginInvoke,EndInvoke) - step 2
- Embedded_driver_note_2012_8_5..8_6