在讲邻接表之前,我觉得有必要介绍一下图的遍历操作:
深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次
广度优先遍历:系统地展开并遍历图中的所有节点,而且每个节点只能访问一次,与队列配合进行
关于邻接表这种存储结构,在数据结构里非常特殊,因为它是由顺序+链式存储,非单一的顺序存储或链式存储,所以相对来说也比较复杂;具象化一下描述:比如食堂打饭,每个窗口就是一个顶点,每个窗口前面排着的人就是要到这个窗口打饭的人,即表示人和窗口的关系,但是各个窗口前的人互不干涉,因此彼此之间不能直接访问;又比如你去坐高铁,你必须找到对应的站台号下去,否则下去之后发现站台不对,跟你要去的站台隔着几条铁轨,还不能直接过去,必须回到上面的大走廊再继续找。废话有点多了,下面来定义结构体以及相关操作:
边
//边
typedef struct Edge
{
int index;//顶点下标
struct Edge *next;//指向下一条边的地址
}Edge;
创建到 index 顶点的边
//创建到index顶点的边
Edge *create_edge(int index)
{
Edge *edge=malloc(sizeof(Edge));
edge->index=index;
edge->next=NULL;
return edge;
}
顶点
//顶点
typedef struc