typedef struct node { int adjvex; struct node *next; }node, *pointer; typedef struct node1 { int vex; pointer link; };
时间: 2024-05-31 21:13:44 浏览: 103
这段代码定义了两个结构体,node和node1。其中,node表示图的邻接表中的一个节点,包含一个整型的adjvex表示该节点相邻的另一个节点的编号,以及一个指向下一个节点的指针next。而结构体node1表示一个图中的一个顶点,包含一个整型的vex表示该顶点的编号,以及一个指向该顶点的邻接表的指针link。这样,通过node1结构体中的link指针,就可以访问到该顶点相邻的所有节点。
相关问题
:typedef struct binode huffman; struct binode{ int weight; int data, parent, lchild, rchild; }; typedef struct hnode huffmancode; struct hnode { int cd[maxsize]; int c; }; typedef struct node *lklist; struct node { int adjvex; lklist next; }; typedef struct gnode glink; struct gnode { int vex; struct node *firstlink; };
这段代码定义了四个结构体类型和一个指向结构体类型的指针。它们的具体含义如下:
1. `struct binode` 表示哈夫曼树的结点,包含了权值 `weight`、数据 `data`、父结点 `parent`、左孩子结点 `lchild` 和右孩子结点 `rchild`。
2. `struct hnode` 表示哈夫曼编码,包含了编码数组 `cd` 和编码长度 `c`。
3. `struct node` 表示链表结点,包含了相邻结点的下标 `adjvex` 和下一结点的指针 `next`。
4. `struct gnode` 表示图的顶点,包含了顶点编号 `vex` 和第一个邻接点的指针 `firstlink`。
`typedef` 关键字用来为结构体类型定义别名。比如,`typedef struct binode huffman` 为 `struct binode` 定义了一个别名 `huffman`,这样我们在程序中可以用 `huffman` 来代替 `struct binode`。同理,`typedef struct hnode huffmancode`、`typedef struct node *lklist` 和 `typedef struct gnode glink` 分别为 `struct hnode`、`struct node *` 和 `struct gnode` 定义了别名 `huffmancode`、`lklist` 和 `glink`。
逐行翻译代码:typedef struct node { int adjvex; struct node *next; }node, *pointer; typedef struct node1 { int vex; int in; pointer link; }ALGraph; void createadlist(ALGraph G[], int n, int e) { int i, k, j; pointer q; for (i = 1; i <= n; i++) { G[i].vex = i; G[i].in=0; G[i].link = null; } for (k = 1; k <= e; k++) { scanf("%d%d", &i, &j); q = (pointer)malloc(sizeof(struct node)); q->adjvex = j; q->next = G[i].link; G[i].link = q; G[j].in++; } } void fun(ALGraph G[], int n, int v, int visit[]) { pointer p; int w; visit[v] = 1; printf("%3d", v); p = G[v].link; while (p != null) { w = p->adjvex; if (visit[w] == 0) { fun(G, n, w, visit); } p = p->next; } } int TopologicalSort(ALGraph G[],int &n) { SqStack S; InitSatack(S); for(int i=1;i<n;i++) { if(!G[i].in) Push(S,i); int count=0; while(!StackEmpty(S)) { Pop(S,i); printf(" %d ",i); ++count; pointer p; p=(pointer)malloc(sizeof(struct node)); for(p=G[i].link;p;p=p->next) { int k=p->adjvex; if(!(--G[k].in)) Push(S,k); } } if(count<G[i].in) printf("存在循环"); } return ok; }
这段代码是一个图的邻接表存储结构的实现。下面是逐行的代码翻译:
```
typedef struct node {
int adjvex;
struct node *next;
}node, *pointer;
typedef struct node1 {
int vex;
int in;
pointer link;
}ALGraph;
```
定义了两个结构体,一个是邻接表中的节点,一个是邻接表中的图。
```
void createadlist(ALGraph G[], int n, int e) {
int i, k, j;
pointer q;
for (i = 1; i <= n; i++)
{
G[i].vex = i;
G[i].in=0;
G[i].link = null;
}
for (k = 1; k <= e; k++)
{
scanf("%d%d", &i, &j);
q = (pointer)malloc(sizeof(struct node));
q->adjvex = j;
q->next = G[i].link;
G[i].link = q;
G[j].in++;
}
}
```
这个函数用于创建邻接表。首先对于每个节点,分别给它们赋值。然后遍历每一条边,读取起点和终点,为终点节点的入度加1,同时将起点节点作为终点节点的邻接表的头节点。
```
void fun(ALGraph G[], int n, int v, int visit[]) {
pointer p;
int w;
visit[v] = 1;
printf("%3d", v);
p = G[v].link;
while (p != null)
{
w = p->adjvex;
if (visit[w] == 0)
{
fun(G, n, w, visit);
}
p = p->next;
}
}
```
这个函数是深度优先遍历的实现。从给定的起点开始,访问该节点,并标记为已访问。然后遍历该节点的邻接表,如果邻接节点未被访问,则递归地访问该节点。
```
int TopologicalSort(ALGraph G[],int &n) {
SqStack S;
InitSatack(S);
for(int i=1;i<n;i++)
{
if(!G[i].in)
Push(S,i);
int count=0;
while(!StackEmpty(S))
{
Pop(S,i);
printf(" %d ",i);
++count;
pointer p;
p=(pointer)malloc(sizeof(struct node));
for(p=G[i].link;p;p=p->next)
{
int k=p->adjvex;
if(!(--G[k].in))
Push(S,k);
}
}
if(count<G[i].in)
printf("存在循环");
}
return ok;
}
```
这个函数是拓扑排序的实现。首先建立一个栈,将所有入度为0的节点入栈。然后弹出栈顶元素,输出该节点,并将该节点指向的邻接节点的入度减1。如果邻接节点入度为0,则入栈。当栈为空时,如果输出的节点数小于节点总数,则说明存在环。最后返回ok表示排序完成。
阅读全文