2020-01-13顺序表的简单实现,以及对顺序表进行简单排序功能

博客主要围绕顺序表展开,包含顺序表功能定义和实现,还有主程序测试代码,涉及数据结构相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

##主程序,测试代码

#define _CRT_SECURE_NO_WARNINGS
#include "Array.h"
#include<stdio.h>


void fun1()
{
	array *a1 = arr_init();

	Type temp = 0;
	int index = 0;
	for (int i = 0; i < 10; i++)
	{
		arr_push(a1, temp + i);
	}
	arr_out(a1);
	printf("\n");
	/*arr_MaopaoSort(a1);*/
	//arr_SelectSort(a1);
	arr_InsertSort(a1);
	arr_out(a1);
	printf("\n");
	
	
	/*temp = array_remove(a1, 5);

	printf(P, temp);*/


	/*array_insert(a1, 2, 10);
	arr_out(a1);
	printf("\n");

	arr_pop(a1);
	arr_out(a1);
	printf("\n");
	arr_pop(a1);
	arr_out(a1);
	printf("\n");*/


	//arr_clear(a1);
	//if (arr_empty(a1))
	//	printf("数据域为空\n");
	//arr_out(a1);
	//printf("\n");
	//printf("输入十个数字:\n");
	//for (int i = 0; i < 10; i++)
	//{
	//	scanf(S, &temp);
	//	arr_push(a1, temp);
	//}
	//arr_out(a1);
	//printf("\n");
	//printf("输入你想要获取数据的位置:\n");
	//scanf(S,&index);
	//printf(P, array_get(a1, index));
}
int main()
{
	fun1();

	getchar();
	return 0;
}

##顺序表功能定义

#pragma once
typedef int Type;
//typedef %d T;
#define P "%d\t"
#define S "%d"

typedef struct Array
{
	Type *date;//顺序表的数据
	Type lenth;//顺序表的长度(当前个数)
}array;


//初始化顺序表
array * arr_init();

//销毁数据表
void arr_free(array *arr);


//重置为空表
void arr_clear(array *arr);


//判断是否为空表
int arr_empty(array *arr);

//返回第i个元素的值
Type array_get(array *arr, int i);

//插入顺序表元素
void arr_push(array *arr, Type elem);

//在顺序表指定位置插入新的数据元素
void array_insert(array *arr, int index, Type elem);

//删除顺序表指定位置的数据元素,并返回元素的值
Type array_remove(array *arr, int index);

//输出顺序表
void arr_out(array *arr);

//从尾部删除顺序表
void arr_pop(array *arr);

//冒泡排序,从大到小
void arr_MaopaoSort(array *arr);

//选择排序,从大到小
void arr_SelectSort(array *arr);


//插入排序,从大到小
void arr_InsertSort(array *arr);

##顺序表功能实现


#include "Array.h"

#include<stdio.h>

#include<stdlib.h>


//初始化顺序表
array * arr_init()
{
	array *temp = (array *)malloc(sizeof(array));//顺序表结构体初始化
	if (NULL == temp)
	{
		printf("初始化列表失败");
		return NULL;
	}
	temp->date = (Type *)calloc(1,sizeof(Type));

	if (NULL == temp->date)
	{
		printf("初始化数据域失败");
	}
	temp->lenth = 0;
	return temp;
}

//销毁数据表
void arr_free(array *arr)
{
	if (arr != NULL)
	{
		if (arr->date != NULL)
		{
			free(arr->date);
			free(arr);
		}
	}
	else
	{
		printf("顺序表为空!\n");
	}
}

//重置为空表
void arr_clear(array *arr)
{
	if (NULL == arr)
	{
		printf("数据表为空\n");
		return ;
	}
	//for (int i = 0; i < arr->lenth; i++)
	//{
	//	arr->date[i] = 0;
	//}
	//arr->date = (Type *)realloc(arr->date, sizeof(Type));
	if (NULL == arr->date)
	{
		printf("数据域为空\n");
		return ;
	}
	free(arr->date);
	arr->date = (Type *)calloc(1, sizeof(Type));
	arr->lenth = 0;
}


//判断是否为空表
int arr_empty(array *arr)
{
	if (arr->lenth == 0)
		return 1;
	return 0;
}

//返回第i个元素的值
Type array_get(array *arr, int i)
{
	if (NULL == arr)
	{
		printf("顺序表为空\n");
		return NULL;
	}
	if (NULL == arr->date)
	{
		printf("顺序表数据域为空\n");
		return NULL;
	}
	if (arr_empty(arr))
	{
		printf("顺序表数据为空");
		return NULL;
	}
	return arr->date[i - 1];
}

//尾部插入顺序表元素
void arr_push(array *arr, Type elem)
{
	if (NULL == arr)
	{
		printf("顺序表为空\n");
		return;
	}
	if (NULL == arr->date)
	{
		printf("顺序表数据域为空\n");
		return;
	}
	arr->lenth++;
	arr->date = (Type *)realloc(arr->date, sizeof(Type)*arr->lenth);
	arr->date[arr->lenth - 1] = elem;
}

//在顺序表指定位置插入新的数据元素
void array_insert(array *arr, int index, Type elem)
{
	if (NULL == arr)
	{
		printf("顺序表为空\n");
		return ;
	}
	if (NULL == arr->date)
	{
		printf("顺序表数据域为空\n");
		return ;
	}
	if (arr_empty(arr))
	{
		printf("顺序表数据为空");
		return ;
	}
	arr->lenth++;
	arr->date = (Type *)realloc(arr->date, sizeof(Type)*arr->lenth);
	for (int i = arr->lenth - 1; i >= index; i--)
	{
		arr->date[i] = arr->date[i - 1];
	}
	arr->date[index-1] = elem;

}

//删除顺序表指定位置的数据元素,并返回元素的值
Type array_remove(array *arr, int index)
{
	if (NULL == arr)
	{
		printf("顺序表为空\n");
		return NULL;
	}
	if (NULL == arr->date)
	{
		printf("顺序表数据域为空\n");
		return NULL;
	}
	if (arr_empty(arr))
	{
		printf("顺序表数据为空");
		return NULL;
	}
	Type tmp=arr->date[index-1];
	for (int i = index; i < arr->lenth; i++)
	{
		arr->date[i - 1] = arr->date[i];
	}
	arr->lenth--;
	realloc(arr->date, sizeof(arr->lenth));
	return tmp;
}

//输出顺序表
void arr_out(array *arr)
{
	if (NULL == arr)
	{
		printf("数据表为空");
		return;
	}
	if (NULL == arr->date)
	{
		printf("数据表为空");
		return;
	}
	if (arr_empty(arr))
	{
		printf("顺序表数据为空");
		return;
	}

	for (int i = 0; i < arr->lenth; i++)
	{
		printf(P, arr->date[i]);
	}
}

//从尾部删除顺序表
void arr_pop(array *arr)
{
	arr->date[arr->lenth - 1] = 0;
	arr->lenth--;
	realloc(arr->date, sizeof(Type)*arr->lenth);
}

//冒泡排序,从大到小
void arr_MaopaoSort(array *arr)
{
	if (NULL == arr)
	{
		printf("顺序表为空\n");
		return;
	}
	if (NULL == arr->date)
	{
		printf("顺序表数据域为空\n");
		return;
	}
	if (arr_empty(arr))
	{
		printf("顺序表数据为空");
		return;
	}
	int i, j;
	Type temp;
	for (i = 0; i < arr->lenth; i++)
	{
		for (j = 0; j < arr->lenth - 1-i; j++)
		{
			if (arr->date[j + 1] > arr->date[j])
			{
				temp = arr->date[j];
				arr->date[j] = arr->date[j + 1];
				arr->date[j + 1] = temp;
			}
		}

	}
}

//选择排序,从大到小
void arr_SelectSort(array *arr)
{
	if (NULL == arr)
	{
		printf("顺序表为空\n");
		return;
	}
	if (NULL == arr->date)
	{
		printf("顺序表数据域为空\n");
		return;
	}
	if (arr_empty(arr))
	{
		printf("顺序表数据为空");
		return;
	}
	int i, j,max;
	Type Max;
	
	for (i = 0; i < arr->lenth; i++)
	{
		max = i;
		for (j = i+1; j < arr->lenth; j++)
		{
			if (arr->date[max] < arr->date[j])
			{
				max = j;
			}
		}
		Max = arr->date[max];
		arr->date[max] = arr->date[i];
		arr->date[i] = Max;
	}
}


//插入排序,从大到小
void arr_InsertSort(array *arr)
{
	if (NULL == arr)
	{
		printf("顺序表为空\n");
		return;
	}
	if (NULL == arr->date)
	{
		printf("顺序表数据域为空\n");
		return;
	}
	if (arr_empty(arr))
	{
		printf("顺序表数据为空");
		return;
	}

	int i, j;
	Type tmp;  //记录要插入的数据
	for (i = 1; i < arr->lenth; i++)
	{
		tmp = arr->date[i];
		j = i - 1;
		while (j >= 0 && tmp < arr->date[j])
		{
			arr->date[j] = arr->date[j + 1];
			j--;
		}
		arr->date[j + 1] = tmp;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值