首页 > 其他分享 >C语言顺序表 逐行解析!!!

C语言顺序表 逐行解析!!!

时间:2024-10-02 14:49:23浏览次数:10  
标签:ps arr capacity int C语言 SL 解析 逐行 size

1、顺序表的概念及结构

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。 案例:蔬菜分为绿叶类、⽠类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合

2、顺序表分类

• 顺序表和数组的区别 ◦ 顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝

• 顺序表分类

◦ 静态顺序表

概念:使⽤定⻓数组存储元素

struct SeqList
{
int a[5];//定长数组
int size;//有效数据个数

};

静态顺序表缺陷:空间给少了不够⽤,给多了造成空间浪费

动态顺序表

#define int SLDataType
typedef struct SeqList
{
  SLDataType*a;
  int size;
  int capacity;
//按需申请空间
}SL;

3、动态顺序表的实现

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef int SLDataType   //int也可以调整为其他类型
typedef struct SeqList
{
	SLDataType* arr;
	int size;        //有效数据个数
	int capacity;     //空间容量
}SL;//将struct SeqList改名为SL

//顺序表初始化及销毁
void SLInit(SL* ps);
void SLDestroy(SL* ps);


int main()
{

	printf("%d", sizeof(SL));
	return 0;
}//输出16,在x64环境下,指针大小是8个字节

struct SeqList解析

解释:动态顺序表的空间容量是相对于有效数据个数的,并不是指结构体本身所占的字节个数,你可以把size理解为单位1,而capacity就是单位1的空间容量

void SLInit(SL* ps)
{
	assert(ps);
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}//对顺序表的初始化

void SLDestroy(SL* ps)
{
	if (ps->arr)
	{
		free(ps->arr);

	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}//顺序表的销毁

void SLCheckcapacity(SL* ps)
{
	if (ps->size == ps->capacity)
	{

		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* tmp = (int*)realloc(ps->arr, newcapacity * sizeof(int));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(1);
		}

		ps->arr = tmp;
		ps->capacity = newcapacity;
	}

}

SLCheckcapacity解析

if (ps->size == ps->capacity); 如果单位1和设定好的容量相等,则空间不够,就要扩容(后续每次插入都只是插入1个单位1)

int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;

三目操作符,判断ps指向的capacity是否为0,为0则赋值为4,否则ps指向的capacity*2

SLDataType* tmp = (int*)realloc(ps->arr, newcapacity * sizeof(int));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(1);
		}
    ps->arr = tmp;
		ps->capacity = newcapacity;

realloc的使用,为ps指向的arr申请空间,大小为newcapacity * sizeof(int)

解释:capacity为单位1的总容量,当size=4,capacity=4时,ps->capacity * 2,capacity就变为了8,所以当判断if (ps->size == ps->capacity)成立时,原来空间大小是16字节(capacity*4)新的空间就是newcapacity * sizeof(int)=32

因为使用realloc,当是情况2时,原有空间之后没有足够空间就要返回新的内存地址 tmp接收

ps->capacity = newcapacity;把newcapacity的值赋给capacity

尾插

void SLPushBack(SL* ps, SLDataType x)
{
  SLCheckcapacity(ps);
  assert(ps);
  ps->arr[ps->size++] = x;
//当size=3,前面3个单位1分别是1,2,3时想要在尾部插入一个4
//                       下标是ps->arr[0],arr[1],arr[2]
//把ps指向的arr下标为size的值赋为4后,size+1.(ps->arr[3]=x)
}

头插

void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckcapacity(ps);
	for (int i = ps->arr; i > 0; i++)
	{
		ps->arr[i] = ps->arr[i - 1];

	}
	ps->arr[0] = x;
	ps->size++;
}

删除指定位置的数据

void SLEraze(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	for (int i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i+1];

	}
	
	ps->size--;
}

 顺序表中还有很多方法就不一一列举了,希望本文可以帮助你更好的理解顺序表中的知识。

标签:ps,arr,capacity,int,C语言,SL,解析,逐行,size
From: https://blog.csdn.net/2301_81799065/article/details/142681246

相关文章

  • 实验一 C语言开发环境使用和数据类型,运算符,表达式
    #include<stdio.h>intmain(){printf("0\n");printf("<H>\n");printf("II\n");printf("0\n");printf("<H>\n");printf("II\n");return0;......
  • 操作系统错题解析【软考】
    目录前言1.特殊的操作系统1.1可移植性1.2嵌入式操作系统2.进程的状态2.1调度方式2.2进程通信运行实例3.信号量的取值范围3.1PV操作中信号量分析4.信号量于PV操作4.1PV操作4.2初值5.死锁资源数计算6.进程资源图7.页式存储8.段页式存储9.磁盘管理9.1计算读取时间9.2......
  • C语言 共用体
    概念在C语言中,共用体(Union)是一种特殊的数据类型。它可以在不同的时刻存储不同类型的数据,但所有成员共享同一块内存空间。这与结构体不同,结构体的每个成员都有自己独立的内存空间。定义和声明定义共用体的定义形式与结构体相似,使用关键字union。例如:unionData{int......
  • C语言内存对齐
    概念在C语言中,内存对齐(MemoryAlignment)是一种编译器为了提高内存访问效率而采用的一种数据存储策略。它要求数据在内存中的存储地址是某个特定值(通常是数据类型大小或其倍数)的整数倍。为什么要进行内存对齐提高内存访问速度现代计算机的内存系统是以字节为单位进行组织......
  • 理解C语言之深入理解指针(四)
    目录1.回调函数是什么?2.qsort使⽤举例2.1使⽤qsort函数排序整型数据2.2使⽤qsort排序结构数据3.qsort函数的模拟实现1.回调函数是什么?        回调函数就是⼀个通过函数指针调⽤的函数。        如果你把函数的指针(地址)作为参数传递给另⼀个......
  • C语言开发windows程序主要程序结构
    一、两个函数1.WinMain,WindowsAPI主函数。本次示例中WinMain包含的三个内容: +.注册窗口 +.创建窗口 +.消息循环2.窗口过程(WndProc) 窗口过程,通过窗口过程(WndProc)与用户交互和管理窗口。二、Windows程序示例基于C语言开发的windows图形界面程序/*** title:Windows程......
  • 个人感悟##C语言中的得与失
    个人练习感悟1.三个任意整数从小到大排序#include<stdio.h>#include<stdlib.h>intmain(){inta,b,c;printf(“我可以为您进行从大到小排序,请任意输入三个的整数:”);scanf(“%d%d%d”,&a,&b,&c);if(a>b&&a>c)if(b>c)printf(“%d,%d,%d”,a,b,c);elseif(b<c)......
  • C语言 typedef
    概念在C语言中,typedef是一个关键字,用于为已有的数据类型定义一个新的别名。它本身并不创建新的数据类型,而是给现有的类型赋予一个更方便、更易理解或更符合项目特定需求的名字。基本用法基本数据类型别名例如,为unsignedint定义一个新的别名uint:typedefunsignedint......
  • C语言 结构体
    结构体的概念在C语言中,结构体(struct)是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个逻辑上相关的整体。它类似于一个容器,可以容纳多种不同类型的数据项。结构体的定义结构体的定义语法如下:struct结构体名{成员类型1成员名1;成员类型2成......
  • C语言 形参和实参
    在C语言中,强制类型转换(强转)可能会导致精度发生变化,具体情况取决于转换的类型。数值类型转换浮点数转换为整数当把浮点数强制转换为整数时,小数部分会被直接截断,精度必然会发生变化。例如:floatnum=3.14;intresult=(int)num;//此时result的值为3,小数部分0.14被截断......