資料結構實踐——順序表應用,資料結構實踐順序
【項目 - 順序表應用】
定義一個採用順序結構儲存的線性表,設計演算法完成下面的工作:
1、刪除元素在[x, y]之間的所有元素,要求演算法的時間複雜度為O(n),空間複雜度為O(1);
2、將所在奇數移到所有偶數的前面,要求演算法的時間複雜度為O(n),空間複雜度為O(1)。
提示:
(1)充分利用前面建立的演算法庫解決建立順序表、輸出線性表的問題;
(2)為保證複雜度的要求,設計演算法並用專門的函數實現演算法;
(3)每項工作寫一個程式,並發布博文,展示你的實踐成果。
[參考解答] (註:項目中所需要的list.h和list.cpp見點擊參照…)
1、刪除元素在[x, y]之間的所有元素,要求演算法的時間複雜度為O(n),空間複雜度為O(1);
#include "list.h"#include <stdio.h>//刪除線性表中,元素值在x到y之間的元素void delx2y(SqList *&L, ElemType x, ElemType y){ int k=0,i; //k記錄非x的元素個數 ElemType t; if(x>y) { t=x; x=y; y=t; } for (i=0; i<L->length; i++) if (L->data[i]<x || L->data[i]>y ) //複製不在[x, y]之間的元素 { L->data[k]=L->data[i]; k++; } L->length=k;}//用main寫測試代碼int main(){ SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("刪除前 "); DispList(sq); delx2y(sq, 4, 7); printf("刪除後 "); DispList(sq); return 0;}
2、將所在奇數移到所有偶數的前面,要求演算法的時間複雜度為O(n),空間複雜度為O(1)。
#include "list.h"#include <stdio.h>//移動結束後,奇數居左,偶數居右void move(SqList *&L){ int i=0,j=L->length-1; ElemType tmp; while (i<j) { while ((i<j) && (L->data[j]%2==0)) //從右往左,找到第一個奇數(偶數就忽略不管) j--; while ((i<j) && (L->data[i]%2==1)) //從左往右,找到第一個偶數(奇數就忽略不管) i++; if (i<j) //如果未到達“分界線”,將右邊的奇數和左邊的偶數交換 { tmp=L->data[i]; L->data[i]=L->data[j]; L->data[j]=tmp; } } //待迴圈上去後,繼續尋找,並在必要時交換}//用main寫測試代碼int main(){ SqList *sq; ElemType a[10]= {5,8,7,0,2,4,9,6,7,3}; CreateList(sq, a, 10); printf("操作前 "); DispList(sq); move(sq); printf("操作後 "); DispList(sq); return 0;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。