线性表(动态)

很早之前写的, 最近复习。之前没有上传, 现在上传。

lineartable.h

#pragma once

/*
	project: 模拟实现线性表。
	time:	 2020-6-8
	name:    HMW
*/

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

#define MAXSIZE 5				//初始化容量
#define INCREAMENT 10			//扩容量

typedef int Datatype;			//重定义int

typedef struct linear				
{
	Datatype *data;				//首地址
	size_t size;				//数据大小
	size_t capacity;			//容量
}*Plinear, linear;

void Init_linear(Plinear nums);											//初始化线性表
void JudgeCapacityIsFull(Plinear nums);									//判断空间是否充沛
void Print_lineartable(Plinear nums);									//打印
void PushBack(Plinear nums, Datatype value);							//尾插
void PushFront(Plinear nums,  Datatype value);							//头插
void Insert_value(Plinear nums, Datatype position, Datatype value);		//任意插
void PopBack(Plinear nums);												//尾删
void PopFront(Plinear nums);											//头删
void Delete_value(Plinear nums, size_t position);						//任意删
void Bubble_sort(Plinear nums);											//冒泡排序
void Binary_seek(Plinear nums, Datatype value);							//二分查找
void Destroy(Plinear nums);												//销毁 - 释放空间

lineartable.c

#include"lineartable.h"

//线性表的初始化
void Init_linear(Plinear nums)
{
	assert(nums != NULL);
	nums->data = (Datatype*)malloc(sizeof(Datatype) * MAXSIZE);		//初始化为MAXSIZE容量数组
	nums->size = 0;													//数组大小
	nums->capacity = MAXSIZE;										//当前数组的容量
}

//判断容量 - 扩容
void JudgeCapacityIsFull(Plinear nums)
{
	assert(nums != NULL);

	if (nums->size == nums->capacity)								//扩容
	{

		nums->data = realloc(nums->data, sizeof(Datatype)*(nums->capacity + INCREAMENT));

		if (nums->data == NULL)										//分配失败情况
		{
			printf("发配内存失败!\n");
			exit(0);
		}
		nums->capacity += INCREAMENT;								//更新容量大小
		printf("进行了内存扩容操作!	扩容成功!\n");
		printf("扩展后新的内存容量为: %u  -- %u\n", _msize(nums->data), nums->capacity);
	}
	
}

//尾插
void PushBack(Plinear nums, Datatype value)
{
	//assert(nums != NULL);
	//JudgeCapacityIsFull(nums);											//判断容量

	///*插入操作*/
	//nums->data[nums->size] = value;
	//nums->size++;
	Insert_value(nums, nums->size, value);
}

//打印
void Print_lineartable(Plinear nums)
{
	assert(nums != NULL);
	
	int i = 0;
	printf("----->");
	for (i = 0; i < nums->size; ++i)
	{
		printf("%d  ", nums->data[i]);
	}
	printf("\n");
}

//头插
void PushFront(Plinear nums, Datatype value)
{
	//assert(nums != NULL);

	//JudgeCapacityIsFull(nums);											//判断容量
	
	//size_t end = nums->size;
	偏移
	//for (; end > 0; --end)
	//{
	//	nums->data[end] = nums->data[end - 1];
	//}
	//nums->data[0] = value;												//插入元素
	//nums->size++;															//size++
	Insert_value(nums, 0, value);
}


//任意插
void Insert_value(Plinear nums, Datatype position, Datatype value)
{
	assert(nums != NULL && (position >= 0) && (position <= nums->size));

	JudgeCapacityIsFull(nums);												//判断容量

	size_t start = position;
	size_t end = nums->size;
	//偏移
	for (; end > start; --end)
	{
		nums->data[end] = nums->data[end - 1];
	}
	nums->data[end] = value;												//插入元素
	nums->size++;															//size++
}

//头删
void PopFront(Plinear nums)
{
	assert(nums != NULL);

	size_t start = 0;
	//左偏移
	for (; start < nums->size - 1; ++start)
	{
		nums->data[start] = nums->data[start + 1];
	}
	nums->size--;															//size--

}

//尾删
void PopBack(Plinear nums)
{
	assert(nums != NULL && (nums->size > 0));
	nums->size--;															//size--
}

//任意删
void Delete_value(Plinear nums, size_t position)
{
	assert(nums != NULL && (position >= 0) && (position < nums->size));

	size_t start = position - 1;
	//左偏移
	for (; start < nums->size - 1; ++start)
	{
		nums->data[start] = nums->data[start + 1];
	}

	nums->size--;
}

//冒泡排序
void Bubble_sort(Plinear nums)
{
	assert(nums != NULL);

	int i = 0;
	int j = 0;
	int flag = 0;
	for (i = 0; i < nums->size - 1; ++i)
	{
		flag = 0;															//优化器
		for (j = 0; j < nums->size - i - 1; ++j)
		{
			if (nums->data[j] > nums->data[j + 1])
			{
				int temp = nums->data[j];
				nums->data[j] = nums->data[j + 1];
				nums->data[j + 1] = temp;
				flag = 1;
			}
		}
		if (flag == 0)
		{
			return;
		}
	}
}

//二分查找
void Binary_seek(Plinear nums, Datatype value)
{
	assert(nums != NULL);

	int left = 0;
	int right = nums->size  - 1;

	while (left <= right)
	{
		int middle = ((right - left) >> 1) + left;							//中间值

		if (value < nums->data[middle])
		{
			right = middle - 1;
		}
		else if (value > nums->data[middle])
		{
			left = middle + 1;
		}
		else
		{
			printf("找到啦, 下标为%d\n", middle);
			return;
		}
	}
	printf("没有找到\n");
}

//销毁
void Destroy(Plinear nums) {
	if (nums->data) {
		free(nums->data);													//释放资源
		nums->data = NULL;
	}
}

test.c

#include"lineartable.h"

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//#include<vld.h>

void test_code()
{
	linear nums;

	Init_linear(&nums);
	printf("INIT_LINEAR\n");

	PushBack(&nums, 6);
	PushBack(&nums, 5);
	PushBack(&nums, 4);
	PushBack(&nums, 3);
	PushBack(&nums, 2);
	PushBack(&nums, 1);
	printf("尾插元素6,5,4,3,2,1\n");

	Print_lineartable(&nums);

	
	PushFront(&nums, 77);
	PushBack(&nums,  77);
	Insert_value(&nums, 3, 77);
	printf("头插77, 尾插77, 3号小标插入77\n");

	Print_lineartable(&nums);

	PopFront(&nums);
	printf("头删\n");

	Print_lineartable(&nums);

	PopBack(&nums);
	printf("尾删\n");
	Print_lineartable(&nums);

	Delete_value(&nums, 3);
	printf("删除3号小标元素\n");
	Print_lineartable(&nums);

	Bubble_sort(&nums);
	printf("冒泡排序\n");
	Print_lineartable(&nums);

	printf("二分查找 value - 6\n");
	Binary_seek(&nums, 6);

	Destroy(&nums);
}

int main()
{
	test_code();

	system("pause");
	return 0;
}

测试结果:
在这里插入图片描述

如果有想玩朋友, 测试接口随意写, 不必借鉴的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值