2.2.3 P19
1.從順序表中刪除具有最小值的元素(假設唯一)並由函數返回被刪除元素的值。空出的位置由最后一個元素填補,若順序表為空則顯示出錯信息並推出運行。
Bool DeleminElem(Sqlist &L.Elemtype *e){ //先判斷合法性 if(L.length==0) return false; //聲明用來存放最小數據的變量 e=L.data[0]; int k=0; //找到最小值 for(int i=0;i<L.length;i++){ if(L.data[i]<e) e=L.data[i]; k=i; } //填補 L.data[k]=L.data[length-1]; L.length--; return true; }
2.設計一個高效算法,將順序表L的所有元素逆置,要求算法的空間復雜度為O(1)。
Bool ExchangeElem(Sqlist &L){ int c;
//典型的交換算法 for(int i = 0;i<L.length/2;i++){ c=L.data[i]; L.data[i]=L.data[length-1-i]; L.[length-1-i]=c; } return true; }
3.對長度為n的順序表L,編寫一個時間復雜度為O(n)、空間復雜度為O(1)的算法,該算法刪除線性表中所有值為x的數據元素
bool Deletex(Sqlist &L,Element x){ int k=0;//用來統計有多少個值為x的元素 //統計x的個數賦給k;將順序表里的元素向前移動k個位置 for(int i = 0;i<L.length;i++){ if(L.data[i]==x){ k++; }else{ L.data[i-k]=L.data[i]; } } //改變順序表的長度 L.length=L.length-k; retrun true; }
4.從有序順序表中刪除其值在給定值s與t之間(要求s<t)的所有元素,如果s或t不合理或順序表為空,則顯示出錯信息並退出運行
Bool DeleteSt(Sqlist &L,Element s,Element t){ //聲明i、j來標記s、t的位置 int i,j; //驗證合理性 if(s>=t||L.length==0) return false; //找到第一個大於s的位置 for(i=0;i<length&&L.data[i]<s;i++); //如果所有的值都小於s,那就返回false if(i>=L.length) return false; //尋找值大於t的第一個元素 for(j=i;j<length&&L.data[i]<t;j++); //進行刪除填補 for( ;j<L.length;j++){ L.data[i]=L.data[j]; i++; } //改變長度 L.length=i; return true; }
5 .從順序表中刪除其值在給定值s與t之間(要求s<t)的所有元素,如果s或t不合理或順序表為空,則顯示出錯信息並退出運行
bool DeleteSt(Sqlist &L,Element s,Element t){ if(s>=t||L.length==0) return false;//判斷合理性 int k=0;//記錄符合條件的值的個數 //開始執行找->記錄->移位 for(int i=0;i<L.length;i++){ if(L.data[i]>=s&&L.data[i]<=t){ k++; }else{ L.data[i-k]=L.data[i]; } } //改變長度 L.length-=k; return true; }
6.從有序順序表中刪除所有其值重復的元素,使表中所有元素的值均不同。
bool DelRepeat(Sqlist &L){ if(L.length==0) return false;//判斷合理性 //開始進行比對和移位的操作 for(int i=0,j=i;j<L.length;j++){ if(L.data[i] != L.data[j]) L.data[++i] = L.data[j]; } L.length=i+1;//當你改變順序表的長度時,數據元素從后往前依次被刪除 return true; }