数据结构第二篇——线性表的顺序存储
♥注:未经博主同意,不得转载。
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。
由于高级程序语言中的数组类型也有随机存取的特性,因此,通常都用数组来描述数据结构中的书序存储结构。
如下描述:
1 const int MaxListSize=100; //最大数据个数 2 //other way 3 //define MaxListSize 100 4 5 class List{ 6 7 private: 8 Data data[MaxListSize]; //存放数据 9 int size; //数据个数 10 11 public: 12 List(){size=0; } //构造函数 13 //~List(); //析构函数 14 15 void Clear(){size=0;} //清空 16 bool IsEmpty(); //判断是否为空 17 Data GetElem(int i); //返回第i个元素的值 18 int Locate(Data e); //返回第一个与e匹配的元素的位序 19 Data Prior(Data e); //返回e的前驱 20 Data Next(Data e); //返回e的后继 21 void Insert(Data e,int i); //第i个位置插入新元素e 22 Data Delete(int i); //删除第i个元素,返回该元素 23 int Length(){return size;} //返回长度 24 void print(); //输出元素 25 }; 26
这些基本操作在顺序表中的实现如下:
1 //插入元素 2 void List::Insert(Data e,int i) 3 { 4 if(i<1||i>size+1||i>=MaxListSize) 5 { 6 cout<<"插入位置错误!"<<endl; 7 exit(0); 8 } 9 else 10 { 11 for(int j=size-1;j>=i-1;--j) //将i后的元素整体往后移一个单位 12 data[j+1]=data[j]; 13 14 data[i-1]=e; //将元素e插入 15 ++size; 16 } 17 } 18 19 //删除元素 20 Data List::Delete(int i) 21 { 22 if(i<1||i>size) 23 { 24 cout<<"删除位置错误!"<<endl; 25 exit(0); 26 } 27 else 28 { 29 Data e=data[i-1]; 30 for(int j=i-1;j<size-1;++j) 31 data[j]=data[j+1]; 32 --size; 33 return e; 34 } 35 } 36 37 //查找与e匹配的第一个元素 38 int List::Locate(Data e) 39 { 40 int i=1; 41 while(i<=size&&data[i-1]!=e) 42 ++i; 43 if(i>size) 44 return 0; 45 else 46 return i; 47 } 48 49 //判断线性表是否为空 50 bool List::IsEmpty() 51 { 52 if(size==0) 53 return true; 54 else 55 return false; 56 } 57 58 //取元素操作 59 Data List::GetElem(int i) 60 { 61 if(i<1||i>size) 62 { 63 cout<<"位置错误!"<<endl; 64 exit(0); 65 } 66 else 67 return data[i-1]; 68 } 69 70 //输出所有元素 71 void List::print() 72 { 73 if(size==0) 74 { 75 cout<<"空表,无元素!"<<endl; 76 exit(0); 77 } 78 else 79 { 80 for(int i=0;i<size;++i) 81 cout<<data[i]<<' '; 82 cout<<endl; 83 } 84 } 85 86 //返回e的前驱 87 Data List::Prior(int e) 88 { 89 for(int i=0;i<size;++i) 90 { 91 if(e==data[i]) 92 { 93 if(i==0) 94 { 95 cout<<"这已是第一个元素"<<endl; 96 return -100; 97 } 98 else 99 return data[i-1]; 100 } 101 } 102 cout<<"表中无此元素"<<endl; 103 return -101; 104 } 105 106 //返回e的后继 107 Data List::Next(int e) 108 { 109 for(int i=0;i<size;++i) 110 { 111 if(e==data[i]) 112 { 113 if(i==(size-1)) 114 { 115 cout<<"这已是最后一个元素"<<endl; 116 return -100; 117 } 118 else 119 return data[i+1]; 120 } 121 } 122 cout<<"表中无此元素"<<endl; 123 return -101; 124 }
对上述算法的调试则放在main函数里:
1 int main() 2 { 3 system("color 0A"); 4 int a[8]={3,6,9,12,15,18,21,24}; 5 int i,j; 6 Data x; // 定义元素x 7 List list; //定义线性表对象 8 9 if(list.IsEmpty()) 10 cout<<"当前为空表"<<endl<<endl; 11 12 for(i=1;i<=8;++i) //将数组a的元素插入线性表中 13 list.Insert(a[i-1],i); 14 list.print(); 15 cout<<"当前线性表长度:"<<list.Length()<<endl; 16 cout<<endl; 17 18 cout<<"输入要插入的元素和位置:"; 19 cin>>x>>i; 20 list.Insert(x,i); //插入元素 21 list.print(); 22 cout<<"当前线性表长度:"<<list.Length()<<endl; 23 cout<<endl; 24 25 cout<<"输入要插入的元素和位置:"; 26 cin>>x>>i; 27 list.Insert(x,i); //插入元素 28 list.print(); 29 cout<<"当前线性表长度:"<<list.Length()<<endl; 30 cout<<endl; 31 32 cout<<"输入要插入的元素和位置:"; 33 cin>>x>>i; 34 list.Insert(x,i); //插入元素 35 list.print(); 36 cout<<"当前线性表长度:"<<list.Length()<<endl; 37 cout<<endl; 38 39 if(list.IsEmpty()) 40 cout<<"当前为空表"<<endl; 41 else 42 cout<<"当前非空"<<endl<<endl; 43 44 cout<<"输入要查找的元素:"; //查找某一个元素 45 cin>>x; 46 j=list.Locate(x); 47 if(j) 48 cout<<"查找成功,是第"<<j<<"个元素"<<endl; 49 else 50 cout<<"没有此元素"<<endl; 51 cout<<endl; 52 53 cout<<"输入要查找的元素:"; //查找某一个元素 54 cin>>x; 55 j=list.Locate(x); 56 if(j) 57 cout<<"查找成功,是第"<<j<<"个元素"<<endl; 58 else 59 cout<<"没有此元素"<<endl; 60 cout<<endl; 61 62 cout<<"当前表中元素:/t"; 63 list.print(); 64 cout<<"输入想要查找元素的位置:"; // 输出某个位置的元素 65 cin>>i; 66 cout<<list.GetElem(i)<<endl; 67 cout<<endl; 68 cout<<"输入想要查找元素的位置:"; // 输出某个位置的元素 69 cin>>i; 70 cout<<list.GetElem(i)<<endl; 71 cout<<endl; 72 73 cout<<"输入想要删除元素的位置:"; // 删除某个位置的元素 74 cin>>i; 75 cout<<list.Delete(i)<<endl; 76 list.print(); 77 cout<<"当前线性表长度:"<<list.Length()<<endl; 78 cout<<endl; 79 cout<<"输入想要删除元素的位置:"; // 删除某个位置的元素 80 cin>>i; 81 cout<<list.Delete(i)<<endl; 82 list.print(); 83 cout<<"当前线性表长度:"<<list.Length()<<endl; 84 cout<<endl; 85 86 cout<<"输入想要查找前驱的元素:"; // 查找某元素前驱 87 cin>>i; 88 if(list.Prior(i)>-100) 89 cout<<list.Prior(i)<<endl; 90 91 cout<<"输入想要查找后继的元素:"; // 查找某元素后继 92 cin>>i; 93 if(list.Next(i)>-100) 94 cout<<list.Next(i)<<endl; 95 96 return 0; 97 }
最终的实现效果如下: