寒假还有将近一个星期啦,前期学习了腩哥的新闻发布系统,很有感触,发现原来代码可以整理得这么规范,以前自己做的东西完全就是想到什么就做什么,完全没有一个整体的思路,学习了之后对开发的整个流程以及代码的规范有了质的提升,真的学得很过瘾,,,以后说不定还会在网页这方面继续深造的!!!多的不想,现在离考研将近一年的时间就是一心一意地好好准备!
数据结构的整体框架如下:
线性结构的特点:在元素的非空集合中
(1)存在唯一的一个被称作“第一个”的数据元素
(2)存在唯一的一个被称作“最后一个”的数据元素
(3)除第一个之外,每个元素均只有一个前驱
(4)除最后一个之外,每个元素均只有一个后继
线性表
一:线性表的顺序表示和实现:
1.特点:逻辑相邻,物理相邻,地址连续
2.分配方式:
(1)静态分配:数组
(2)动态分配:
物理存储结构为:
Typedef struct { //若后面不再用,可省略结构名 ElemType *elem; //表基址 int length; //表长(特指元素个数) int listsize; //表当前存储容量(字节数) }SqList;
3.基本操作:
(1)创建(初始化)
Status InitList_Sq( SqList &L ) { //构造一个空的线性表L。 L.elem = (ElemType*)malloc( LIST_INIT_SIZE * sizeof( ElemType) );//申请内存区域,返回首地址 If ( ! L.elem ) exit ( OVERFLOW ) ; // 存储分配失败 L.length = 0; // 空表当前长度为0 L.listsize = LIST_INIT_SIZE; // 初始存储容量 return OK; } // InitList_Sq
(2)向第i个位置插入一个元素
status listinsert ( &L,i,e) { if (i<1 || i>L.len+1) return ERROR; // i值不合法 if (L.len = = L.lsize) { // 当前存储空间已满,增加分配 newbase = (Elemtype * ) realloc(L.elem, (L.listsize + LISTINCREMENT) * (sizeof(ElemType)); if (!newbase) exit(overflow); // 存储分配失败 L.elem = newbase; // 新基址 L.listsize += LISTINCREMENT; } // 增加存储容量 q = &(L.elem[i-1]); // q为插入位置 for (p = &(L.elem[L.len-1]);p>=q;--p) *(p+1) = * p; // 元素后移 *q = e; ++L.len; // 插入e,表长增1 return OK; } //listinsert
Status ListDelete ( &L,i,&e) { if (i<1 || i>L.len ) return ERROR; // 删除位置不合法 p = &(L.elem[i-1]); // p 为被删除元素的位置 e = *p; // 被删除元素的值赋给 e q = L.elem + L.len – 1; // 表尾元素的位置地址 for (p; p<q; ++p) *p =*(p+1); // 被删除元素之后的元素左移 -- L.len; // 表长减1 return OK; } // ListDelete
4.时间复杂度+空间复杂度分析
插入平均移动次数为:n(n+1)/2÷(n+1)=n/2 ≈ O(n)
删除平均移动次数为: n(n-1)/2÷n=(n-1)/2≈ O(n)
5.优缺点分析:
优点:可以随机存取表中任一元素(查找方便)
缺点:在插入,删除某一元素时,需要移动大量元素(非查找不方便)
先发表再说,玩去了,晚上再来总结链表
原文:http://blog.csdn.net/wust__wangfan/article/details/19037071