c语言实现顺序表的头插、头删、尾插、尾删、查找以及在任意位置的插入、删除的方法

SeqList.c

#include"SeqList.h"


void SeqListPrint(SL* ps)//对其打印
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

void SeqListInit(SL* ps)//用地址初始化
{
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

void SeqListCheckCapacity(SL* ps)//空间扩容
{
	//如果没有空间或者空间不走就进行扩容
	if (ps->size == ps->capacity)//如果存的数满了
	{
		//因为初始化了,如果刚开始为0,就赋值4,如果不为0,就扩2倍
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		//扩容函数realloc,如果第一次为NULL,则相当于malloc,放回值是void*,非配的内容a,单位是字节
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));
		if (tmp == NULL)//扩容失败为NULL
		{
			printf("realloc fail\n");
			exit(-1);//扩容失败就退出
		}
		ps->a = tmp;//把开辟的空间给a
		ps->capacity = newcapacity;//把开辟的容量给newcapacity
	}
}
void SeqListPushBack(SL* ps, SLDataType x)//数据尾插
{
	SeqListCheckCapacity(ps);//空间扩容
	ps->a[ps->size] = x;//如果不满,则挨着存,然后++;
	ps->size++;
}

void SeqListDestory(SL* ps)//把用过的数据表销毁
{
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

void SeqListPopBack(SL* ps)//数据尾删
{
	if (ps->size > 0)//第一种方法
	{
		ps->size--;//删除数据
	}
	//第二种方法用断言
	//assert(ps->size > 0);
	//ps->size--;
}

void SeqListPushFront(SL* ps, SLDataType x)//数据头插
{
	SeqListCheckCapacity(ps);//空间扩容
	//挪动数据
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->a[end + 1] = ps->a[end];//把数往后挪动一位
		--end;
	}
	//把数字放在头位置
	ps->a[0] = x;
	ps->size++;
}

void SeqListPopFront(SL* ps)//数据头删
{
	assert(ps->size > 0);
	int begin = 1;
	while (begin< ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];//往前挪动
		++begin;
	}
	ps->size--;
}

int SeqListFind(SL* ps, SLDataType x)//查找数据,如果找到返回下标,找不到返回-1.
{
	//int begin = 0;
	//while (beginsize)
	//{
	//	if (ps->a[begin] == x)
	//		return begin;
	//	else
	//		++begin;
	//}
	//return -1;
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

//void SeqListInsert(SL* ps, int pos, SLDataType x)//在pos出插入,第2个插入5
//{
//	SeqListCheckCapacity(ps);//空间扩容
//	int end = ps->size - 1;
//	while (end >= 0)//往后面的后挪
//	{
//		ps->a[end + 1] = ps->a[end];
//		if (end == pos - 1)
//		{
//			break;
//		}	  
//		--end;
//	}
//	ps->a[pos - 1] = x;
//	ps->size++;
//}
void SeqListInsert(SL* ps, int pos, SLDataType x)//在pos出插入,第2个插入5
{
	assert(pos >= 0 && pos <= ps->size);
	SeqListCheckCapacity(ps);//空间扩容
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		--end;
	}
	ps->a[pos] = x;
	ps->size++;
}

//void SeqListErase(SL* ps, int pos, SLDataType x)//在指定的位置pos删除,第2个位置删除10在
//{
//	int begin = pos - 1;
//	if (ps->a[begin] == x)
//	{
//		for (begin = pos - 1; begin < ps->size; begin++)
//		{
//			ps->a[begin ] = ps->a[begin+1];//往前挪动
//		}
//		ps->size--;
//	}
//}
void SeqListErase(SL* ps, int pos)//在指定的位置pos删除,第2个位置删除10在
{
	assert(pos >= 0 && pos < ps->size);
	int begin = pos + 1;
	while (begin < ps->size)
	{
		ps->a[begin] = ps->a[begin + 1];
		++begin;
	}
	ps->size--;
}

SeqList.h

#pragma once
//#define N 100
typedef int SLDataType;//把int 类型重定义为SLDataType 
#include
#include
#include

//动态数据表
typedef struct SeqList
{
	SLDataType* a;//把数据存到数组中,开辟的动态空间用的是指针
	int size;//数组中存了多少数据
	int capacity;//表示实际能存数据空间容量的大小
}SL;

//接口函数
void SeqListInit(SL* ps);//初始化
void SeqListDestory(SL* ps);//把用过的数据表销毁
void SeqListCheckCapacity(SL* ps);//空间扩容
void SeqListPushBack(SL* ps, SLDataType x);//数据尾插
void SeqListPopBack(SL* ps);//数据尾删
void SeqListPushFront(SL* ps, SLDataType x);//数据头插
void SeqListPopFront(SL* ps);//数据头删

int SeqListFind(SL* ps,SLDataType x);//查找数据,如果找到返回下标,找不到返回-1.
void SeqListInsert(SL* ps, int pos, SLDataType x);//在指定的位置pos出插入
void SeqListErase(SL* ps, int pos, SLDataType x);//在指定的位置pos删除

main.c

#include"SeqList.h"

void TestSeqList()
{
	SL s1;
	SeqListInit(&s1);//传地址进行初始化
	SeqListPushBack(&s1, 1);//数据尾插
	SeqListPushBack(&s1, 2);
	SeqListPrint(&s1);//打印函数

	SeqListPushFront(&s1, 10);//头插
	SeqListPushFront(&s1, 9);
	SeqListPrint(&s1);//打印函数

	int ret=SeqListFind(&s1, 8);//查找表中的值,返回下标
	if (ret == -1)
	{
		printf("没找到\n");
	}
	else
		printf("找到了下标为=%d\n",ret);

	SeqListInsert(&s1, 8, 15);//在任意位置插入
	SeqListInsert(&s1, 9, 16);//在任意位置插入
	SeqListPrint(&s1);//打印函数
	
	SeqListErase(&s1, 12, 9);//在任意位置删除
	SeqListErase(&s1, 13, 10);//在任意位置删除
	SeqListPrint(&s1);//打印函数

	SeqListDestory(&s1);//销毁函数
}


int main()
{
	TestSeqList();//顺序表的各种操作
	return 0;
}

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