数据结构与算法基础-Go语言版-1.线性表

目录

前言

一、线性表是什么?

1.定义

2.存储结构

二、线性表的实现

1.顺序表

1.1.1 顺序表的结构定义

1.1.2 顺序表的初始化

1.1.3 判断空表

1.1.4 顺序表的插入

1.1.5 顺序表的删除

1.1.6 顺序表的修改

1.1.7 顺序表的查找

2.链表

2.1.1 链表的结构定义

2.1.2 链表的初始化

2.1.3 判断空表

2.1.4 链表的插入

2.1.5 链表的删除

2.1.6 链表的修改

2.1.7 链表的查找

三、练习:完成双向循环链表的插入与删除

3.1 双向循环链表的结构定义

3.2 双向循环链表的插入

3.3 双向循环链表的删除

总结



前言

最近在学习Go语言,同时在学习计算机基础四大件中的数据结构与算法,但在网上查找资源时,发现大部分数据结构与算法视频、博客等都很少使用Go语言来编写,正好小编在学习,于是决定写一个GO语言版的数据结构与算法系列博客,小编是初学者,很多地方学的可能不是很好,希望各位大佬能够多多指正。


提示:以下是本篇文章正文内容,下面案例可供参考






一、线性表是什么?

1.定义

       线性表,就是有限的数据按照一定的顺序存储的一个序列,其中,除了表头和表尾,表中任一元素都只有一个直接前驱和一个直接后继。

2.存储结构

        线性表分为顺序存储结构和链式存储结构,其中

        顺序存储结构:便于查找,但插入和删除比较麻烦

        链式存储结构:插入删除较为容易,但查找比较复杂




二、线性表的实现



1.顺序表

1.1.1 顺序表的结构定义

const MaxSize = 100
type sqList struct{
    data [MaxSize]int // 用去存储顺序表数据
    length int
}

1.1.2 顺序表的初始化

func initSqlist()*sqList{
    var data [MaxSize]int
    return &sqList{
        data:data,
        length:0,
    }
}

1.1.3 判断空表

func (s *sqList)isValid()bool{
    if s.length == 0{
        return true
    }
    return false
}

1.1.4 顺序表的插入

  • 思路:考虑到顺序表的存储结构在内存中是一块连续的内存,因此我们只要找到需要插入元素的位置,然后将该位置及其后面的元素依次往后移一位即可
  • 当然,我们在往顺序表插入元素时,首先要判断插入位置是否合法化,线性表中的元素是按一定顺序排列的序列,不能说想插在哪个位置就插在哪个位置。其次,如果顺序表满了,我们就不能继续插入了(可以选择扩容,但这里不展示)
  • 顺序表插入的思路如图所示

  • 代码实现如下:
// 将元素插入在第index个位置,时间复杂度为O(n)
func (s *sqList)insert(data int,index int)error{
    if index < 0 || index > s.length { // 判断索引值是否合法
        return errors.New("please input the right index\n")
        return
    }
    if s.length == MaxSize{ // 判断是否队满
        return errors.New("the list is full,can not insert\n")
        return
    }

    for i:= s.length-1;i>=index;i--{ // 将插入位置及以后的元素依次后移
        s.data[i+1] = s.data[i]
    }
    s.data[index] = data // 在插入位置插入元素
    s.length++
    return nil
}

1.1.5 顺序表的删除

  • 思路:与顺序表插入的操作相反,在进行删除操作时,我们首先得找到删除元素的位置,然后将其之后的元素依次向前移动一个位置,这样要删除的元素就会被覆盖掉,达到了删除该元素的目的。
  • 同样,删除时也要判断索引值是否合法,另外,如果顺序表为空,则没有元素可以删除。
  • 顺序表删除思路如图所示:

   

  • 代码实现如下:

                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值