顺序表的具体使用方法.数据解构(二)

前言

提示:文本为数据解构(一)后续补充文:

本文具体讲解顺序表的具体使用方法


提示:以下是本篇文

系列文章目录

第一章 数据解构(一)


文章目录

前言

系列文章目录

一、静态的使用方式

二、动态的使用方式

1.定义一个结构体

2.初始化

3.扩容

4.尾加

5.尾减

6.头加

7.头减

8.查找

9.删除pos位置的值

10.pos位置插入x

11.销毁

总结


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

回顾上文说到

 顺序表可以分为两种:

动态

使用动态来开辟的数组存储

静态

使用固定长度数组存储元素

一、静态的使用方式

代码如下(示例):

#define N 10//定义一个常量的宏
typedef int SLDataType;//从新定义int 的名称
typedef struct SeqList
{
	SLDataType a[N];//开辟一个固定大小的数组
	int size;		//有效数据个数
	int capacity;	//空间大小
}SL;

顺序表的具体使用方法.数据解构(二)_第1张图片 

 

二、动态的使用方式

制作一个可以增,删,改,查,可扩容的数组

1.定义一个结构体

代码如下(示例):

typedef int SLDataType;//从新定义int 的名称

typedef struct SeqList
{
	SLDataType* a;//开辟动态大小
	int size;		//有效数据个数
	int capacity;	//空间大小
}SL;

 SLDataType* a;//开辟动态大小
  int size;        //有效数据个数

  int capacity;    //空间大小

2.初始化

代码如下(示例):

void SListInit(SL* ps1)
{
	ps1->a = NULL;//把大小为空
	ps1->size = ps1->capacity = 0;//可用为0

}

3.扩容

增容的目的是为了在输入数据时有可用空间

 代码如下(示例):

void SLCheckcapicity(SL* ps1)
{
	if (ps1->capacity == ps1->size)
	{
        //当空间大小为0时给开辟4个空间
        //如果有空间就把以前的空间乘2
		int newcapicity = ps1->capacity == 0 ? 4 : ps1->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps1->a, newcapicity * sizeof(int*));
		if (tmp ==NULL)
		{
			printf("扩容失败");
			exit(-1);
		}
		ps1->a = tmp;//扩容好后的空间给a
		ps1->capacity = newcapicity;//把范围大小给capacity
	}
}

顺序表的具体使用方法.数据解构(二)_第2张图片

4.尾加

 代码如下(示例):

void SLPushback(SL* ps1, SLDataType x)
{
	SLCheckcapicity(ps1);//先判度空间是否充足
	ps1->a[ps1->size] = x;
	ps1->size++;
}

5.尾减

 代码如下(示例):

void SLPopback(SL* ps1)
{
	if (ps1->size > 0)
	{
		ps1->a[ps1->size-1] = 0;
		ps1->size--;
	}
	
}

6.头加

 代码如下(示例):

void SLPushFront(SL* ps1, SLDataType x)
{
	SLCheckcapicity(ps1);
	int end = ps1->size - 1;
	while (end >= 0)
	{
		ps1->a[end + 1] = ps1->a[end];
		end--;
	} 
	ps1->a[0] = x;
	ps1->size++;
}

顺序表的具体使用方法.数据解构(二)_第3张图片

7.头减

 代码如下(示例):

void SLPopFront(SL* ps1) 
{
	int begin = 1;
	while (begin< ps1->size)
	{
		ps1->a[begin-1] = ps1->a[begin];
		begin++;
	}
	ps1->size--;
}

8.查找

 代码如下(示例):

void SLFind(SL* ps1, SLDataType x)
{
	for (int i = 0; i < ps1->size; i++)
	{
		if (ps1->a[i] == x) 
		{
			return i;
		}
	}
	return -1;
}

9.删除pos位置的值

 代码如下(示例):

void SLErase(SL* ps1, int pos)
{
	if (pos <= ps1->size && pos >= 0)
	{
		int begin = pos;
		while (begin size)
		{
			ps1->a[begin-1] = ps1->a[begin];
			begin++;
		}
		ps1->size--;
	}
} 

10.pos位置插入x

 代码如下(示例):

void SLInsert(SL* ps1, int pos, SLDataType x)
{
	//这里的主要操作为选择的数不为下标而是数
    int y = pos == 0 ? pos : pos - 1;
    //因为顺表是连续的所以说不可以跳
	if (pos < ps1->size && pos >= 0)
	{
		SLCheckcapicity(ps1);//判断是否需扩
		int end = ps1->size;
		while (end >= y)
		{
			ps1->a[end + 1] = ps1->a[end];
			end--;
		}
		ps1->a[y] = x;
		ps1->size++;
	}
}

11.销毁

 代码如下(示例):

void SLDestory(SL* ps1)
{
	int Destory = ps1->a[0];
	while (ps1->size>=Destory)
	{
		ps1->size--;
	}
}

总结

提示:这里对文章进行总结:

链表的问题是必须在内存中是连续存储,实践发现多次的使用,pos位置插入x可能会导致整个数组的顺序会有变化。

你可能感兴趣的:(c语言,数据结构)