大话数据结构

  1 /*
  2 顺序存储的结构 
  3 */
  4 #define MAXSIZE 20
  5 //存储空间初始分配量
  6 typedef int ElemType;
  7 //ElemType类型根据实际情况而定,这里假设为int
  8 typedef struct {
  9     ElemType data[MAXSIZE];
 10 //    数组存储数据元素,最大值为MAXSIZE
 11     int length;
 12 //    线性表当前长度
 13 } SqList;
 14 /*
 15 地址计算方法 
 16 
 17 每个数据元素,不管是整形、实型、字符型,它们都要占用一定的存储单元。
 18 假设为c单元,那么线性表中第i个数据元素和第i+1个数据元素的存储位置满足
 19 下列关系(LOC表述获得存储位置的函数):
 20 LOC(a_i_) = LOC(a_i-1_)+c
 21 (_表示下标的起始标志)
 22 LOC(a_i) = LOC(a_1_)+(i-1)*c
 23 
 24 计算线性表中任意位置的地址,时间相同。
 25 对每个线性表位置的存入或者取出数据,对于计算机而言,均为相等的时间,为一个常熟。
 26 时间复杂度
 27 存取时间性能
 28 O(1) 
 29 
 30 */
 31 
 32 /*
 33 顺序存储结构的插入与删除 
 34 */ 
 35 
 36 /*获得元素的操作*/ 
 37 #define OK 1
 38 #define ERROR 0
 39 #define TRUE 1
 40 #define FALSE 0
 41 typedef int Status;
 42 //Status 是函数的类型,其值是函数结果状态码,如OK
 43 //初始条件:顺序线性表L已存在,1<=i<=ListLength(L)
 44 //操作结果:用e返回L中第i个数据元素的值
 45 Status GetElem(SqList L, int i, ElemType *e) {
 46     if(L.length==0 || i<1 || i>L.length)
 47         return ERROR;
 48     *e=L.data[i-1];
 49     return OK;
 50 }
 51 //GetElem(L,i*e) 查 获得元素操作
 52 //时间复杂度O(1)
 53 
 54 /*
 55 插入操作
 56 */
 57 
 58 //ListInsert(*L,i,e) 增 添加元素操作
 59 //初始条件:顺序线性表L已存在,i<=i<=ListLength(L)
 60 //操作结果:在L中第i个位置之前插入新的数据元素e,L的长度增加1 
 61 Status ListInsert(SqList *L, int i, ElemType e) {
 62     int k;//???improve下移?
 63     if(L->length==MAXSIZE)
 64     //顺序线性表已满 
 65         return ERROR;
 66     if(L.length==0 || i<1 || i>L.length)
 67         return ERROR;
 68     if(i<=L->length) {
 69         for(k=L->length-1; k>=i-1; k--)
 70             L->data[k+1] = L->data[k];
 71     }
 72     L->data[i-1]=e;
 73     L->length++;
 74     return OK;
 75 }
 76 /*
 77 删除操作 
 78 */
 79 
 80 //初始条件:同上
 81 //删除结果:删除L的第i个数据元素,并用e返回其值,L的长度减1 
 82 Status ListDelete(SqList *L, int i, ElemType *e) {
 83     int k;
 84     if(L->length==0)
 85     //线性表为空 
 86         return ERROR;
 87     if(i<1 || i>L->length)
 88         return ERROR;
 89     *e = L->data[i-1];
 90     if(i<L-length) {
 91         for(k=i; k<L->length; k++)
 92             L->data[k-1]=L->data[k];
 93     }
 94     L->length--;
 95     return OK;
 96 }
 97 
 98 /*
 99 插入和删除的时间复杂度
100 最好的情况:元素要插入到最后一个位置或者删除最后一个元素
101             不需要移动元素 
102             O(1)
103 最坏的情况:元素要插入到第一个位置或者删除第一个元素
104             需要移动所有元素 
105             O(n) 
106 每个位置插入或删除呀元素的可能性相同
107 平均复杂度
108 O(n) 
109 */

 

线性表 linear list 

n个数据元素的有限序列

 

线性链表:每个节点只包含一个指针域

 

循环链表 circular linked list

O(1)

将2个线性表合并成一个表,仅需将一个表的表尾和另一个表的表头相接:仅需改变2个指针值即可。

 

双向链表 double linked list

单链表 NextElem O(1)  PriorElem O(n)

 NextElem O(1)  PriorElem O(1)

 

 

栈 stack 仅在表尾进行插入或删除操作的线性表

top bottom  栈顶 栈底

last in first out 后进先出

 

队列 queue first in first out

front rear 队头 队尾

 

 

tree 4

complexity_action

 

 

 

forest 互补相交的树的集合

 

binary tree 

树中不存在度大于2的节点

 

满二叉树

一棵深度为k且有2^k-1个结点的二叉树

 

分类:

技术点:

相关文章: