Tabla de secuencia de estructura de datos: interfaz de implementación del lenguaje C

tabla de secuencia

Concepto y estructura
Una tabla de secuencia es una estructura lineal que utiliza una unidad de almacenamiento con una dirección física continua para almacenar elementos de datos en secuencia. Generalmente se utiliza almacenamiento en matriz.

Agregue, elimine, verifique y modifique datos en la matriz.

Las tablas de secuencia generalmente se pueden dividir en:

  1. Tabla de secuencia estática: utiliza una matriz de longitud fija para almacenar elementos.
  2. Tabla de secuencia dinámica: utilice almacenamiento de matriz abierto dinámicamente.
  • Se recomienda utilizar pruebas modulares aquí. Esto facilita la depuración y mejora la legibilidad y el mantenimiento del código.

declaración de interfaz

                                        **SeqList.h**           
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


typedef int SLDateType;

//动态顺序表

typedef struct SeqList
{
    
    
	SLDateType* arr; //指针域:指向动态数组的指针   
	int sz;          //数据域:数据个数
	int Capacity;    //数据域:容量空间
}SL;

//初始化
//void SeqListInit(SL* ps);
void SLInit(SL* ps);

//销毁
void SLDestory(SL* ps);

//打印顺序表
void SLPrint(SL* ps);

//扩容
void SLCheckCapacity(SL* ps);

//尾部插入
void SLPushBack(SL* ps, SLDateType x); //O(1)

//尾部删除
void SLPopBack(SL* ps); //O(1)

//头部插入
void SLPushFront(SL* ps, SLDateType x); //O(N)

//头部删除
void SLPopFront(SL* ps); //O(N)


//任意位置插入
void  SLInsert(SL* ps,int pos,SLDateType x);

//任意位置删除
void  SLErase(SL* ps, int pos);

//查找
int SLFind(SL* ps, SLDateType x);

//修改
void SLModify(SL* ps,int pos, SLDateType x);

Implementación de interfaz

                                           **SeqList.c**         
#include"SeqList.h"


//初始化
void SLInit(SL* ps)  
{
    
    
	assert(ps);

	ps -> arr = NULL;
	ps -> sz = ps -> Capacity = 0;
}

//销毁
void SLDestory(SL* ps)
{
    
    
	if (ps->arr)
	{
    
    
		free(ps->arr);
		ps->arr = NULL;
		ps->sz = ps->Capacity = 0;
	}
}


//扩容
void SLCheckCapacity(SL* ps)
{
    
    
	assert(ps);

	//检查容量空间 - 扩容
	if (ps->sz == ps->Capacity)
	{
    
    
		int newCapacity = ps->Capacity == 0 ? 4 : ps->Capacity * 2; //条件操作符 如果Capacity 空间为0 则赋给4byte,反之空间*2

		SLDateType* tmp = (SLDateType*)realloc(ps->arr, newCapacity * sizeof(SLDateType));
		if (tmp == NULL)
		{
    
    
			perror("SLPushBack::realloc");
			exit(-1); //结束程序
			//return;
		}

		ps->arr = tmp;
		ps->Capacity = newCapacity;
	}
}


//尾部插入
void SLPushBack(SL* ps, SLDateType x )
{
    
    
	assert(ps);

	SLCheckCapacity(ps);//扩容
	   
	//插入数据
	ps->arr[ps->sz] = x;
	ps->sz++;
}


//头部插入
void SLPushFront(SL* ps, SLDateType x)
{
    
    
	assert(ps);

	SLCheckCapacity(ps);//扩容

	//挪动数据
	int end = ps->sz - 1;
	while (end >= 0)
	{
    
    
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}

	//插入数据
	ps->arr[0] = x;
	ps->sz++;

}


//尾部删除 - 1
//void SLPopBack(SL* ps)
//{
    
    
//	assert(ps);
//
//	//怀柔检查
//	//if (ps->sz == 0)
//	//{
    
    
//	//	printf("SeqList is empty\n");
//	//	return;
//	//}
//
//	//暴力检查
//	assert(ps->sz > 0);
//
//	ps->sz--;
//}
//尾部删除 - 2
void SLPopBack(SL* ps)
{
    
    
	SLErase(ps, ps->sz - 1);
}



//头部删除-1
//void SLPopFront(SL* ps)
//{
    
    
//	assert(ps);
//
//	assert(ps->sz > 0);
//
//	int begin = 1;
//	while (begin < ps->sz)
//	{
    
    
//		ps->arr[begin - 1] = ps->arr[begin];
//		begin++;
//	}
//
//	ps->sz--;
//}
//头部删除-2
void SLPopFront(SL* ps)
{
    
    
	SLErase(ps, 0);
}


//打印顺序表
void SLPrint(SL* ps)
{
    
    
	assert(ps);

	for (int i = 0; i < ps->sz; i++)
	{
    
    
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}


//任意位置插入
void  SLInsert(SL* ps, int pos, SLDateType x) 
{
    
    
	assert(ps);
	assert(pos >= 0 && pos <= ps->sz );

	SLCheckCapacity(ps);//扩容

	//挪动数据
	int end = ps->sz - 1;
	while (end >= pos)
	{
    
    
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}

	ps->arr[pos] = x;
	ps->sz++;

}



//任意位置删除
void  SLErase(SL* ps, int pos)
{
    
    
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);

	int begin = pos;
	while (begin < ps->sz-1)
	{
    
    
		ps->arr[begin] = ps->arr[begin + 1];
		begin++;
	}

	//int begin = pos+1;
	//while (begin < ps->sz)
	//{
    
    
	//	ps->arr[begin-1] = ps->arr[begin];
	//	begin++;
	//}

	ps->sz--;
}

//查找
int SLFind(SL* ps, SLDateType x)
{
    
    
	assert(ps);
	for (int i = 0; i < ps->sz; i++)
	{
    
    
		if (ps->arr[i] == x)
		{
    
    
			return i;
		}
	}

	return -1;
}

//修改
void SLModify(SL* ps,int pos, SLDateType x)
{
    
    
	assert(ps);
	assert(pos >= 0 && pos < ps->sz);

	ps->arr[pos] = x;
}


prueba de interfaz

                                            **test.c**        
#include"SeqList.h"


void TestSeqList1()//测试尾插
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPrint(&sl);

	SLPushBack(&sl, 5);
	SLPrint(&sl);

	SLPushBack(&sl, 5);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 5);
	SLPrint(&sl);
}

void TestSeqList2()//测试头插
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLPushFront(&sl, 5);
	SLPrint(&sl);
}

void TestSeqList3()//测试尾删
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLPopBack(&sl);//尾删
	SLPrint(&sl);

	SLPopBack(&sl); 
	SLPopBack(&sl);
	SLPopBack(&sl);
	//SLPopBack(&sl);


	SLPushBack(&sl, 1);
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	
	SLPrint(&sl);

	SLDestory(&sl);//销毁

}

void TestSeqList4()//测试头删
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPopFront(&sl);
	SLPopFront(&sl);
	//SLPopFront(&sl);

	SLPushFront(&sl, 4);
	SLPrint(&sl);

}


void TestSeqList5()//测试任意位置插入
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	SLInsert(&sl,3,40);
	SLPrint(&sl);


	//SLPushBack(&sl,50);
	//SLPrint(&sl);

	SLInsert(&sl, 5, 40);
	SLPrint(&sl);
}

void TestSeqList6()//测试任意位置插入
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	SLErase(&sl, 2);
	SLPrint(&sl);

	SLErase(&sl, 1);
	SLPrint(&sl);

	SLErase(&sl, 2);
	SLPrint(&sl);
}

void TestSeqList7()//测试任意位置删除
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	SLPopBack(&sl);
	SLPrint(&sl);

	SLPopFront(&sl);
	SLPrint(&sl);

}

void TestSeqList8()//测试 查找 
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	int x = 0;
	printf("请输入要删除的值:>");
	scanf("%d", &x);
	int pos = SLFind(&sl, x);
	if (pos != -1)
	{
    
    
		SLErase(&sl, pos);
	}
	else
	{
    
    
		printf("没有找到:>%d", x);
	}
	SLPrint(&sl);
}

void TestSeqList9()//测试 修改
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPrint(&sl);

	int x = 0;
	int y = 0;
	printf("请输入要修改的值:>");
	scanf("%d%d", &x,&y);
	int pos = SLFind(&sl, x);
	if (pos != -1)
	{
    
    
		SLModify(&sl, pos,y);
	}
	else
	{
    
    
		printf("没有找到:>%d", y);
	}
	SLPrint(&sl);

}

void TestSeqList10()//测试 删除相同的数字
{
    
    
	SL sl;
	SLInit(&sl);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 4);
	SLPushFront(&sl, 5);
	SLPushFront(&sl, 4);
	SLPrint(&sl);

	int x = 0;
	printf("请输入要删除的值:>");
	scanf("%d", &x);
	int pos = SLFind(&sl, x);

	while (pos != -1)
	{
    
    
		SLErase(&sl, pos); 
		pos = SLFind(&sl, x);
	}

	SLPrint(&sl);
}


int main()
{
    
    
	//TestSeqList10();

	return 0;
}




Supongo que te gusta

Origin blog.csdn.net/m0_73969113/article/details/131437062
Recomendado
Clasificación