线性表之顺序表(动态~增删差改找插)

采用多文件形式,运行环境VS2013

1.头文件

SeqList.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#define N 10    

typedef int SLDataType;
// 顺序表的动态存储
typedef struct SeqList
{
    
    
	SLDataType* array; // 指向动态开辟的数组
	size_t size; // 有效数据个数
	size_t capicity;// 容量空间的大小
}SeqList;
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl, size_t capacity);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删
void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 顺序表销毁
void SeqListDestory(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);

2.源文件

SeqList.c

#include"SeqList.h"
// 顺序表初始化
void SeqListInit(SeqList* psl, size_t capacity){
    
    
	psl->array = (SLDataType*)malloc(capacity*sizeof(SLDataType));
	assert(psl->array);
	psl->capicity = capacity;
	psl->size = 0;
}
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl){
    
    
		if (psl ->size == psl->capicity)
		{
    
    
			size_t newcapacity = psl ->capicity * 2;
			psl->array = (SLDataType*)realloc(psl->array, newcapacity*sizeof(SLDataType));
			psl->capicity = newcapacity;
		}
	}

// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x){
    
    
	assert(psl);
	CheckCapacity(psl);
	psl->array[psl->size]= x;
	psl->size++;

}
// 顺序表尾删
void SeqListPopBack(SeqList* psl){
    
    
	assert(psl);
	if (0==psl->size){
    
    
		return;
	}
	else
		psl->size--;
}

// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x){
    
    
	assert(psl);
	CheckCapacity(psl);

	for (int i = psl->size-1; i >=0; --i){
    
    
		psl->array[i + 1] = psl->array[i];
	}
	psl->array[0] = x;
	psl->size++;
}
// 顺序表头删
void SeqListPopFront(SeqList* psl){
    
    
	if (0 == psl->size)
		return;
	for (int i = 0; i < psl->size-1; ++i){
    
    
		psl->array[i] = psl->array[i + 1];
	}
	psl->size--;
}

// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x){
    
    
	assert(psl);
	CheckCapacity(psl);
	if (pos==1)
	{
    
    
		SeqListPushFront(psl, x);
	}
	else{
    
    
		for (int i = psl->size - 1; i >= pos - 1; --i){
    
    
			psl->array[i + 1] = psl->array[i];
		}
		psl->array[pos - 1] = x;
		psl->size++;
	}
}
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos){
    
    
	assert(psl);
	CheckCapacity(psl);
	if (pos == 1)
	{
    
    
		SeqListPopFront(psl);
	}
	else{
    
    
		if (pos > psl->size){
    
    
			return;
		}
		else{
    
    
			for (int i = pos - 1; i < psl->size; ++i){
    
    
				psl->array[i] = psl->array[i + 1];
			}
			psl->size--;
		}
	}
}


// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x){
    
    
	assert(psl);
	if (psl->array == NULL)
		return;
	for (int i = 0; i < psl->size - 1; ++i){
    
    
		if (psl->array[i] == x){
    
    
			printf("%d\n", i);
		}
	}
}
// 顺序表打印
void SeqListPrint(SeqList* psl){
    
    
	assert(psl);
	for (int i = 0; i < psl->size; ++i){
    
    
		printf("%d ", psl->array[i]);
	}
	printf("\n");
}
//销毁顺序表
void SeqListDestory(SeqList* psl){
    
    
	assert(psl);
	free(psl ->array);
	psl->array = NULL;
	psl->size = psl->capicity = 0;
}

test.c

#include"SeqList.h"
int test()
{
    
    
	SeqList psl;//初始化,必须要有
	//SeqListInit(&psl, N);
	//SeqListPushBack(&psl, 1);
	//SeqListPushBack(&psl, 2);
	//SeqListPushBack(&psl, 3);
	//SeqListPushBack(&psl, 4);
	//SeqListPushBack(&psl, 5);
	//SeqListPopBack(&psl, 6);
	//SeqListInsert(&psl, 1, 510);
	//SeqListErase(&psl,10 );
	SeqListPrint(&psl);//打印顺序表
    SeqListDestory(&psl);//销毁,必须有,防止内存泄露
}
int main(){
    
    
	test();

	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_58103115/article/details/121367174