线性表——顺序存储实现

什么是线性表?

线性表(Linear List):同类型数据元素构成有序序列的线性结构

概念
表中元素个数称为线性表的长度
线性表没有元素时,称为空表
表起始位置称表头,表结束位置称表尾

线性表特点:

  • 它是一个序列,也就是说元素之间是有个先来后到的。
  • 若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继

线性表的抽象数据类型描述:

类型名称线性表(List)
数据对象集线性表是 n (≥0)个元素构成的有序序列( a1, a2, …,an )
操作集线性表基本操作主要有

线性表基本操作主要有:

1、List MakeEmpty():                             初始化一个空线性表L;
2、ElementType FindKth( int K, List L ):         根据位序K,返回相应元素 ;
3int Find( ElementType X, List L ):            在线性表L中查找X的第一次出现位置;
4void Insert( ElementType X, int i, List L):   在位序i前插入一个新元素X;
5void Delete( int i, List L ):                 删除指定位序i的元素;
6int Length( List L ):                         返回线性表L的长度n。

插入操作:

下面实现了部分操作:Find , MakeEmpty ,Delete ,Insert

#include <iostream>
#include <stdlib.h>
#define MAXSIZE 20
using namespace std; 
typedef int Position;
typedef int ElementType;
typedef struct LNode *List;

struct LNode {
    ElementType Data[MAXSIZE];
    Position Last;
};
 
/* 初始化 */
List MakeEmpty()
{
    List L;
 
    L = (List)malloc(sizeof(struct LNode));
    L->Last = 0;
 
    return L;
}
 
/* 查找 */
#define ERROR -1
 
Position Find( List L, ElementType X )
{
    Position i = 0;
 
    while( i <= L->Last && L->Data[i]!= X )
        i++;
    if ( i > L->Last )  return ERROR; /* 如果没找到,返回错误信息 */
    else  return i;  /* 找到后返回的是存储位置 */
}
 
/* 插入 */
/*注意:这里P是存储下标位置(从1开始)*/
bool Insert( List L, ElementType X, Position P ) 
{ /* 在L的指定位置P前插入一个新元素X */
    Position i;
 
    if ( L->Last == MAXSIZE) {
        /* 表空间已满,不能插入 */
        printf("表满"); 
        return false; 
    }  
    if ( P<1 || P>L->Last+1 ) { /* 检查插入位置的合法性 */
        printf("位置不合法");
        return false; 
    } 
    for( i=L->Last-1; i>=P-1; i-- )
        L->Data[i+1] = L->Data[i]; /* 将位置P及以后的元素顺序向后移动 */
    L->Data[P-1] = X;  /* 新元素插入 */
    L->Last++;       /* Last仍指向最后元素 */
    return true; 
} 
 
/* 删除 */
/*注意:这里P是存储下标位置(从1开始)*/
bool Delete( List L, Position P )
{ /* 从L中删除指定位置P的元素 */
    Position i;
 
    if( P<1 || P>L->Last ) { /* 检查空表及删除位置的合法性 */
        printf("位置%d不存在元素", P ); 
        return false; 
    }
    for( i=P-1; i<L->Last; i++ )
        L->Data[i] = L->Data[i+1]; /* 将位置P+1及以后的元素顺序向前移动 */
    L->Last--; /* Last仍指向最后元素 */
    return true;   
}

int main(){
	List L;
	L = MakeEmpty();
	
	for(int i = 0; i < MAXSIZE-5 ; i++){
		L->Data[i] = i; 
		L->Last++;
	}
	
	for(int i = 0; i < L->Last ; i++){
		cout<<"   "<<L->Data[i] ; 
	}
	cout<<endl;
	Delete(L,5);//删除第5个元素 
	
	for(int i = 0; i < L->Last ; i++){
		cout<<"   "<<L->Data[i] ; 
	}
	cout<<endl;
	Insert(L,4,5);//插入5这个元素,在第5个位置 
	for(int i = 0; i < L->Last ; i++){
		cout<<"   "<<L->Data[i] ; 
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值