Data structure sequence table - C language implementation interface

Sequence table

Concept and structure
A sequence table is a linear structure that uses a storage unit with a continuous physical address to store data elements in sequence. Generally, array storage is used.

Complete the addition, deletion, checking and modification of data on the array.

The sequence table can generally be divided into:

  1. Static sequence table: use a fixed-length array to store elements.
  2. Dynamic sequence table: use dynamically opened array storage.
  • It is recommended to use modular testing here. This is more convenient for debugging and improves the readability and maintainability of the code.

interface declaration

                                        **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);

Interface implementation

                                           **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;
}


interface test

                                            **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;
}




Guess you like

Origin blog.csdn.net/m0_73969113/article/details/131437062