国内十大网站制作公司,wordpress目录安装主题,教育网站制作哪专业,江苏建设网站文章目录 一.静态顺序表#xff1a;长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下#xff1a;2.下面是写一段Print#xff0c;打印数字看看#xff1a;3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用#xff1a;利用顺序表写一… 文章目录 一.静态顺序表长度固定二.动态顺序表1.下面证明原地扩容和异地扩容代码如下2.下面是写一段Print打印数字看看3.头插4.尾删5.头删6.越界一定会报错吗7.下标插入8.下标删除9.查找数字10.应用利用顺序表写一个菜单 顺序表就是数组特殊要求顺序表只能从头开始连续存储分为静态存储和动态存储
一.静态顺序表长度固定 里面是静态数组size表示存的多少个数据。 弊端不知道需要多少N给小了不够用N给大了浪费。
二.动态顺序表 尾插法size
扩容时用到realloc
区分realloc原地扩容和异地扩容 原地扩容返回的是和原来一样的地址 异地扩容返回的是和原来不同的地址并且把原来的空间free掉
http://t.csdnimg.cn/CKsJs 先用malloc开辟空间。 注意在使用malloc函数之前我们一定要计算字节数malloc开辟的是用户所需求的字节数大小的空间。
写个程序通过地址变化判断是原地扩还是异地扩时
1.下面证明原地扩容和异地扩容代码如下
❗SeqList.h如下
#pragma once
#includestdio.h
#includestdlib.h
#includeassert.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如下
#includeSeqList1.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为真则newCapacity4如果为假则newCapacityps1-capacity*2SLDataType* 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.应用利用顺序表写一个菜单