数据结构与算法 个人学习总结 第2章 线性表

本文详细介绍了线性表的两种表示方式:顺序表和链表。对于顺序表,讨论了相关概念和包括构造、插入、删除、查找和归并等操作的算法。链表部分涵盖了单链表、循环链表和双向链表,以及它们的相关操作,如插入、删除、判断环和反转等。同时,文章对比了顺序表和链表的优缺点。
摘要由CSDN通过智能技术生成

1. 线性表的顺序表示和实现——顺序表

1.1 相关概念

①线性表:

  • 存在唯一一个“第一个”元素
  • 存在唯一一个“最后一个”元素
  • 除第一个元素外,每一个元素都有且只有一个前驱
  • 除最后一个元素外,每个元素都有且只有一个后继

②顺序表:顺序存储随机存取,通常用数组描述,逻辑上相邻在物理上一定相邻

③线性表的动态分配顺序存储结构(类C语言):

#define LIST_INIT_SIZE 100   //线性表存储空间的初始分配量
#define LISTINCREMENT 10     //线性表存储空间的分配增量
typedef struct{
ElemType *elem;              //存储空间基址
int length;                  //当前长度
int listsize;                //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

1.2 相关算法(均采用类C语言分析)

1.2.1 构造一个空的线性表L(构造空表)

Status InitList_Sq(SqList &L)
{
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVWEFLOW);    //存储分配失败
L.length = 0;                  //空表长度为0
L.listsize = LIST_INIT_SIZE;   //初始存储容量
return OK;
}//InitList_Sq   时间复杂度为O(1)

1.2.2 在顺序表L中第i个位置之前插入新的元素e(插入元素:增)

Status ListInsert.Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1) return ERROR;                      //i的值不合法
if(L.length>=L.listsize){                                //当前存储空间已满,增加分配
newbase = (ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase) exit(OVERFLOW);                             //存储分配失败
L.elem = newbase;                                        //新基址
L.listsize += LISTINCREMENT;                             //增加存储容量
}
q = &(L.elem[i-1]);                                      //q为插入位置
for(p = &(L.elem[L.length-1]);p>=q;--p)   *(p+1) = *p;   //插入位置及之后的元素右移
*q = e;           //插入e
++L.length;       //表长增1
return OK;
}//ListInsert_Sq  时间复杂度为O(n)

1.2.3 在顺序表L中删除第i个元素,并用e返回其值(删除元素:删)

Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{
if(i<1||i>L.length+1) return ERROR;       //i的值不合法
p = &(L.elem[i-1]);                       //p为被删除元素的位置
e = *p;                                   //被删除元素的值赋给e
q = L.elem+L.length-1;                    //表尾元素的位置
for(++p;p<=q;++p)    *(p-1)=*p;           //被删除元素之后的元素左移
--L.len
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值