链表看书体会:
链表有一个”头指针”变量,它存放一个地址,该地址指向一个元素.链表中的每一个元素称为”结点”,每个结点都应包括两部分:用户需要用的实际数据和下一个结点的地址.
一般我们用结构体来定义链表:
Struct link_list
{
Int date;//数据域
Struct link_list *next;//存放下一个结点的地址;
};
单链表的unite:
Void merge_list(lnk_list list-a,link_list list_b,link_list*list_c)
{
Link_list pa,pb,pc;
Pa=link_a->next;
Pb=link_b->next;
*list_c=pc=list_a;
While(pa&&pb)
{
If(pa->data<pb->data&&pb!= null)
{
Pc->next=pa;//insert pa所指向的节点
Pc=pa;//pc指向新插入的节点
Pa=pa->next;//pa指向下一个结点
}
Else
{
Pc->next=pb;
Pc=pb;
Pb=pb->next;
}
Pc->next=pa?pa:pb;
}
双向链表:
Struct link_node
{
Element_type data;
Struct link_node *next;
Struct link_node *priv;
};
ARM Linux 内核链表使用实例:
Struct list_head{struct list_head *next,*prev;};可见内核的链表具备双链表的功能.在linux中,不是在链表的结构中包含数据,而是在数据结构中包含链表节点.这是由于链表的的数据类型差别很大,如果对每一种数据项类型都定义各自的链表结构,不利于抽象成公共的模板.
在链表中添加节点:
Static inline void __list_add(struct list_head *new,struct list_head *prev,struct list_head *next)
{
next->prev=new;//next节点的前面一个节点是new
new->next=next;//new的下一个结点是next
new->prev=prev;//new的前面一个节点是prev
prev->next=new;//prev的下一个节点是new
Prev |
Next |
Prev |
Next |
New |
Prev |
24 |
20 |
15 |
15 |
24 |
二叉树:
Struct –tree_node
{
Char data;
Struct tree_node *lchild;
Struct tree_node *rchild;
};
二叉树的顺序存储:其存储形式为用一组连续的存储单元按照二叉树的每个节点编号的顺序存放.
#define MAX_TREE_NODE_SIZE 100
typedef struct
{
Entry_type item[MAX_TREE_NODE_SIZE];
Int n;}qb_tree
二叉树的链式存储:
Typedef struct _bt_node
{
Entry-type item; struct bt_node *lchild,*rchild;
}bt_node,*b_tree;