一.线性表的定义
线性表:简称表,是n(n≥0)个具有相同类型的数据元素的有限序列。
}
线性表的长度:线性表中数据元素的个数。
空表:长度等于零的线性表,记为:L=( )。
非空表记为:L=(a1, a2 , …, ai-1, ai , …, an)
其中,ai(1≤i≤n)称为数据元素;
下角标 i 表示该元素在线性表中的位置或序号 。
二.顺序存储结构实现线性表的增改删查
2.1 采用C++实现,代码如下:(数组的第一个元素a[0]未使用)
#include<iostream>
#define MaxListLen 15
using namespace std ;
int Error = 0 ;
int ListLen = 0 ;
int SeqList [MaxListLen + 1] ;
//顺序表的插入
void InsertSeqList (int NewItem , int i)
{
int j ;
if ((i > ListLen + 1) || (i < 1) || (ListLen == MaxListLen))
{
Error = -2 ; //插入出错返回
cout << "插入出错!!!";
}
else
{
for (j = ListLen ; j >= i ; j -- ) //从后往前移
{
SeqList [j+1] = SeqList [j] ;
}
SeqList [i] = NewItem ; //插入新元素
ListLen = ListLen + 1 ; //表长加一
}
}
//顺序表查找
int SearchSeqList (int i)
{
if ((i > ListLen+1) || (i < 1) || (ListLen == 0))
{
Error = -1 ;
cout << "查找位置出错!!!" ;
return (Error) ; //查找出错返回
}
else
{
return SeqList[i] ; //返回指定位置的元素值
}
}
//顺序表指定位置数据的删除
int DeleteSeqList (int i)
{
int j ;
if ((i > ListLen)||(i < 1) || (ListLen == 0))
{
Error = -3 ; //删除出错返回
cout << "删除位置出错!!!" ;
return (Error) ;
}
else
{
for (j = i ; j < ListLen ; j ++ ) //从前往后移
{
SeqList [j] = SeqList [j+1] ;
}
ListLen = ListLen - 1 ; //表长减一
}
}
//顺序表显示
void ShowSeqList ()
{
int i ;
cout << "The list : " <<endl ;
for (i = 1 ; i <= ListLen ; i ++ )
{
cout <<SeqList[i]<<" " ; //逐个显示数据元素
}
cout << endl ; //换行
}
//主函数
int main (int argc , char * argv[])
{
int i , SearchPos , NewPos , NewItem , DelPos ;
cout << "请输入样本数目: " <<endl ;
cin >> ListLen ; //输入样本数目(表长)
//创建顺序表
for (i = 1 ; i <= ListLen ; i++)
{
cout << "Please input No." << i <<" Item : ";
cin >> SeqList[i] ;
}
ShowSeqList () ; //显示顺序表
cout << "请输入你想查找的位置: "<<endl ;
cin >> SearchPos ; //输入查找位置
cout << "Your Searched Item is : " <<SearchSeqList (SearchPos) << endl ; //输出查找的数据元素值
cout << "请输入你想插入的位置: " <<endl ;
cin >> NewPos ; //插入位置输入
cout << "After insert " <<endl ;
cin >> NewItem ; //插入元素输入
InsertSeqList (NewItem , NewPos) ; //新数据插入顺序表MAXLISTLEN 100
cout << "After Insert : " ;
ShowSeqList () ; //显示顺序表
cout << "请输入你想删除的位置: " ;
cin >> DelPos ; //输入删除元素位置
DeleteSeqList (DelPos) ; //按位置删除数据
cout << "After delete : " ;
ShowSeqList () ;
if (Error < 0) cout <<"Error: " << Error << endl ;
return 0 ;
}
实验结果如下:
2.2 采用类模板实现顺序存储结构线性表的增改删查,代码如下:
#include <iostream> //引用输入输出流库函数的头文件
using namespace std;
#define random(x) (rand()%x)+1
const int MaxSize = 15; //15只是示例性的数据,可以根据实际问题具体定义
template <class DataType> //定义模板类SeqList
class SeqList
{
public:
SeqList( ) {length = 0;} //无参构造函数,建立一个空的顺序表
SeqList(DataType a[ ], int n); //有参构造函数,建立一个长度为n的顺序表
~SeqList( ) { } //析构函数为空
int Length( ) {return length;} //求线性表的长度
DataType Get(int i); //按位查找,在线性表中查找第i个元素
int Locate(DataType x ); //按值查找,在线性表中查找值为x的元素序号
void Insert(int i, DataType x); //插入操作,在线性表中第i个位置插入值为x的元素
DataType Delete(int i); //删除操作,删除线性表的第i个元素
void PrintList( ); //遍历操作,按序号依次输出各元素
private:
DataType data[MaxSize]; //存放数据元素的数组
int length; //线性表的长度
};
template <class DataType>
SeqList<DataType> :: SeqList(DataType a[ ], int n)
{
if (n > MaxSize) throw "参数非法";
for (int i = 0; i < n; i++)
data[i] = a[i];
length = n;
}
template <class DataType>
DataType SeqList<DataType> :: Get(int i)
{
if (i < 1 && i > length) throw "查找位置非法";
else return data[i - 1];
}
template <class DataType>
int SeqList<DataType> :: Locate(DataType x)
{
for (int i = 0; i < length; i++)
if (data[i] == x) return i+1; //下标为i的元素等于x,返回其序号i+1
return 0; //退出循环,说明查找失败
}
template <class DataType>
void SeqList<DataType> :: Insert(int i, DataType x)
{
if (length >= MaxSize) throw "上溢";
if (i < 1 || i > length + 1) throw "插入位置非法";
for (int j = length; j >= i; j--)
data[j] = data[j - 1]; //注意第j个元素存在数组下标为j-1处
data[i - 1] = x;
length++;
}
template <class DataType>
DataType SeqList<DataType> :: Delete(int i)
{
if (length == 0) throw "下溢";
if (i < 1 || i > length) throw "删除位置非法";
DataType x = data[i - 1]; //取出位置i的元素
for (int j = i; j < length; j++)
data[j - 1] = data[j]; //注意此处j已经是元素所在的数组下标
length--;
return x;
}
template <class DataType>
void SeqList<DataType> :: PrintList( )
{
for (int i = 0; i < length; i++)
cout << data[i]<<" "; //依次输出线性表的元素值
cout << endl;
}
void main( )
{
char r[10];
for(int i = 0; i < 10; i++)
r[i] =char(65+random(26));
SeqList<char> L(r, 10);
cout<<"执行插入操作前数据为:"<<endl;
L.PrintList( ); //输出所有元素
try
{
L.Insert(5,'a'); }
catch (char *s)
{
cout<<s<<endl;
}
cout<<"执行插入操作后数据为:"<<endl;
L.PrintList( ); //输出所有元素
cout<<"值为'a'的元素位置为:";
cout<<L.Locate('a')<<endl; //查找元素3,并返回在单链表中位置
cout<<"执行删除第五个元素操作,删除前数据为:"<<endl;
L.PrintList( ); //输出所有元素
try
{
L.Delete(5); //删除第1个元素
}
catch (char *s)
{
cout<<s<<endl;
}
cout<<"删除后数据为:"<<endl;
L.PrintList( ); //输出所有元素
}
实验结果如下:
三.小结
顺序存储结构采用数组实现,是数据结构中最简单的一种存储方式。顺序表的优缺点如下:
顺序表的优点:
⑴ 无需为表示表中元素之间的逻辑关系而增加额外的存储空间;
⑵ 随机存取:可以快速地存取表中任一位置的元素。
顺序表的缺点:
⑴ 插入和删除操作需要移动大量元素;
⑵ 表的容量难以确定,表的容量难以扩充;
⑶ 造成存储空间的碎片。