1、双链表
(1)插入操作(在双链表head中第i个结点之前插入一个值为x的结点)
(2)删除操作(删除双链表head中的第i个结点)
2、循环链表(circular linked list)
(1)循环链表是表中最后一个结点的指针指向头结点,使链表构成环状。
(2)特点:从表中任一结点出发均可找到表中其他结点,提高查找效率。
(3)操作与单链表基本一致,循环条件不同
单链表p或p->link=NULL
循环链表p或p->link=H
3、双向链表(double linked list)
单链表具有单向性的缺点
结点定义
typedef struct node {
datatype element;
struct node *prior,*next;
}JD;
4、删除
void delete_List(JD *p)
{p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
}
插入
void insert_list(JD* p,int x)
{JD *s;
s=(JD*)malloc(sizeof(JD));
s->element=x;
s->prev=p->prev;
p->prev->next=s;
s->next=p;
p->prev=s;
}
5、家谱
<祖父,伯父>,<祖父,父亲>,<祖父,叔父>,<伯父,堂兄>,<伯父,堂姐>,<父亲,你>,<叔父,堂弟>,<堂兄,侄儿>
6、树型结构
概念:树型结构是非线性结构。树型结构是结点之间有分支,并且具有层次关系的结构,它非常类似于自然界中的树。树结构在客观世界中是大量存在的,例如家谱、行政组织机构都可用树形象地表示。
7、树
定义:树(tree)是n(n>=0)个结点的有限集T,其中:有且仅有一个特定的结点,称为树的根(root)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)
8、基本术语
结点(node)——表示树中的元素,包括数据项及若干指向其子树的分支
结点的度(degree)——结点拥有的子树的个数
叶子(leaf)——度为0的结点
孩子(child)——结点子树的根称为该结点的孩子
双亲(parents)——孩子结点的上层结点叫该结点的~
兄弟(sibling)——同一双亲的孩子
树的度——一棵树中所有结点度数的最大值
结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层……
深度(depth)——树中结点的最大层次数
森林(forest)——m(m³0)棵互不相交的树的集合
9、树和线性结构的比较
(1)线性结构:第一个数据元素(无前驱) ;最后一个数据元素(无后继) ;其它数据元素(一个前驱、一个后继) .
(2)树结构:根结点(无前驱);多个叶子结点(无后继);树中其它结点
(一个前驱、多个后继).
10、二叉树的概念
定义:二叉树是n(n³0)个结点的有限集,它或为空树(n=0),或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成
特点:每个结点至多有二棵子树(即不存在度大于2的结点)
二叉树的子树有左、右之分,且其次序不能任意颠倒
11、完全二叉树
(1)定义:深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树.
(2)判断是否为完全二叉树的依据:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
12、具有n个结点的完全的二叉树的深度:[log2^n]+1
13、二叉树的第i层上至多有2^(i-1)个结点(i>=1)
14、遍历二叉树
1. 方法:
先序(根)遍历:先访问根结点,然后分别先序遍历左子树、右子树
中序(根)遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树
后序(根)遍历:先后序遍历左、右子树,然后访问根结点
按层次遍历:从上到下、从左到右访问各结点.