逐行注释代码并总结:void createadjlist(glink hcode[], huffman ch[], int n)//创建一个邻接表存储编码 { int i, p, c; lklist s, q; for ( i = 1; i <=n; i++) { hcode[i].vex = i; hcode[i].firstlink = null; } for ( i = 1; i <=n; i++) { c = i; printf("\n%d: ", i); p = ch[c].parent; printf("%d ", p); while (p!=0) { s = (lklist)malloc(sizeof(struct node)); if (c==ch[p].lchild) { s->adjvex = 0; } else { s->adjvex = 1; } s->next = hcode[i].firstlink; hcode[i].firstlink = s; c = p; p = ch[c].parent; printf("%d ", p); } } for (i = 1; i <= n; i++) { printf("\n第%d个字符编码为:", i); q = hcode[i].firstlink; while (q != 0) { printf("%d", q->adjvex); q = q->next; } } }
时间: 2023-12-03 12:02:00 浏览: 167
这是一个用于创建哈夫曼树的邻接表的函数,具体注释如下:
```C++
void createadjlist(glink hcode[], huffman ch[], int n)//创建一个邻接表存储编码
{
int i, p, c; // 定义三个变量
lklist s, q; // 定义两个指向邻接表节点的指针
for ( i = 1; i <=n; i++) // 遍历哈夫曼数组
{
hcode[i].vex = i; // 将邻接表节点的编号设置为哈夫曼数组节点的编号
hcode[i].firstlink = null; // 将邻接表节点的指向第一个邻接节点的指针初始化为空
}
for ( i = 1; i <=n; i++) // 再次遍历哈夫曼数组
{
c = i; // 当前节点编号为i
printf("\n%d: ", i);
p = ch[c].parent; // 找到当前节点的父亲节点
printf("%d ", p);
while (p!=0) // 如果父亲节点存在
{
s = (lklist)malloc(sizeof(struct node)); // 申请一个邻接表节点
if (c==ch[p].lchild) // 如果当前节点是父亲节点的左孩子
{
s->adjvex = 0; // 邻接表节点指向0
}
else // 如果当前节点是父亲节点的右孩子
{
s->adjvex = 1; // 邻接表节点指向1
}
s->next = hcode[i].firstlink; // 将邻接表节点插入当前节点的邻接表链表的头部
hcode[i].firstlink = s; // 更新当前节点的邻接表链表头指针
c = p; // 将当前节点设置为父亲节点
p = ch[c].parent; // 找到当前节点的新的父亲节点
printf("%d ", p);
}
}
for (i = 1; i <= n; i++) // 遍历哈夫曼数组
{
printf("\n第%d个字符编码为:", i);
q = hcode[i].firstlink; // 取出当前节点的邻接表链表头指针
while (q != 0) // 遍历当前节点的邻接表链表
{
printf("%d", q->adjvex); // 打印邻接表节点指向的值
q = q->next; // 指向下一个邻接表节点
}
}
}
```
总之,这个函数的作用是根据哈夫曼树的节点信息创建一个邻接表,用于存储每个字符的哈夫曼编码。函数首先遍历哈夫曼数组,将邻接表的节点编号初始化为哈夫曼数组的编号,并将邻接表的第一个邻接节点指针初始化为空。然后再次遍历哈夫曼数组,对于每个哈夫曼数组的节点,找到它的父亲节点,并在邻接表中创建一个新的邻接节点,指向0或1,然后将这个邻接节点插入到当前节点的邻接表链表头部。最后,遍历哈夫曼数组,打印每个字符的哈夫曼编码。
阅读全文