线性表【期末速成】

文章详细介绍了线性表的顺序存储结构,包括类型定义、基本操作如插入、删除、按值查找和按位查找。顺序表的特点在于随机存取和高存储密度,但在插入和删除时可能需要移动大量元素。此外,文章还展示了如何合并两个有序顺序表。
摘要由CSDN通过智能技术生成

线性表的类型定义

请添加图片描述
在这里插入图片描述
请添加图片描述

线性表的基本操作:

请添加图片描述

顺序表的结构

请添加图片描述

在这里插入图片描述
解析:
这里LOC(A)指的是100
sizeof(ElemType) 指的是2
i 是 5
100+2*4=108
线性表的顺序存储类型描述为:

#define MaxSize 50
typedef struct {
    ElemType data[MaxSize];
    int length;
}SqList;
顺序表的特点:
  • 顺序表最主要的特点是随机存取,即通过首地址和元素序号可在时间O(1)内找到指定的元素。
  • 顺序表的存储密度高,每个结点只存储数据元素。
  • 顺序表逻辑上相邻的元素物理上也相邻,所以插入和删除操作需要移动大量元素。

题 3.当需要随机查找线性表的元素时,宜采用 () 作存储结构。
A.链表
B.循环链表
C.顺序表
D.单链表
答案:C

顺序表的实现

(1)插入

bool ListInsert(SqList &L,int i,ElemType e)
{
    if(i<1 || i > L.length+1)
        return false;
    for(int j=L.length;j>=i;j--) //j对应的是数组的下标,i对应数组的元素
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
    return false;
}

在这里插入图片描述
在这里插入图片描述

删除操作
bool ListDelete(SqList &L,int i,Elemtype &e){			
    if(i<1||i>L.length)
        return false
    e =L.data[i-1]
    for(int j=i;j<L.length;j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;
     
}

在这里插入图片描述
在这里插入图片描述
将第 i 个元素往后的所有元素(n-i)往前移动

在这里插入图片描述
在这里插入图片描述
解析:
如果是指定值为x的元素的话那就没有顺序表与链表的差别了,都是从第一个元素开始顺序查找.假设长度为n的线性表中只有一个值为x的元素,则从第一个元素起到找到值为a(假设为第i个元素)比较 i 次,删除 i 后,第 i+1 个元素到第 n 个元素都要移动,移动n-(i+1)+1即 n-i 次故比较元素和移动元素的总次数为 n 次.注:以上答案是针对线性表中只有一个值为x的元素若有多个值为a的元素则总次数是不确定的

按值查找操作

在顺序表L中查找第一个元素值等于e的元素,并返回其位序

int LocateElem(SqList L,ElemType e){
  int i;
  for(i=0;i<L.length;i++)
  	if(L.data[i]==e)
    	return i+1
  return 0;
}
按位查找操作
int GetElem(SqList L,int i){
    if(i<1||i>L.length)
        return 0;
    return L.data[i-1];
}

题 4.将两人有序顺序表A,B合并为一个新的有序顺序表C,并用函数返回结果顺序表。
算法思想:首先,按顺序不断取下两个顺序表表头较小的结点存入新的顺序表中。然后看哪个表还有剩余,将剩下的部分添加到新的顺序表后面

bool Merge(SqList A,SqList B,SqList &C){
    if(A.length+B.length>C.MaxSize)
        return false;int 	
    i=0,j=0,k=0;
    while(i<A.length&&j<B.length){
            if(A.data[i]<=B.data[j])
                C.data[k++]=A.data[i++];
			else
				C.data[k++]=B.data[j++];
    }    
	while(i<A.length)
        C.data[k++]=A.data[i++];
    while(j<B.length)
        C.data[k++]=B.data[j++];
    C.length=k;
    return true;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值