数据结构快速入门—线性表的基本操作详解【C++】

文章目录

  • 一、什么是线性表?
  • 二、线性表的基本操作
  • 1.定义顺序表的存储结构
  • 2.顺序表的初始化
  • 3.顺序表的创建
  • 4.插入
  • 5.删除
  • 6.按值查找
  • 7.遍历
  • 三.全部代码

一、什么是线性表?

线性表是具有相同特性的数据元素的一个有限序列。由n(n>=0)个数据元素(结点)a1,a2,……an组成的有限序列。  其中a1我们叫做a2的直接前驱,a2叫做a1的直接后继。a1为线性起点,an为线性终点。线性表有顺序存储结构和链式存储结构,下面我们主要讲解线性表的顺序存储结构,之后为了区分我们简称为顺序表。

     通俗来说,顺序表与我们之前学习数组的概念相类似。

二、线性表的基本操作

1.定义顺序表的存储结构

#include <iostream> 
using namespace std; 
#define MAXSIZE 100   //线性表存储空间的初始分配量
#define OVERFLOW -1 
 
//定义顺序表的存储结构
typedef struct{  
    int *data;     
    int length;   // 顺序表的表长
} SqList;  //顺序表类型

2.顺序表的初始化

//线性表的初始化  
void Init(SqList &L){        // 构造一个空的顺序表L     
    L.data=new int[MAXSIZE];    // 为顺序表分配空间
    if(!L.data)  exit(OVERFLOW); //如果存储分配失败,则返回OVERFLOW
    L.length=0;   //初始顺序表长度为零
} 

3.创建

//创建顺序表  
void Create(SqList &L,int n){  // 创建顺序表L,输入总表长
    int e; 
    for (int i=0;i<n;i++){   	
        cin >>e;   	//从键盘中输入想要的元素
        L.data[i]=e; //将元素赋值给L的数据域中
	  	L.length++;   //表长+1
 } 
} 

4.插入

// 顺序表的插入  
int Insert(SqList &L,int i,int e) {    // 创建顺序表L,插入的位置i,插入的元素e
      if((i<1 ) || (i>L.length+1))    //插入位置不合法
          return OVERFLOW;  
      if(L.length==MAXSIZE)     //存储空间已满
          return OVERFLOW; 
         for(int j=L.length-1;j>=i-1;j--){   	
            L.data[j+1]=L.data[j];       //插入位置及之后的元素后移
 } 
        L.data[i-1]=e;  //将新元素 e 放入第 i 个位置  
        L.length++;  //表长+1
} 

5.删除

//顺序表的删除  
int Delete(SqList &L,int i){ 
     if((i<1)||(i>L.length))    //删除的位置i不合法
         return OVERFLOW; 
     for(int j=i;j<=L.length;j++)   	
         L.data[j-1]=L.data[j];  //被删除元素之后的元素前移
         L.length--;   //表长减1
} 

6.顺序表的查找(按值)

//按值查找  
int Locate(SqList L,int e){  
    //  在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)
   for(int i=0;i<L.length;i++)   
       if(L.data[i]==e)   
          return i+1;    //查找成功,返回序号
    return 0;    //查找失败,返回零
}  

7.遍历

//遍历顺序表 
void Print (SqList L){ 
   if(L.length==0) 
     cout <<"线性表长度为 0"; 
   for(int k=0;k<L.length;k++){      
      cout <<L.data[k] <<" ";     //循环输出L中的数据
}  
    cout <<endl; 
}  

   全部代码

#include <iostream> 
using namespace std; 
#define MAXSIZE 100   //线性表存储空间的初始分配量
#define OVERFLOW -1 
 
//定义顺序表的存储结构
typedef struct{  
    int *data;     
    int length;   // 顺序表的表长
} SqList;  //顺序表类型


//线性表的初始化  
void Init(SqList &L){        // 构造一个空的顺序表L     
    L.data=new int[MAXSIZE];    // 为顺序表分配空间
    if(!L.data)  exit(OVERFLOW); //如果存储分配失败,则返回OVERFLOW
    L.length=0;   //初始顺序表长度为零
} 


//创建顺序表  
void Create(SqList &L,int n){  // 创建顺序表L,输入总表长
    int e; 
    for (int i=0;i<n;i++){   	
        cin >>e;   	//从键盘中输入想要的元素
        L.data[i]=e; //将元素赋值给L的数据域中
	  	L.length++;   //表长+1
 } 
} 

// 顺序表的插入  
int Insert(SqList &L,int i,int e) {    // 创建顺序表L,插入的位置i,插入的元素e
      if((i<1 ) || (i>L.length+1))    //插入位置不合法
          return OVERFLOW;  
      if(L.length==MAXSIZE)     //存储空间已满
          return OVERFLOW; 
         for(int j=L.length-1;j>=i-1;j--){   	
            L.data[j+1]=L.data[j];       //插入位置及之后的元素后移
 } 
        L.data[i-1]=e;  //将新元素 e 放入第 i 个位置  
        L.length++;  //表长+1
} 

//顺序表的删除  
int Delete(SqList &L,int i){ 
     if((i<1)||(i>L.length))    //删除的位置i不合法
         return OVERFLOW; 
     for(int j=i;j<=L.length;j++)   	
         L.data[j-1]=L.data[j];  //被删除元素之后的元素前移
         L.length--;   //表长减1
} 

//按值查找  
int Locate(SqList L,int e){  
    //  在线性表L中查找值为e的数据元素,返回其序号(是第几个元素)
   for(int i=0;i<L.length;i++)   
       if(L.data[i]==e)   
          return i+1;    //查找成功,返回序号
    return 0;    //查找失败,返回零
}  

//遍历顺序表 
void Print (SqList L){ 
   if(L.length==0) 
     cout <<"线性表长度为 0"; 
   for(int k=0;k<L.length;k++){      
      cout <<L.data[k] <<" ";     //循环输出L中的数据
}  
    cout <<endl; 
}  

//运行调试
int main(int argc, char** argv) { 
    SqList L;  //创建顺序表L
    Init(L); //初始化顺序表
    cout <<"输入当前元素:"; 
    Create(L,5); 
    cout <<"输出后的元素:"; 
    cout <<Locate(L,15)<<endl;    //按值查找  
	Delete(L,4);     //删除  
	Insert(L,2,3); //插入  
    Print(L);  
    return 0; 
} 

  • 12
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值