【数据结构入门】-线性表之顺序表(1)

news/2024/12/30 4:15:14/

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【数据结构】
在这里插入图片描述

从今天开始,就正式进入数据结构的大门了,把握机会,好好学习,加油。

本文目录

  • 1.线性表
  • 2.顺序表的实现
    • 概念及结构
    • 完整代码
      • SeqList.h
      • SeqList.c
      • test.c
  • 3.总结

1.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
线性表在逻辑上是线性结构,也就是说连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

线性表最经典的两种形式:一种就是数组,另一种就是链表。
在这里插入图片描述
在这里插入图片描述

2.顺序表的实现

顺表作为最简单的数据结构,作用就是把数据存储起来。比如所我们玩的QQ中的联系人、或者通讯录等等。

概念及结构

顺序表是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改

顺序表一般可以分为:

1.静态顺序表:使用定长数组存储。(即长度是固定的)
2.动态顺序表:使用动态开辟的数组存储。

完整代码

SeqList.h

#pragma once#include<stdio.h>
#include<stdlib.h>
#include<assert.h>#define N 1000
typedef int SLDataType;静态顺序表(特点就是如果满了就不让插入)  缺点:给多少合适呢?这个很难确定
给小了不够用,给多了就浪费了
//typedef struct SeqList
//{
//	SLDataType a[N];
//	int size;        //表示数组中存储了多少个数据
//}SL;
//
接口函数---命名风格跟着STL走的,方便后期学习STL
//void SeqListInit(SL* ps);//初始化
//void SeqListPushBack(SL* ps, SLDataType x);//尾插
//void SeqListPopBack(SL* ps);//尾删
//void SeqListPushFront(SL* ps, SLDataType x);//头插
//void SeqListPopFront(SL* ps);//头删//动态顺序表(特点就是如果满了就不让插入)  缺点:给多少合适呢?这个很难确定
//给小了不够用,给多了就浪费了
typedef struct SeqList
{SLDataType* a;int size;        //表示数组中存储了多少个数据int capacity;    //数组实际能存数据的空间容量是多大
}SL;//接口函数---命名风格跟着STL走的,方便后期学习STL
void SeqListPrint(SL* ps);//打印void SeqListInit(SL* ps);//初始化
void SeqListDestory(SL* ps);//销毁void SeqListCheckCapacity(SL* ps);void SeqListPushBack(SL* ps, SLDataType x);//尾插
void SeqListPopBack(SL* ps);//尾删
void SeqListPushFront(SL* ps, SLDataType x);//头插
void SeqListPopFront(SL* ps);//头删

SeqList.c

#pragma once#include"SeqList.h"void SeqListPrint(SL* ps)
{for (int i = 0; i < ps->size; i++){printf("%d ", ps->a[i]);}
}void SeqListInit(SL* ps)
{ps->a = NULL;ps->size = ps->capacity = 0;
}void SeqListDestory(SL* ps)//销毁
{free(ps->a);ps->a = NULL;ps->capacity = ps->size = 0;
}void SeqListCheckCapacity(SL* ps)
{//如果没有空间或者空间不足,就扩容if (ps->size == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));if (tmp == NULL){printf("realloc fail\n");exit(-1);//异常时直接终止程序,而return是直接把这个函数返回}//来到这说明空间开辟成功ps->a = tmp;ps->capacity = newcapacity;}
}void SeqListPushBack(SL* ps, SLDataType x)//头插
{SeqListCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}void SeqListPopBack(SL* ps)//尾删
{//温柔处理方式//if (ps->size > 0)//{//	//ps->a[ps->size - 1] = 0;//	ps->size--;//}//爆裂处理方式assert(ps->size > 0);//条件为真没事,为假的话直接终止程序ps->size--;
}void SeqListPushFront(SL* ps, SLDataType x)//头插
{SeqListCheckCapacity(ps);//挪动数据int end = ps->size - 1;while (end >= 0){ps->a[end + 1] = ps->a[end];end--;}ps->a[0] = x;//注意是头插ps->size++;
}void SeqListPopFront(SL* ps)//头删
{assert(ps->size > 0);//挪动数据int begin = 1;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"void TestSeqList1()
{SL sl;SeqListInit(&sl);SeqListPushBack(&sl, 1);SeqListPushBack(&sl, 2);SeqListPushBack(&sl, 3);SeqListPushBack(&sl, 4);SeqListPushBack(&sl, 5);//打印SeqListPrint(&sl);SeqListPopBack(&sl);SeqListPopBack(&sl);SeqListPopBack(&sl);SeqListPopBack(&sl);//SeqListPopBack(&sl);//SeqListPopBack(&sl);SeqListPopBack(&sl);SeqListPrint(&sl);SeqListPushBack(&sl, 10);SeqListPushBack(&sl, 20);SeqListPrint(&sl);SeqListDestory(&sl);//销毁
}void TestSeqList2()
{SL sl;SeqListInit(&sl);SeqListPushBack(&sl, 1);SeqListPushBack(&sl, 2);SeqListPushBack(&sl, 3);SeqListPushBack(&sl, 4);SeqListPushBack(&sl, 5);SeqListPrint(&sl);printf("\n");SeqListPushFront(&sl, 10);SeqListPushFront(&sl, 20);SeqListPushFront(&sl, 30);SeqListPushFront(&sl, 40);SeqListPrint(&sl);printf("\n");SeqListPopFront(&sl);SeqListPopFront(&sl);SeqListPrint(&sl);SeqListDestory(&sl);
}int main()
{//TestSeqList1();TestSeqList2();return 0;
}

在这里插入图片描述

3.总结

说一下学这的建议吧,这块的内容还是比C语言那块稍微上一个档次的,首先要有比较好的C语言基础,才能在学习数据结构的过程中如鱼得水。多敲代码也是一个很重要的一点。勤思考,多理一下这里面的思路以及常见的一些思考方式。再次强调一下,学习的时候一定要思考,而不是在哪里刷时长感动自己。切记,思考思考再思考!!!
好了,就到这把。
再见啦!!!
在这里插入图片描述


http://www.ppmy.cn/news/18531.html

相关文章

【微服务】Eureka注册中心

本系列介绍的是Spring Cloud中涉及的知识点&#xff0c;如有错误欢迎指出~ 一.引子 假如我们的服务提供者user-service部署了多个实例&#xff0c;如图&#xff1a; 大家思考几个问题&#xff1a; 问题一&#xff1a;order-service在发起远程调用的时候&#xff0c;该如何得知…

【leetcode合集】如何知道自己是否掌握了数组与链表?试试这几道题目吧!

目录 1.数组题目合集 1.1 leetcode.27 移除元素 1.2 leetcode.26 删除有序数组中的重复项 1.3 leetcode.88 合并两个有数数组 2.链表题目合集 2.1 leetcode.203 移除链表元素 2.2 leetcode.206 反转链表 2.3 leetcode.876 链表的中间结点 2.4 牛客 链表中倒数第k个结点…

1、认识IntelliJ IDEA

文章目录1、认识IntelliJ IDEA1.1 JetBrains公司介绍1.2 IntelliJ IDEA介绍1.3 IDEA的主要优势&#xff08;对比Eclipse&#xff09;1.3.1 功能强大1.3.2 符合人体工程学1.4 IDEA的下载【尚硅谷】idea实战教程-讲师&#xff1a;宋红康 生活是属于每个人自己的感受&#xff0c;不…

大数据技术之Hadoop(MapReduce)

第1章 MapReduce概述 1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个H…

2023新春祝福html代码,包你学会

前言大家新年好&#xff01;今天是年三十&#xff0c;在这个充满喜悦和欢乐的节日里&#xff0c;祝大家新年快乐。不论你在外面过的风生水起还是不尽人意&#xff0c;回到家一家人团团聚聚才是最好的。进入正题&#xff0c;我们作为IT民工&#xff0c;我们要用自己的方式表达对…

客快物流大数据项目(一百零五):启动ElasticSearch

文章目录 启动ElasticSearch 一、启动ES服务端 二、​​​​​​​启动Kibana 启动ElasticSearch

LeetCode刷题笔记 - JavaScript(三)

文章目录1.剑指 Offer 59 - I. 滑动窗口的最大值1.剑指 Offer 43. 1&#xff5e;n 整数中 1 出现的次数剑指 Offer 59 - I. 滑动窗口的最大值 剑指 Offer 43. 1&#xff5e;n 整数中 1 出现的次数 1.剑指 Offer 59 - I. 滑动窗口的最大值 给定一个数组 nums 和滑动窗口的大小 k…

回收租赁商城系统功能拆解12讲-会员权益

回收租赁系统适用于物品回收、物品租赁、二手买卖交易等三大场景。 可以快速帮助企业搭建类似闲鱼回收/爱回收/爱租机/人人租等回收租赁商城。 回收租赁系统支持智能评估回收价格&#xff0c;后台调整最终回收价&#xff0c;用户同意回收后系统即刻放款&#xff0c;用户微信零…