2.数据结构 顺序表(自留笔记)

顺序表就是数组,特殊要求:顺序表只能从头开始连续存储,分为静态存储和动态存储

一.静态顺序表:长度固定

在这里插入图片描述
里面是静态数组,size表示存的多少个数据。
弊端:不知道需要多少,N给小了不够用,N给大了浪费。

二.动态顺序表

在这里插入图片描述
尾插法,size++

扩容时用到realloc
在这里插入图片描述

区分realloc原地扩容和异地扩容
原地扩容返回的是和原来一样的地址
异地扩容返回的是和原来不同的地址,并且把原来的空间free掉

http://t.csdnimg.cn/CKsJs

在这里插入图片描述

先用malloc开辟空间。
注意:在使用malloc函数之前我们一定要计算字节数,malloc开辟的是用户所需求的字节数大小的空间。

写个程序通过地址变化判断是原地扩还是异地扩时
在这里插入图片描述

1.下面证明原地扩容和异地扩容代码如下:

❗SeqList.h如下:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)
typedef int SLDataType;


//定义顺序表
typedef struct SeqList
{
   
	//定义指针
	SLDataType* a;
	//记录有效数据个数
	int size;
	//记录空间大小
	int capacity;

}SL;

//初始化函数
void SLInit(SL* ps1);
void SLDestroy(SL* ps1);
void SLCheckCapacity(SL* ps1);//写一个公共逻辑
//尾插
void SLPushBack(SL* ps1, SLDataType x);

❗SeqList.c如下:

#include"SeqList1.h"
void SLInit(SL* ps1)
{
   
	assert(ps1);
	ps1->a = NULL;
	ps1->size = 0;
	ps1->capacity = 0;
}

void SLDestroy(SL* ps1)
{
   
	assert(ps1);
	if (ps1->a!=NULL)
	{
   
		free(ps1->a);
		ps1->a = NULL;
		ps1->size = 0;
		ps1->capacity = 0;
	}
}


void SLCheckCapacity(SL* ps1)//写一个公共逻辑
{
   
	assert(ps1);
	if (ps1->size == ps1->capacity)
	{
   
		int newCapacity = ps1->capacity == 0 ? 4 : ps1->capacity * 2;//如果ps1->capacity == 0为真则newCapacity=4,如果为假,则newCapacity=ps1->capacity*2
		SLDataType* tmp = (SLDataType*)realloc(ps1->a, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
   
			perror("realloc fail");
			return;
		}
		ps1->a = tmp;
		ps1->capacity = newCapacity;
	}
}
void SLPushBack(SL* ps1, SLDataType x)
{
   
	SLCheckCapacity(ps1);//调用

	ps1->a[ps1->size] = x;
	ps1->size++;

}

原地扩容(Test.c):
在这里插入图片描述
异地扩容(Test.c):
在这里插入图片描述

2.下面是写一段Print,打印数字看看:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.头插

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

在这里插入图片描述
打印数字查看尾插头插区别
在这里插入图片描述
头插效率高吗?
头插的时间复杂度是O(n),如果头插n个数据的话,那么时间复杂度是O(n^2),如果是尾插n个数据,则尾插的时间复杂度是O(n),尾插效率更高。

4.尾删

在这里插入图片描述
不用释放后面的空间
可以看到第三行比第二行尾巴后面少了9
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

因为尾删容易导致删空了的数据表还继续尾删的情况,所以要进行检查。
方法一空了直接return
方法二暴力检查,空了直接报错
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.头删

在这里插入图片描述

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

6.越界一定会报错吗

不一定,在C语言越界读取中不会,而越界写可能会报错,如:
在这里插入图片描述

7.下标插入

这里的pos是下标
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
注意:
在这里插入图片描述

最后一行那里显示了报错的原因出处,我们找到出处,发现是assert的警告
在这里插入图片描述

8.下标删除

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

在这里插入图片描述

9.查找数字

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

10.应用:利用顺序表写一个菜单

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

相关推荐

  1. 椋鸟数据结构笔记#1:数据结构顺序

    2024-01-26 15:54:01       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-26 15:54:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-26 15:54:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-26 15:54:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-26 15:54:01       20 阅读

热门阅读

  1. sql server 查询所有表的记录条数

    2024-01-26 15:54:01       36 阅读
  2. postgresql 表锁定问题处理

    2024-01-26 15:54:01       30 阅读
  3. 单元测试之道

    2024-01-26 15:54:01       27 阅读
  4. [NOIP2000 提高组] 单词接龙 C++

    2024-01-26 15:54:01       36 阅读
  5. 第九章:分布式训练

    2024-01-26 15:54:01       33 阅读
  6. [go] 备忘录模式

    2024-01-26 15:54:01       25 阅读
  7. SQL 系列教程(六)

    2024-01-26 15:54:01       24 阅读
  8. 0.0 pyside6--最美不过初相见

    2024-01-26 15:54:01       32 阅读
  9. 设计模式-策略模式

    2024-01-26 15:54:01       38 阅读
  10. 【ES6】Promise 使用

    2024-01-26 15:54:01       22 阅读