很早之前写的, 最近复习。之前没有上传, 现在上传。
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;
}
测试结果:
如果有想玩朋友, 测试接口随意写, 不必借鉴的。