数据结构(一)——实现线性表顺序存储结构的增改删查

一.线性表的定义

线性表:简称表,是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( );              //输出所有元素
}

实验结果如下:
在这里插入图片描述

三.小结

顺序存储结构采用数组实现,是数据结构中最简单的一种存储方式。顺序表的优缺点如下:

顺序表的优点:

⑴ 无需为表示表中元素之间的逻辑关系而增加额外的存储空间;
⑵ 随机存取:可以快速地存取表中任一位置的元素。

顺序表的缺点:

⑴ 插入和删除操作需要移动大量元素;
⑵ 表的容量难以确定,表的容量难以扩充;
⑶ 造成存储空间的碎片。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值