【数据结构】实现顺序表

目录

一、 顺序表的概念及结构

二、实现顺序表

1.初始化

2.打印

 3.扩容

4.尾插

5.头插

6.尾删

7.头删

8.删除在pos位置的数

8.1改进后的头删

8.2改进后的尾删

9.在pos处插入一个数

9.1改进后的头插 

9.2 改进后的尾插

10.修改数据

11.查找数据

12销毁数组



一、 顺序表的概念及结构

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

        顺序表一般分为:

        1.静态顺序表:使用定长数组存储元素。

#include<stdio.h>
#define N 10
typedef int SLDataType;

typedef struct SeqList
{
	SLDataType data[N];
	int size;//数组中有几个元素
	int capacity;//数组容量
}SeqList;

        2.动态顺序表:使用动态开辟的数组储存

typedef struct SeqList
{
	SLDataType * data;//指向动态开辟的数组
	int size;//数组中元素个位数;
	int capacity;//容量
} SeqList;

二、实现顺序表

下面采用动态开辟的方式实现顺序表

1.初始化

//初始化
void SLIniti(SeqList* pc)
{
	assert(pc);
	pc->data = NULL;
	pc->capacity = 0;
	pc->size = 0;
}

2.打印

//打印
void SLPrint(SeqList* pc)
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		printf("%d ", pc->data[i]);
	}
	printf("\n");
}

 3.扩容

//扩容
void CheckCapacity(SeqList* pc)
{
	assert(pc);
	int NewCapacity = (pc->capacity == 0 ? 4 : 2 * pc->capacity);
	SLDataType* temp = (SLDataType*)realloc(pc->data, NewCapacity * sizeof(SLDataType));
	if (temp == NULL)
	{
		perror("realloc");
		exit(-1);
	}
	pc->data = temp;
	pc->capacity = NewCapacity;
	temp = NULL;
}

4.尾插

//尾插
void SLPushBack(SeqList* pc, SLDataType nums)
{
	assert(pc);
	//检查容量
	CheckCapacity(pc);
	pc->data[pc->size] = nums;
	pc->size++;
}

5.头插

//头插
void SLPushFront(SeqList* pc, SLDataType nums)
{
	assert(pc);
	CheckCapacity(pc);
	int end = pc->size;
	while (end > 0)
	{
		pc->data[end] = pc->data[end - 1];//挪动数据
		end--;
	}
	pc->data[end] = nums;
	pc->size++;
}

6.尾删

//尾删
void SLPopBack(SeqList* pc)
{
	assert(pc);
	if (pc->size > 0)
	{
		pc->size--;
	}
}

7.头删

//头删
void SLPopFront(SeqList* pc)
{
	assert(pc);
	int begin = 0;
	if (pc->size > 0)
	{
		while (begin < pc->size - 1)
		{
			pc->data[begin] = pc->data[begin + 1];//挪动数据
			begin++;
		}
	}
	pc->size--;
}

8.删除在pos位置的数

//删除在pos位置的数
void SLErase(SeqList* pc, int pos)
{
	assert(pc);
	assert(pos >= 0 && pos < pc->size);//检查是否在数组内
	int begin = pos;

	while(begin < pc->size - 1)
	{
		pc->data[begin] = pc->data[begin + 1];//挪动数据
		begin++;
	}
	pc->size--;
}

我们可以根据这个函数将头删 尾删改成调用这个函数来实现代码如下:

8.1改进后的头删

//头删
void SLPopFront(SeqList* pc)
{
	//assert(pc);
	//int begin = 0;
	//if (pc->size > 0)
	//{
	//	while (begin < pc->size - 1)
	//	{
	//		pc->data[begin] = pc->data[begin + 1];//挪动数据
	//		begin++;
	//	}
	//}
	//pc->size--;
	SLErase(pc, 0);
}

8.2改进后的尾删

//尾删
void SLPopBack(SeqList* pc)
{
    //assert(pc);
    //if (pc->size > 0)
    //{
    //    pc->size--;
    //}
    SLErase(pc, pc->size - 1);

}

9.在pos处插入一个数

//在pos处插入一个数
void SLInsert(SeqList* pc, int pos, SLDataType nums)
{
	assert(pc);
    CheckCapacity(pc);
	assert(pos >= 0 && pos <= pc->size);检查pos的位置
	int end = pc->size;
	while (end > pos)
	{
		pc->data[end] = pc->data[end - 1];//挪动数据
		end--;
	}
	pc->data[end] = nums;
	pc->size++;
}

同样的我们也可利用这个函数改进头插 尾插;

9.1改进后的头插 

//头插
void SLPushFront(SeqList* pc, SLDataType nums)
{
	//assert(pc);
	//CheckCapacity(pc);
	//int end = pc->size;
	//while (end > 0)
	//{
	//	pc->data[end] = pc->data[end - 1];
	//	end--;
	//}
	//pc->data[end] = nums;
	//pc->size++;
	SLInsert(pc, 0, nums);
}

9.2 改进后的尾插

//尾插
void SLPushBack(SeqList* pc, SLDataType nums)
{
	//assert(pc);
	检查容量
	//CheckCapacity(pc);
	//pc->data[pc->size] = nums;
	//pc->size++;

	SLInsert(pc, pc->size, nums);
}

10.修改数据

//修改pos位置的数据
void SLMotify(SeqList* pc, int pos, SLDataType nums)
{
	assert(pc);
	assert(pos >= 0 && pos < pc->size);
	pc->data[pos] = nums;
}

11.查找数据

//查找
int SLFind(SeqList* pc, SLDataType nums)
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->size; i++)
	{
		if (pc->data[i] == nums)
		{
			return i;
		}
	}
	return -1;
}

12销毁数组

//销毁
void SLDestory(SeqList* pc)
{
	assert(pc);
	if (pc->data)
	{
		free(pc->data);
		pc->data = NULL;
		pc->size = 0;
		pc->capacity = 0;
	}
	
}

简单的顺序表就完成了,本篇博客也就到这里了,以上若有错误恳请大佬指正,感激不尽!!!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值