大二上数据结构复习2
第二章線性表
綜合
一、在什么情況下用順序表比用鏈表好
表長度確定,很少進行插入刪除操作且經常訪問元素
二、2-4 順序表的插入和刪除要求仍然保持各個元素原來的次序。設在等概率情形下, 對有 127 個元素的順序表進行插入, 平均需要移動多少個元素? 刪除一個元素, 又平均需要移動多少個元素?
【解答】
若設順序表中已有 n = last+1 個元素,last 是順序表的數據成員,表明最
后表項的位置。又設插入或刪除表中各個元素的概率相等,則在插入時因有 n+1
個插入位置(可以在表中最后一個表項后面追加),每個元素位置插入的概率為
1/(n+1),但在刪除時只能在已有 n 個表項范圍內刪除,所以每個元素位置刪除
的概率為 1/n。
插入時平均移動元素個數 AMN(Averagy Moving Number )為 127/2 刪除時平均移動元素個數 AMN 為 126/2
算法設計
一、刪除帶頭結點的有序鏈表中所有其值大于A且小于B的數據元素:分析以下刪除結點的特點:下界A,上界B;A<…<B
思路:主要分為三步
1、將p指針定位到第一個大于A的位置同時將pre指針定位到最后一個大于等于A的位置
2、將p指針定位到第一個大于等于B的位置
3、使用q指針和s指針將待刪除數據free
二、鏈式存儲結構的原地逆置
思路:首先將首元素next指向NULL,接下來每次都將q所指向的元素的next指向H->next并令H->next=此元素
第四章串
注意:定長順序存儲即將字符存于數組中且總下標1開始,而0號單元存儲長度 串的模式匹配:子串的定位操作 int Index(SString S,SString T, int pos){ //返回子串T在主串S中第pos個字符之后的位置,若不存在,則函數值為0,其中,T非空,(1≦pos≦Strlength(S))。i=pos; //指向串s的第pos個字符j=1; //指向串t的第1個字符while((i<=S[0])&&(j<=T[0])){if(S[i]==T[j]) { ++i; ++j; } //繼續比較后繼字符else {i=i-j+2; j=1;} //串S指針回溯重新開始匹配}if(j>T[0]) return i-T[0]; //匹配成功,返回模式串t在串s中的起始位置else return 0; //匹配失敗返回0 } //Index第五章數組和廣義表
綜合
一、若在一維數組 B 中從 0 號位置開始存放,則對稱矩陣 A 中的任一元素aij
在只存下三角部分的情形下應存于一維數組 B 的什么下標位置?給出計算
公式
答:只存下三角部分時,若 i > j,則數組元素 A[i][j]前面有 i-1 行(1?i-1,),第 1 行 有 1 個元素,第 2 行有 2 個元素,第 i-1 行有 i-1 個元素。在第 i 行中,第 j 號元素排在第 j-1 個元素位置,因此,數組元素 A[i][j]在數組 B 中的存放位置為1 + 2 +…+ (i-1) + j-1 = ( i-1)*i / 2 + j-1
若 i < j,數組元素 A[i][j]在數組 B 中沒有存放,可以找它的對稱元素 A[j][i]。在數組 B 的第 (j-1)j / 2 + i-1 位置中找到。(之所以減一是因為從零開始存儲)
4.二維數組A[10][20]采用列序為主方式存儲,每個元素占一個存儲單元,且A[0][0]的地址是200,則A[6][12]的地址是 。
【答案】326
【解析】采用列主序時,LOC(A[6][12])=LOC(A[0][0]+(1210+6)*1=326
第六章樹和二叉樹
1、求樹的深度
int Depth (BiTree T ){ // 返回二叉樹的深度if ( !T ) depthval = 0;else {depthLeft = Depth( T->lchild );depthRight= Depth( T->rchild );depthval = 1 + (depthLeft > depthRight ?depthLeft : depthRight);} return depthval; }2、 由先序ABC##DE#G##F###建樹
BiTree CreatBinTree(){BiTree B;B = (BiTree)malloc(sizeof(BiTNode));char c;scanf("%c",&c);if(c != '#'){B->data = c;B->lchild = CreatBinTree();B->rchild = CreatBinTree();}else B = NULL;return B; }第七章圖
迪杰斯特拉算法
第九章查找
折半查找非遞歸算法和遞歸算法
//非遞歸 int halfSearch(List list,int x){int low = 1;//從一開始存儲int high = list.length;int mid;while(low<=high){mid = (low + high)/2;if(x == list[mid])return mid;else if(x <= list[mid])high = mid;else low = mid;}return 0; } //遞歸 int halfSearch(int low,int high,int x){if(low <= high)return 0;int mid = (low + high)/2;if(x == list[mid])return mid;else if(x < list[mid])return halfSearch(low,mid,x);else return halfSearch(mid,high,x);return 0; }索引順序表
索引順序表是一種性能介于順序查找和折半查找之間的查找方法。在建立順序表的同時,建立一個索引
解釋:在0 ~ 5之間21為最大的數,在5 ~ 10之間40最大,在10以后78最大,所以比如要查找33,先和21、 40、 78比較,33<40且33>21,所以在第二個區間順序查找
第十章排序
簡單選擇排序
void SelectSort(SqList &L){ for(i=1;i<L.length; ++ i) {//進行n-1趟排序,每趟選出1個最小記錄//假定起始位置為最小記錄的位置j=SelectMinkey(L,i); //在L.r[i … n]中查找最小記錄if(i!=j) {temp = L.r[i];L.r[i]=L.r[j]; L.r[j] = temp;}//交換記錄,若選出的是第i個,則不進行交換}// SelectSort一趟快速排序
int Partition (SqList &L, int low, int high) {L.r[0] = L.r[low]; pivotkey = L.r[low].key; //樞軸 while (low<high) {while(low<high&&L.r[high].key>=pivotkey)--high;//從右向左搜索L.r[low] = L.r[high];while(low<high &&L.r[low].key<=pivotkey)++low;//從左向右搜索L.r[high] = L.r[low];} }// Partition起泡排序
總結
以上是生活随笔為你收集整理的大二上数据结构复习2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ceph iscsi安装
- 下一篇: python深拷贝,浅拷贝,赋值引用