線性表中刪除所有值等於X的元素(1)
阿新 • • 發佈:2019-02-13
/*程式的版權和版本宣告部分: *Copyright(c)2014,煙臺大學計算機學院學生 *All rights reserved. *檔名稱: *作者:田成琳 *完成日期:2014 年 9 月 5 日 *版本號:v1.0 *對任務及求解方法的描述部分: *問題描述:線性順序表的簡單應用 *程式輸入:n和n個元素,最後輸入要刪除的x *程式輸出:刪除x後的線性表 *問題分析:設刪除L中所有值等於x元素後的順序表為L1,顯然 L1包含於L,為此L1重用L的空間。掃描順序表L, 重建L1只包含不等於x的元素。 *演算法設計:演算法中只掃描順序表1次,時間複雜度為O(n)。 空間複雜度為O(1)。 */ #include<iostream> #include<cstdlib> using namespace std; const int MaxSize=50; //順序表中最多元素個數 typedef struct { int data[MaxSize]; //存放順序表中元素 int length; //存放順序表長度 }SqList; void InitList(SqList *&L); //初始化線性表,構造空線性表L void CreateList(SqList *L,int a[],int n);//建立順序表 void DestroyList(SqList *&L); //銷燬線性表,釋放L佔用的空間 bool ListEmpty(SqList *L); //判斷線性表是否為空 int ListLength(SqList *L); //返回線性表元素個數 void DisplayList(SqList *L); //輸出線性表 int GetElem(SqList *L,int i,int &e);//求線性表中某個元素值,e返回該資料 bool LocateElem(SqList *L,int e); //返回線性表中與e相等的元素位置 bool ListInsert(SqList *L,int i,int e);//在第i(1<=i<=n)插入元素e到線性表 bool ListDelete(SqList *L,int i);//,int &e);//刪除資料元素,並用e返回值 void InitList(SqList *L) { L->length=0; //空線性表長度設為0 L=(SqList *)malloc(sizeof(SqList));//分配存放線性表的空間 } void CreateList(SqList *L,int a[],int n) { for(int i=0;i<n;i++) L->data[i]=a[i]; L->length=n; } void DestroyList(SqList *&L) { free(L); } bool ListEmpty(SqList *L) { return(L->length==0); } int ListLength(SqList *L) { return(L->length); } void DisplayList(SqList *L) { for(int i=0;i<L->length;i++) cout<<L->data[i]<<" "; //遍歷輸出 cout<<endl; } int GetElem(SqList *L,int i,int &e) { if(i<1||i>L->length) cout<<"輸入資料出錯!"<<endl; e=L->data[i-1]; return e; } bool LocateElem(SqList *L,int n) { int i=0; while(i<=L->length&&L->data[i]!=n) i++; if(i>L->length) return false; //未找到返回false else return true; //找到返回true } bool ListInsert(SqList *L,int i,int e) { int j; if(i<1||i>L->length+1) return false; //引數錯誤 i--; //將順序表邏輯序號轉為物理序號 for(j=L->length;j>i;j--) L->data[j]=L->data[j-1];//將i及後面元素後移一個位置 L->data[i]=e; //插入元素e L->length++; //長度加1 return true; } bool ListDelete(SqList *L,int i)//,int &e) { int j; if(i<1||i>L->length+1) return false; //引數錯誤 i--; //將順序表邏輯序號轉為物理序號 //e=L->data[i]; for(j=i;j<L->length-1;j++) L->data[j]=L->data[j+1];//將i及後面元素前移一個位置 L->length--; //長度減1 return true; } int main() { SqList L; int i,n,x,number; cout<<"請輸入集合元素個數及元素值:"<<endl; cin>>n; int *arr=new int[n]; for(i=0;i<n;i++) cin>>arr[i]; CreateList(&L,arr,n); //建立L集合 cout<<"請輸入要刪除的線性表中的元素值:"<<endl; cin>>x; for(int j=0;j<ListLength(&L);j++) { number =0; //記錄不等於x元素的個數 if(L.data[j]!=x) { L.data[number]=L.data[j];//元素不等於x時,插入L number++; //個數加1 } } L.length=number; //別忘了長度賦值 cout<<"刪除"<<x<<"後線性表中的元素為:"<<endl; DisplayList(&L); return 0; }
執行結果: