《数据结构》期末复习复习要点:第一章1.相关基本概念:数据、数据元素(基本单位)、数据项(最小单位)、算法及其特征等;◎数据:所有能输入到计算机中并被计算机程序处理的符号总称。
◎数据元素:基本单位。
◎数据项:最小单位。
◎算法特征(5点):有穷性;确定性;可行性;输入;输出。
2.逻辑结构、存储结构(物理结构)及其类型;◎逻辑结构有四种基本类型:集合、线性结构、树形结构和网状结构。
◎数据元素之间的关系有两种不同的表示方法:顺序映象和非顺序映象,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
◎注:期中考题目数据结构分为两大类,即为逻辑结构和存储结构。
其中逻辑结果又分为线性结构和非线性结构,存储结构一共有四种(顺序、链接、索引、散列)。
3.算法分析:语句频度(执行次数)计算、时间和空间复杂度分析。
表示方法◎语句频度:直接写次数。
◎时间复杂度:O(执行次数),如:O(n)。
◎空间复杂度:O(所需空间)第二章1.顺序表(数组)插入、删除、有序表合并算法及其移动次数计算;数据元素表示 L.elem[0] [1] [2] [3] [4] [5] [6] [7]◎顺序表插入算法思想:如果要在序号5前插入元素e,需要将序号5~8向后移动一个位置。
▲移动次数为4次,公式n-i+1◎顺序表删除算法思想:如果要删除序号5元素,需要将6~8依次向前移动一位▲移动次数为3次,公式n-i◎有序表合并LA = (3,5,8,11)LB = (2,6,8,9,11,15,20)则LC = (2,3,5,6,8,8,9,11,11,15,20)算法思想(以非递减为例):La和Lb非递减排列,La与Lb中元素逐个比较,较小的先插入Lc中。
▲注:非递减是指递增排序,但元素有可能相等,与之相对的有非递增排序。
▲移动次数为(La.length + Lb.length)2.链表(有无头节点、单双、循环)插入(前、后)、删除(前、本身、后)的指针挂接、建立(不带头节点)算法。
◎单链表▲每个节点有数据域和指针域 data next头 a1 a2 a3 a4 a5 a6带头节点L→→→→→→→P↑a1 a2 a3 a4 a5 a6不带头节点L→→→→→→P↑单循环链表●在P(a3)节点前插入S节点(1)Q = P; //先让Q指向a3(2)P = L; //P指向第一个节点(带头结点指向头结点,不带头结点指向a1)(3)while(P->next != Q) P = P->next; //找到a3的前驱a2,P指向a2(4)S->next = P->next; //P->next为a3,让S->next等于a3(5)P->next = S; //a2指针域指向节点S●在P(a3)节点后插入S节点(1)S-next = P->next;(2)P->next = S;●删除P(a3)前一个节点(1)Q = P;(2)P = L;(3)while(P->next->next != Q) P = P->next; //找到a1(4)P->next = P->next->next; //让a1指针域指向a3,从而删除a2●删除P(a3)节点(1)Q = P;(2)P = L;(3)while(P->next != Q) P = P->next; //找到a2(4)P->next = P->next->next; //让a2指针域指向a4,从而删除a3●删除P(a3)后一个节点(1)P->next = P->next->next; //让a3指针域指向a5,从而删除a4◎双链表▲每个节点有前驱指针、数据域、后继指针 prior data next双循环链表头 a1 a2 a3 a4●在P(a2)节点前插入S节点▲技巧:先让S->prior 和S->next与链表建立关系注:步骤(4)必须在步骤(3)后面(1)S->next = P; //先让S->next指向a2(2)S->prior = P->prior; //S->prior指向a1(3)P->prior->next = S; //再把a1->next指向S(4)P->prior = S; // a2->prior指向S●在P(a2)节点后插入S节点注:步骤(4)必须在步骤(3)后面(1)S->prior = P;(2)S->next = P->next;(3)P->next->prior = S; //a3->prior指向S(4)P->next = S;●删除P(a2)前一个节点a1(1)Q = P->prior; //Q指向要被删除的a1;(2)P->prior = P->prior->prior; //P->priro指向头(3)P->prior->next = P; //头->next指向P(4)free(Q); //释放a1的存储空间●删除P(a2)节点(1)P->next->prior = p->prior;(2)P->prior->next = p->next;(3)free(P);●删除P(a2)后一个节点a3(1)Q = P->next;(2)P->next = P->next->next; //a2->next指向a4(3)P->next->prior = P; //a4->prior = P(4)free(Q); //释放a3存储空间◎建立(不带头节点)单链表读程序:设n为2(i取0,1)i = 0时,p↑L↑q↑i = 1时,→L↑q↑ p↑ L↑q↑ p↑→L↑ q↑p↑第三章1.栈的进出序列、栈、队列、循环队列的满/空条件;▲由于栈的插入、删除操作是限制在栈顶进行的,因而后进栈的元素必然是先出栈,0.所以栈是“后进先出”表。
▲由于队列的输入、输出操作分别在队的两端进行,因此先入队的元素必然先输出,故队列又称为“先进先出”表◎栈的进出序列例题:进栈序列为123,可能得到的出栈序列是什么?答:共五种123/132/213/231/321进出栈情况(以132序列为例):1进栈→1出栈,输出1→2进栈→3进栈→3出栈→2出栈输出32 ◎栈、队列、循环队列的满/空条件栈空条件:s.top = s.base;栈满条件:s.top - s.base = stacksize;队空条件:Q.front=Q.rear;队满条件:q->rear - q->front = MAXSIZE循环队列空条件:Q.front=Q.rear循环队列满条件:为避免在队满是队头指针和队尾指针也是重合的情况,规定队列中还有一个空的存储单元时为队满,即为Q.front=(Q.rear+1)MOD maxsize(MOD为取余运算符)。
因而,这种循环队列不适合用动态数组作为存储结构。
2. 栈、队列的存储结构、基本操作算法(双向栈);◎栈存储结构●顺序栈typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;●链式栈◎队列存储结构●顺序存储结构●链式存储结构◎双向栈存储结构:typedef struct{Elemtype *base[2];Elemtype *top[2];}BDStacktype; //双向栈类型初始化:Status Init_Stack(BDStacktype &tws, int m)//初始化一个大小为m的双向栈tws {tws.base[0 ]= (Elemtype*)malloc(sizeof(Elemtype)*m);tws.base[1] = tws.base[0] + m;tws.top[0] = tws.base[0];tws.top[1] = tws.base[1];return OK;}//Init_Stack入栈:Status push(BDStacktype &tws, int i, Elemtype x)//x入栈,i=0表示低端栈,i=1表示高端栈{if(tws.top[0] > tws.top[1]) return OVERFLOW;//注意此时的栈满条件if (i == 0) *tws.top[0]++ = x;else if (i == 1) *tws.top[1]-- = x;else return ERROR;return OK;}//push出栈:Status pop(BDStacktype &tws, int i, Elemtype &x)//x出栈,i=0表示低端栈,i=1表示高端栈{if (i == 0){if (tws.top[0] == tws.base[0]) return OVERFLOW;x = *--tws.top[0];}else if(i == 1){if(tws.top[1] == tws.base[1]) return OVERFLOW;x = *++tws.top[1];}else return ERROR;return OK;}//pop第四章1.字符串模式匹配的简单算法;int Index(SString S, SString T, int pos){ // 算法4.5// 返回子串T在主串S中第pos个字符之后的位置。
// 若不存在,则函数值为0。
// 其中,T非空,1≤pos≤StrLength(S)。
int i = pos;int j = 1;while (i <= S[0] && j <= T[0]) {if (S[i] == T[j]) { // 继续比较后继字符++i;++j;}else { // 指针后退重新开始匹配i = i-j+2; //此时i为上次开始比较位置的下一位 j = 1;}}if (j > T[0]) return i-T[0];else return 0;} // Index2.计算NEXT。
j :1 2 3 4 5 6 7串:a b c a b a anext[j]:0 1 1 1 2 3 2▲技巧:第一二个肯定是0,1!如果要计算next[4],找的字符串必须是以第3个字符c为结尾,第1个字符a为开头的。