一个字段代表它的上一层代码(flbm),第二个字段代码最终的代码(dm),第三个字段标明本层代码(bcdm),还有一个标明是不是最终代码(bs)
flbm及dm的长度不受限制,bs用.t.或.f.来判断是不是最终的代码,如果不是,则它的下面还可以再增加代码
dm=flbm+bcdm
由此可完成概型结构的代码库
建立一个tv_1控件long rows,i,cur_len,p
string mycode,str,myname,mylabel
long handle_current,h1
treeviewitem item
treeviewitem newitem
h1=tv_1.finditem(currenttreeitem!,0)
handle_current=tv_1.finditem(childtreeitem!,h1)
if handle_current<0 then
tv_1.getitem(h1,item)
mylabel=item.label
p=pos(mylabel,"--")
mycode=mid(mylabel,1,p - 1)
cur_len=len(mycode)
str="id like'"+mycode+"%'"
dw_1.setfilter(str)
dw_1.filter()
rows=dw_1.rowcount()
for i=1 to rows
mycode=dw_1.getitemstring(i,"no")
myname=dw_1.getitemstring(i,"name")
if len(mycode)=cur_len+2 then
newitem.label=mycode+"--"+myname
newitem.pictureindex=(cur_len+2)/2+1
newitem.selectedpictureindex=(cur_len+2)/2+2
tv_1.insertitemlast(h1,newitem)
end if
next
end if
tv_1.expanditem(h1)
return 0
再建立一个数据窗口,里面的数据库有两个字段,no和name
no字段例子:01第一层,0102第一层的第二个结点,0201第二层的第一个结点
主窗口的OPEN事件:(双击窗口任何位置,别点在控件上)
tv_1.insertitemlast(0,"根结点",1)
dw_1.settransobject(sqlca)
dw_1.retrieve()
#include <stdio.h>#include <stdlib.h>
typedef struct {
char data
int weight
} bitree_data_t
typedef struct bitree
{
bitree_data_t data
struct bitree *lchild, *rchild
}bitree_t
typedef bitree_t * data_t
typedef struct linknode {
data_t data
struct linknode *next
}linknode_t, linkstack_t, linklist_t
//创建一个链表
//1. 在内存总开辟头结点的空间malloc
//2. 将头结点的next域置空NULL
//3. 返回创建并设置好的链表的首地址
linklist_t *create_linklist()
{
linknode_t *node = (linknode_t *)malloc(sizeof(linknode_t))
node->next = NULL
return node
}
//判断当前链表是否为空
int empty_linklist(linklist_t *ll)
{
return ll->next == NULL
}
//求链表中当前有效元素的个数
int length_linklist(linklist_t *ll)
{
int length = 0
while(ll->next != NULL)
{
ll = ll->next
length++
}
return length
}
//获得下标为index位置的元素,成功返回0,失败返回-1
//1. 判断index是否合法(部分判断)
//2. 在保证ll->next 不为空的清空下,将ll的首地址向后移动index次
//3. 判断ll->next 是否等于空,如果等于空,则返回-1,如果不为空,执行4.
//4. 当移动了index次之后,当前ll->next 的位置的节点就保存了我要获得的
//数据
//5. *data = ll->next->data
//6. 返回0
int get_linklist(linklist_t *ll, int index, data_t *data)
{
int i
if(index <0)
return -1
for(i = 0ll->next != NULL &&i <indexi++)
{
ll = ll->next
}
if(ll->next == NULL)
return -1
*data = ll->next->data
return 0
}
//使用头插法插入一个元素
//1. 创建一个节点node
//2. 将要插入的数据保存到node
//3. 执行插入 *** 作
//4. 返回0
int insert_linklist(linklist_t *ll, data_t *data)
{
linknode_t *node = (linknode_t *)malloc(sizeof(linknode_t))
node->data = *data
node->next = ll->next
ll->next = node
return 0
}
//删除链表中的一个节点:删除头结点的后一个位置(头删法)
//首先可以判断当前链表是否为空,如果为空返回-1
//如果不为空则删除头结点的下一个位置的节点
//最后返回0
int delete_linklist(linklist_t *ll)
{
linknode_t *node
if(empty_linklist(ll))
return -1
node = ll->next
ll->next = node->next
free(node)
return 0
}
//清空链表
//循环删除链表的一个节点,然后判断删除函数的返回值是否为0
//如果为0,继续删除,如果为-1则停止循环
int clear_linklist(linklist_t *ll)
{
while(delete_linklist(ll) == 0)
return 0
}
//销毁链表
//1. 调用清空 *** 作清空链表
//2. 删除头结点
//3. 返回0
int detory_linklist(linklist_t *ll)
{
clear_linklist(ll)
free(ll)
return 0
}
void preorder(bitree_t *root)
{
if(root == NULL)
return
printf("[%c,%d]", root->data.data, root->data.weight)
preorder(root->lchild)
preorder(root->rchild)
return
}
int insert_order_linklist(linklist_t *ll, data_t *data)
{
linknode_t *node = (linknode_t *)malloc(sizeof(linknode_t))
node->data = *data
while(ll->next != NULL &&ll->next->data->data.weight <node->data->data.weight)
{
ll = ll->next
}
node->next = ll->next
ll->next = node
return 0
}
bitree_t *huffman_bitree(linklist_t *ll)
{
bitree_t *node1, *node2, *root
while(ll->next != NULL &&ll->next->next != NULL)
{
get_linklist(ll, 0, &node1)
delete_linklist(ll)
get_linklist(ll, 0, &node2)
delete_linklist(ll)
root = (bitree_t *)malloc(sizeof(bitree_t))
root->data.data = '#'
root->data.weight = node1->data.weight + node2->data.weight
root->lchild = node1
root->rchild = node2
insert_order_linklist(ll, &root)
}
get_linklist(ll, 0, &root)
delete_linklist(ll)
return root
}
int main(void)
{
bitree_data_t data
bitree_t *leaf
linklist_t *ll
ll = create_linklist()
while(scanf("[%c,%d]", &data.data, &data.weight) == 2)
{
getchar()
leaf = (bitree_t *)malloc(sizeof(bitree_t))
leaf->lchild = leaf->rchild = NULL
leaf->data = data
insert_order_linklist(ll, &leaf)
}
leaf = huffman_bitree(ll)
preorder(leaf)
putchar(10)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)