《数据结构》学习记录(3):顺序表

一、概念

1、线性表

具有相同特性的数据元素的有限序列。

  • 相同特性:所有元素属于同一数据类型。
  • 有限:数据元素个数是有限的。
  • 序列:数据元素由逻辑序号唯一确定。

2、顺序表

按逻辑顺序将线性表内容依次存储到一片连续的存储空间中。

二、顺序表的基本操作

1、定义顺序表

#define ElemType char
const int MaxSize = 20;

struct SqList
{
    ElemType data[MaxSize];
    int length;
};

2、建立、初始化顺序表

//建立顺序表
void CreateList(SqList *&L,ElemType a[],int n)  
{     
    L = new SqList;
    for (int i = 0;i < n;++i)
        L->data[i] = a[i];
    L->length=n;
}

//初始化顺序表
void InitList(SqList *&L)
{      
    L = new SqList;
    L->length=0;
}

3、销毁顺序表、判断是否为空、获取长度、遍历

//销毁顺序表
void DestroyList(SqList *&L)
{
    delete L;
    L = nullptr;
}   

//判断是否为空
bool  ListEmpty(SqList *L)
{
   return L->length == 0;
}

//获取长度
int ListLength(SqList *L)
{
    return L->length;
}

//遍历
void DispList(SqList *L)
{    
    for (int i = 0;i < L->length;++i)
        printf("%c",L->data[i]);
}

4、获取索引处的值、获取元素在顺序表中的位置

//获取索引处的值
bool GetElem(SqList *L,int index,ElemType &e)
{     
    if (index < 1 || index > L->length)  
        return false;
    e = L->data[index];
    return true;
}  

//获取元素在顺序表中的位置
int LocateElem(SqList *L,ElemType e)
{     
    int i = 0;
    while (i < L->length && L->data[i] != e)  
        ++i;
    return i >= L->length ? -1 : i;
}

5、在索引处插入值

//在索引处插入值
bool ListInsert(SqList *&L,int index,ElemType e)
{     
    if (index < 1 || index > L->length+1)
        return false;
    for (int j = L->length;j > index;--j)	//将data[i..n]元素后移一个位置
        L->data[j] = L->data[j-1];
    L->data[index] = e;		//插入元素e
    L->length++;
    return true;
}

6、删除索引处的值

//删除索引处的值
bool ListDelete(SqList *&L,int index,ElemType &e)
{      
    if (index < 1 || index>L->length)
        return false;
    e = L->data[index];
    for (int j = index;j < (L->length - 1);++j)  	//将data[i..n-1]元素前移
        L->data[j] = L->data[j+1];
    L->length--;
    return true;
}

三、顺序表算法示例

1、例1

void delnode1(SqList *&A, ElemType x)
{    
    int k = 0;		  //k记录值不等于x的元素个数
    for (int i = 0;i < A->length;i++)
    if (A->data[i] != x)    //若当前元素不为x,将其插入A中
    {    
        A->data[k] = A->data[i];
	    k++;		 //不等于x的元素增1
    }
    A->length = k;		 //顺序表A的长度等于k
}

 

void delnode2(SqList *&A, ElemType x)
{     
    int k = 0,i = 0;	        	//k记录值等于x的元素个数
    while (i < A->length)
    {     
        if (A->data[i] == x)  //当前元素值为x时k增1
	        k++;
        else		          //当前元素不为x时将其前移k个位置
	        A->data[i-k] = A->data[i];
        i++;
    }
    A->length -= k;	//顺序表A的长度递减k
}

2、例2

void move2(SqList *&L)
{ 
    int i = 0,j = L->length-1;
    ElemType pivot = L->data[0];	  //以data[0]为基准
    while (i < j)
    {     
        while (j > i && L->data[j] > pivot)
            j--;       		//从右向左扫描,找≤pivot的data[j]
        L->data[i] = L->data[j];	 //将其放入data[i]处
        while (i<j && L->data[i] <= pivot)
            i++;      		//从左向右扫描,找>pivot的记录data[i]
        L->data[j] = L->data[i];	//将其放入data[j]处
    }
    L->data[i] = pivot;    		//放置基准
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值