顺序表的功能实现

1.顺序表要实现头插,尾插,头删,尾删,查找,初始化,销毁等功能

2.顺序表要使用动态顺序表

3.顺序表的实现要分为三个文件分为头文件,功能函数实现文件和测试文件

seqlist.h(功能命名头文件)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
静态顺序表
//#define N 10
//struct seqlist
//{
//	int arr[N];
//	int size;
//空间大小是固定好的动态顺序表的空间大小可以随时改变
//};
//typedef是定义结构体的名字
//动态顺序表
typedef int SLDataType;
//这里改变变量类型的话可以直接改变替换
typedef struct seqlist
{
	SLDataType* arr;
	int size;//有效的元素个数
	int capacity;//数组的空间大小

}SL;

//初始化顺序表
void SLInit(SL* ps);
//顺序表尾插元素
void SLPushBack(SL* ps, SLDataType x);
//尾删元素
void SLPopBack(SL* ps);
//头插元素
void SLPushFront(SL* ps, SLDataType x);
//头删元素
void SLPopFront(SL* ps);
//顺序表的销毁
void SLDestroy(SL* ps);
//顺序表的打印
void SLPrint(SL s);
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
//删除指定位置的数据
void SLErase(SL* ps, int pos);
//查找
int SLFInd(SL* ps, SLDataType x);

seqlist.c(功能实现文件)

#define _CRT_SECURE_NO_WARNINGS
#include"seqlist.h"
//初始化顺序表
void SLInit(SL* ps)
//传地址不是穿值
//实参传递给形参是值的传递,传递地址
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}
//销毁顺序表
void SLDestroy(SL* ps)
{
	if(ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}
//检测顺序表是否有空间
void SLCheckCapacity(SL* ps)
{
	if (ps->capacity == ps->size)
	{
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);//直接退出程序
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
}
//尾插元素
void SLPushBack(SL* ps, SLDataType x)
{
	//插入数据之前先检查空间是否够用
	//增容一般以二倍增加
	//防止ps开局为空
	assert(ps);
	//if (ps->capacity == ps->size)
	//{
	//	int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
	//	SLDataType* tmp = (SLDataType*)realloc(ps->arr, newCapacity * sizeof(SLDataType));
	//	if (tmp == NULL)
	//	{
	//		perror("realloc fail");
	//		exit(1);//直接退出程序
	//	}
	//	ps->arr = tmp;
	//	ps->capacity = newCapacity;
	//}
	SLCheckCapacity(ps);
	ps->arr[ps->size++] = x;
}
//尾删元素
void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->size);
	//ps->arr[ps->size-1] = -1;
	// 这里的size是数据个数组的下标跟size不一样数组的下表比size小一个单位
	// 这段代码要不要都可以尾删只需要不打印最后一个数字就可以
	//不会影响其他数据
	ps->size--;
	//ps->capacity--;空间没有变化capacity不用变化
}
//头插元素
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i-1];
		//最后size到达1的位置就是arr[1]=arr[0]让arr[0]的位置空出来
	}
	ps->arr[0] = x;
	ps->size++;
}
//头删元素
void SLPopFront(SL* ps)
{
	assert(ps);
	assert(ps->size);
	for (int i = 0; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];//最后一次是arr[size-2]==arr[size-1];
		//全部向前移动一位
	}
	ps->size--;
}
//打印顺序表
void SLPrint(SL s)
{
	for (int i = 0; i < s.size; i++)
	{
		printf("%d ", s.arr[i]);
	}
	printf("\n");
}
//在指定位置之前插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos>0&&pos<=ps->size);
	SLCheckCapacity(ps);
	for (int i = ps->size; i > pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];//最后一项是arr[pos+1]=arr[pos];
	}
	ps->arr[pos] = x;
	ps->size++;
}
void SLErase(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];//最后一项是arr[size-2]=arr[size-1]
	}
	ps->size--;
}
//查找
int SLFInd(SL* ps, SLDataType x)
{
	assert(ps);
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return 1;
		}
	}
	return -1;
}

text.c(测试文件)

#define _CRT_SECURE_NO_WARNINGS
//实现顺序表的增删查改
#include"seqlist.h"
void seqlist()
{
	SL sl;
	//初始化顺序表
	SLInit(&sl);
	//尾插
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3); 
	SLPushBack(&sl, 4);
	SLPrint(sl);
	SLInsert(&sl, 2, 77);
	SLPrint(sl);
	SLErase(&sl, 2);
	SLPrint(sl);
	int find = SLFInd(&sl, 2);
	{
		if (find < 0)
		{
			printf("没有找到\n");
		}
		else
		{
			printf("找到了下表为%d\n", find);
		}
	}
	头插
	//SLPushFront(&sl, 5);
	//SLPrint(sl);
	//SLPushFront(&sl, 6);
	//SLPrint(sl);
	//SLPushFront(&sl, 7);
	//SLPrint(sl);
	//SLPushFront(&sl, 8);
	//SLPrint(sl);
	头删
	//SLPopFront(&sl);
	//SLPrint(sl);
	尾删
	//SLPopBack(&sl);
	//SLPrint(sl);
	//顺序表的销毁
	SLDestroy(&sl);
}
int main()
{
	seqlist();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值