C语言:动态顺序表的简单实现

动态顺序表的实现:


头文件 SeqList.h

#ifndef __SeqList__
#define __SeqList__

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
#include <string.h>

typedef int DataType;

typedef struct SeqList
{
	DataType* array;
	size_t size;
	size_t capacity;   //容量
}SeqList;

void InitSeqList(SeqList* seq);
void PrintSeqList(SeqList* seq);
void CheckCapacity(SeqList* seq);
void PushBack(SeqList* seq, DataType x);
void PopBack(SeqList* seq, DataType x);
void PushFront(SeqList* seq, DataType x);
void PopFront(SeqList* seq, DataType x);
void Insert(SeqList* seq, size_t pos, DataType x);
void Find(SeqList* seq, DataType x);
void Erase(SeqList* seq, size_t pos);
void Remove(SeqList* seq, DataType x);
void Removeall(SeqList* seq, DataType X);

#endif
主要功能函数的实现 SeqList.cpp
#define _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

//顺序表的初始化
void InitSeqList(SeqList* seq)
{
	assert(seq);
	seq->capacity = 3;     //容量小 方便测试
	seq->array = (DataType*)malloc(sizeof(DataType)*seq->capacity);
	assert(seq->array);
	memset(seq->array, 0, sizeof(DataType)* 3);
	seq->size = 0;
}
//打印顺序表
void PrintSeqList(SeqList* seq)
{
	assert(seq);
	for (int i = 0; i < seq->size; i++)
	{
		printf("%d ", seq->array[i]);
	}
	printf("\n");
}
//判断容量是否足够 并且开辟空间
void CheckCapacity(SeqList* seq)
{
	if (seq->size >= seq->capacity)
	{
		DataType* tmp;
		seq->capacity *= 2;
		tmp = (DataType*)malloc(sizeof(DataType)*seq->capacity);
		assert(tmp);
		memcpy(tmp, seq->array, sizeof(DataType)*seq->size);
		free(seq->array);
		seq->array = tmp;
	}
}
//从尾部插入元素
void PushBack(SeqList* seq, DataType x)
{
	assert(seq);
	CheckCapacity(seq);
	seq->array[seq->size] = x;
	seq->size++;
}
//从尾部删除元素
void PopBack(SeqList* seq, DataType x)
{
	assert(seq);
	CheckCapacity(seq);
	if (seq->size == 0)
	{
		printf("顺序表为空!");
		return;
	}
	seq->size--;
}
//从头部插入元素
void PushFront(SeqList* seq, DataType x)
{
	assert(seq);
	CheckCapacity(seq);
	for (int i = seq->size - 1; i >= 0; i--)
	{
		seq->array[i + 1] = seq->array[i];
	}
	seq->array[0] = x;
	seq->size++;
}
//从头部删除元素
void PopFront(SeqList* seq, DataType x)
{
	assert(seq);
	CheckCapacity(seq);
	if (seq->size == 0)
	{
		printf("该顺序表为空!");
		return;
	}
	for (int i = 0; i <= seq->size - 1; i++)
	{
		seq->array[i] = seq->array[i + 1];
	}
	seq->size--;
}
//指定位置插入一个元素x
void Insert(SeqList* seq, size_t pos, DataType x)
{
	assert(seq);
	CheckCapacity(seq);
	if (pos > seq->size)
	{
		printf("输入的位置不合法");
		return;
	}
	else
	{
		for (int i = seq->size; i > pos - 1; i--)
		{
			seq->array[i] = seq->array[i - 1];
		}
		seq->array[pos - 1] = x;
	}
	seq->size++;
}
//在顺序表查找x元素
void Find(SeqList* seq, DataType x)
{
	assert(seq);
	for (int i = seq->size - 1; i >= 0; i--)
	{
		if (seq->array[i] == x)
		{
			printf("找到该元素!");
			return;
		}
	}
	printf("没有找到该元素!");
}
//删除顺序表pos位置上的元素
void Erase(SeqList* seq, size_t pos)
{
	assert(seq);
	assert(pos <= seq->size);
	CheckCapacity(seq);
	for (int i = pos - 1; i < seq->size; i++)
	{
		seq->array[i] = seq->array[i + 1];
	}
	seq->size--;
}
//在顺序表中删除x元素
void Remove(SeqList* seq, DataType x)
{
	assert(seq);
	CheckCapacity(seq);
	for (int i = 0; i < seq->size; i++)
	{
		if (seq->array[i] == x)
		{
			for (int pos = i; pos < seq->size; pos++)
			{
				seq->array[pos] = seq->array[pos + 1];
			}
			seq->size--;
			return;
		}
	}
	printf("该顺序表中没有这个元素!\n");
}
//在顺序表中删除所有为x的元素
void Removeall(SeqList* seq, DataType x)
{
	assert(seq);
	CheckCapacity(seq);
	int count = 0;
	for (int i = 0; i < seq->size; i++)
	{
		if (seq->array[i] == x)
		{
			count++;
		}
		else
		{
			if (count == 0)
			{

			}
			else
			{
				seq->array[i - count] = seq->array[i];
			}
		}
	}
	seq->size -= count;
}
主函数的实现 Test.cpp
#define _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"

void Test1()
{
	SeqList data;
	InitSeqList(&data);

	PushBack(&data, 1);
	PushBack(&data, 2);
	PushBack(&data, 3);
	PushBack(&data, 4);
	PushBack(&data, 5);
	PushBack(&data, 6);
	PushBack(&data, 7);
	PushBack(&data, 8);

	Insert(&data, 2, 2);
	//Find(&data,2);
	//Erase(&data, 3);
	//Remove(&data, 2);
	//Removeall(&data, 2);


	PrintSeqList(&data);

}

void Test()
{
	SeqList data;
	InitSeqList(&data);

	PushBack(&data, 1);
	PushBack(&data, 2);
	PushBack(&data, 3);
	PushBack(&data, 4);

	PrintSeqList(&data);

}

int main()
{
//	Test();
	Test1();

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值