C语言: 线性表Dome

基于数组实现的线性表:

包含增删查改

头文件:arraytable.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<memory.h>

#define DATA_TYPE int

struct array
{
	DATA_TYPE* pStart;//数组首地址
	int length;//数组长度
	int sortstat;//有序或无序
};

typedef struct array ARRAY;


struct result
{
	DATA_TYPE** vPtr_Start;//二级指针,保存指针数组
	int count;//元素个数
};

typedef struct result RES;

enum RESULT
{
	FALSE=0,
	TRUE=1,
};



/*
   功能:       初始化数据结构
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
*/
int init(ARRAY* array);

/*
   功能:       初始化数据结构并添加一条数据
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
		       DATA_TYPE data  数据
*/
int init_with_data(ARRAY* array,DATA_TYPE data);

/*
   功能:       初始化数据结构并添加组个数据
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
			   DATA_TYPE* data  数据指针
			   int length  数据长度
*/
int init_with_array(ARRAY* array, DATA_TYPE *data, int length);

/*
   功能:     显示所有数据
   --------------------------------
   参数:     无  
*/
int show(ARRAY* array);

/*
   功能:       在尾部添加一条数据
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
			   DATA_TYPE data  数据
*/
int add_Object_Tail(ARRAY* array, DATA_TYPE data);

/*
   功能:       在尾部添加一组数据
  --------------------------------------------
   参数:	  ARRAY* array        数据结构指针
			  DATA_TYPE *data     数据指针
			  int length          数据长度
*/
int add_Objects_Tail(ARRAY* array, DATA_TYPE *data,int length);

/*
   功能:       根据数据查找元素,返回第一个相同元素的指针地址
  -------------------------------------------------------
   参数:	  ARRAY* array        数据结构指针
			  DATA_TYPE data      数据
 -------------------------------------------------------- 
  返回:       DATA_TYPE*         指针(有)或 NULL(无)
*/
DATA_TYPE* findFirst(ARRAY* array, DATA_TYPE data);

/*
   功能:       根据数据查找元素,所有包含所有相同元素的结构体
  -------------------------------------------------------
   参数:	  ARRAY* array        数据结构指针
			  DATA_TYPE data      数据
 --------------------------------------------------------
   返回:      RES                 结构体,保存所有相同元素
*/
RES findAll(ARRAY* array, DATA_TYPE data);

/*
   功能:       在指定查找到元素的前面插入一个数据
  --------------------------------------------
   参数:       ARRAY* array          数据结构指针
               DATA_TYPE finddata    查找的数据
			   DATA_TYPE insertdata  插入的数据
  --------------------------------------------------
   返回:     (int 类型) 0 或 1
*/
int insert_Object_Head(ARRAY* array, DATA_TYPE finddata, DATA_TYPE insertdata);

/*
   功能:       在指定查找到元素的前面插入一组数据
  --------------------------------------------
   参数:	  ARRAY* array              数据结构指针
			  DATA_TYPE* insertdata     插入的数据指针
			  DATA_TYPE finddata        查找的数据
			  int length                数据长度
  --------------------------------------------------
   返回:     (int 类型) 0 或 1
*/
int insert_Objects_Head(ARRAY* array, DATA_TYPE finddata, DATA_TYPE* insertdata, int length);

/*
   功能:       删除第一个指定元素
  --------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        删除的数据
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int delete_First_Object(ARRAY* array, DATA_TYPE data);

/*
   功能:       删除所有指定元素
  -------------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        删除的数据
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int delete_All_Object(ARRAY* array, DATA_TYPE data);

/*
   功能:       修改第一个指定元素
  --------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        修改的数据
			   DATA_TYPE newData     新值
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int change_First_Object(ARRAY* array, DATA_TYPE data,DATA_TYPE newData);

/*
   功能:       修改所有指定元素
  -------------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        删除的数据
				DATA_TYPE newData    新值
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int change_All_Object(ARRAY* array, DATA_TYPE data,DATA_TYPE newData);

源文件:arraytable.c

#include"arraytable.h"

/*
   功能:       初始化数据结构
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
*/
int init(ARRAY* array)
{
	if (array != NULL)
	{
		array->pStart = NULL;
		array->length = 0;
		array->sortstat = 0;
		return TRUE;
	}
	else
	{
		printf("init error!");
		return FALSE;
	}
}

/*
   功能:       初始化数据结构并添加一条数据
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
			   DATA_TYPE data  数据
*/
int init_with_data(ARRAY* array, DATA_TYPE data)
{
	if (array != NULL)
	{
		array->pStart = malloc(sizeof(DATA_TYPE));//分配内存
		if (array->pStart != NULL)
		{
			*(array->pStart) = data;
			array->length = 1;
			array->sortstat = 0;
			return TRUE;
		}
		else
		{
			printf("Memory space expansion failed!\n");
			return FALSE;
		}
		
	}
	else
	{
		printf("init_with_data error!\n");
		return FALSE;
	}
	
}

/*
   功能:       初始化数据结构并添加组个数据
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
			   DATA_TYPE* data  数据指针
			   int length  数据长度
*/
int init_with_array(ARRAY* array, DATA_TYPE* data, int length)
{
	if (array != NULL)
	{
		array->pStart = malloc(sizeof(DATA_TYPE) * length);//分配内存
		if (array->pStart != NULL)
		{
			memcpy(array->pStart, data, (sizeof(DATA_TYPE) * length));//内存拷贝
		/*for (size_t i = 0; i < length; i++)
		{
			array->pStart[i] = data[i];//(array->pStart) 是指针 加上下标 可以取出数据
		}*/

			array->length = length;
			array->sortstat = 0;
			return TRUE;
		}
		else
		{
			printf("Memory space expansion failed!\n");
			return FALSE;
		}
		
	}
	else
	{
		printf("init_with_array error!\n");
		return FALSE;
	}
	
}

/*
   功能:     显示所有数据
   --------------------------------
   参数:     无
*/
int show(ARRAY* array)
{
	if (array == NULL || array->pStart == NULL || array->length == 0)
	{
		printf("数据为空!\n");
		return FALSE;
	}
	else
	{
		for (int i = 0; i < array->length; i++)
		{
			printf("%4d", array->pStart[i]);

			if ((i + 1) % 10 == 0)
			{
				printf("\n");
			}
		}
		printf("\n");
		return TRUE;
	}
}

/*
   功能:       在尾部添加一条数据
  --------------------------------------------
   参数:       ARRAY* array  数据结构指针
			   DATA_TYPE data  数据
*/
int add_Object_Tail(ARRAY* array, DATA_TYPE data)
{
	if (array != NULL)
	{
		//数据为空时
		if (array->pStart == NULL || array->length == 0)
		{
			if (init_with_data(array, data))
			{
				return FALSE;
			}
		}
		else
		{
			DATA_TYPE *vPtr=(DATA_TYPE*)realloc(array->pStart, array->length + sizeof(DATA_TYPE));//拓展内存空间 1个元素大小
			array->pStart = vPtr;
			if (array->pStart != NULL)
			{
				array->pStart[array->length] = data;//赋值
				array->length += 1;//长度增加1
			}
			else
			{
				printf("Memory space expansion failed!\n");
				return FALSE;
			}
			
		}
		return TRUE;
	}
	else
	{
		printf("add_Object_Tail error!\n");
		return FALSE;
	}
}

/*
   功能:       在尾部添加一组数据
  --------------------------------------------
   参数:	  ARRAY* array        数据结构指针
			  DATA_TYPE *data     数据指针
			  int length          数据长度
*/
int add_Objects_Tail(ARRAY* array, DATA_TYPE* data, int length)
{
	if (array != NULL)
	{
		//数据为空时
		if (array->pStart == NULL || array->length == 0)
		{
			if (!init_with_array(array, data, length))
			{
				return FALSE;
			}
		}
		else
		{
			DATA_TYPE* vPtr =(DATA_TYPE*) realloc(array->pStart, (array->length + length) * sizeof(DATA_TYPE));//拓展内存空间 1组元素大小
			array->pStart = vPtr;
			if (array->pStart != NULL)
			{
				/*
			  array->pStart + array->length :起始内存地址
			  data :要拷贝的内存地址
			  sizeof(DATA_TYPE) * length :内存长度
			*/
				memcpy(array->pStart + array->length, data, sizeof(DATA_TYPE) * length);//内存拷贝
				array->length += length;//长度增加 length
			}
			else
			{
				printf("Memory space expansion failed!\n");
				return FALSE;
			}
			
		}
		return TRUE;
	}
	else
	{
		printf("add_Objects_Tail error!\n");
		return FALSE;
	}
}

/*
   功能:       根据数据查找元素,返回第一个相同元素的下标
  -------------------------------------------------------
   参数:	  ARRAY* array        数据结构指针
			  DATA_TYPE data      数据
 --------------------------------------------------------
  返回:       DATA_TYPE*         指针地址(有) 或 NULL(无)
*/
DATA_TYPE* findFirst(ARRAY* array, DATA_TYPE data)
{
	if (array == NULL || array->pStart == NULL || array->length == 0)
	{
		return NULL;
	}
	else
	{
		DATA_TYPE* vPtr = NULL;
		for (int i = 0; i < array->length; i++)
		{
			if (array->pStart[i] == data)
			{
				vPtr = &array->pStart[i];//或 vPtr=array->pStart+i;
				break;
			}
		}
		return vPtr;
	}
}

/*
   功能:       根据数据查找元素,所有相同元素
  -------------------------------------------------------
   参数:	  ARRAY* array        数据结构指针
			  DATA_TYPE data      数据
 --------------------------------------------------------
   返回:      RES                 结构体,保存所有相同元素
*/
RES findAll(ARRAY* array, DATA_TYPE data)
{
	RES res;
	res.count = 0;
	res.vPtr_Start = NULL;
	if (array == NULL || array->pStart == NULL || array->length == 0)
	{
		return res;
	}
	//统计匹配元素个数
	for (int i = 0; i < array->length; i++)
	{
		if (array->pStart[i] == data)
		{
			res.count++;
		}
	}
	//不包含直接返回
	if (res.count == 0)
	{
		return res;
	}

	//开辟内存空间
	res.vPtr_Start = malloc(sizeof(DATA_TYPE) * res.count);

	int key = 0;
	for (int i = 0; i < array->length; i++)
	{
		if (array->pStart[i] == data)
		{
			res.vPtr_Start[key++] = array->pStart + i;//指针赋值
		}
	}

	return res;
}

/*
   功能:       在指定查找到元素的前面插入一个数据
  --------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE finddata    查找的数据
			   DATA_TYPE insertdata  插入的数据
  --------------------------------------------------
   返回:     (int 类型) 0 或 1
*/
int insert_Object_Head(ARRAY* array, DATA_TYPE finddata, DATA_TYPE insertdata)
{
	if (array != NULL)
	{
		DATA_TYPE* pIndex = findFirst(array, finddata);
		if (pIndex == NULL)
		{
			printf("insert_Object_Head error! The specified data was not found.\n");
			return FALSE;
		}
		DATA_TYPE* vPtr = (DATA_TYPE*)realloc(array->pStart, (array->length +1) * sizeof(DATA_TYPE));//拓展内存空间 1个元素大小
		
		if (vPtr == NULL)
		{
			printf("insert_Object_Head error! Failed to expand memory space.\n");
			return FALSE;
		}
		else
		{
			int curr_index = pIndex - array->pStart;//指针相减获取当前查找元素的下标
			array->pStart = vPtr;
			for (int i = array->length - 1; i >= curr_index; i--)
			{
				array->pStart[i + 1] = array->pStart[i];//元素后移
			}
			
			array->pStart[curr_index] = insertdata;
			array->length += 1;
		}
		

		return TRUE;
	}
	else
	{
		printf("insert_Object_Head error! The data structure pointer is empty.\n");
		return FALSE;
	}
}

/*
   功能:       在指定查找到元素的前面插入一组数据
  --------------------------------------------------
   参数:	  ARRAY* array              数据结构指针
			  DATA_TYPE* insertdata     插入的数据指针
			  DATA_TYPE finddata        查找的数据
			  int length                数据长度
  --------------------------------------------------
   返回:     (int 类型) 0 或 1

*/
int insert_Objects_Head(ARRAY* array, DATA_TYPE finddata, DATA_TYPE* insertdata, int length)
{
	if (array != NULL)
	{
		DATA_TYPE* pIndex = findFirst(array, finddata);
		if (pIndex == NULL)
		{
			printf("insert_Object_Head error! The specified data was not found.\n");
			return FALSE;
		}
		DATA_TYPE* vPtr = (DATA_TYPE*)realloc(array->pStart, (array->length + length) * sizeof(DATA_TYPE));//拓展内存空间 1组元素大小

		if (vPtr == NULL)
		{
			printf("insert_Object_Head error! Failed to expand memory space.\n");
			return FALSE;
		}
		else
		{
			int curr_index = pIndex - array->pStart;//指针相减获取当前查找元素的下标
			array->pStart = vPtr;
			for (int i = array->length - 1; i >= curr_index; i--)
			{
				array->pStart[i + length] = array->pStart[i];//元素后移
			}

			memcpy(array->pStart + curr_index, insertdata, length * sizeof(DATA_TYPE));//拷贝内存数据
			array->length += length;
		}
		return TRUE;
	}
	else
	{
		printf("insert_Objects_Head error! The data structure pointer is empty.\n");
		return FALSE;
	}
}

/*
   功能:       删除第一个指定元素
  --------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        删除的数据
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int delete_First_Object(ARRAY* array, DATA_TYPE data)
{
	if (array != NULL||array->pStart!=NULL)
	{
		DATA_TYPE* pIndex = findFirst(array, data);
		if (pIndex == NULL)
		{
			printf("delete_First_Object error! The specified data was not found.\n");
			return FALSE;
		}

		int curr_index = pIndex - array->pStart;//指针相减获取当前查找元素的下标
		for (int i = curr_index; i < array->length - 1; i++)
		{
			array->pStart[i] = array->pStart[i + 1];//元素向前移动
		}
		DATA_TYPE* vPtr = (DATA_TYPE*)realloc(array->pStart, (array->length -1) * sizeof(DATA_TYPE));//压缩内存空间 1个元素大小
		if (vPtr != NULL)
		{
			array->pStart = vPtr;
		}
		array->length -= 1;


		return TRUE;
	}
	else
	{
		printf("delete_First_Object error! The data structure pointer is empty.\n");
		return FALSE;
	}
}

/*
   功能:       删除所有指定元素
  -------------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        删除的数据
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int delete_All_Object(ARRAY* array, DATA_TYPE data)
{
	if (array != NULL && array->pStart != NULL)
	{
		//方法1 循环删除 效率低
		/*for (DATA_TYPE* pCurr =findFirst (array, data); pCurr != NULL; pCurr = findFirst(array, data))
		{
			delete_First_Object(array, data);
		}*/

		int num = 0;
		for (int i = 0; i < array->length-1; i++)
		{
			if (array->pStart[i] == data)
			{
				num++;
				for (int j=i;j<array->length-1;j++)
				{
					array->pStart[j] = array->pStart[j + 1];
				}
			}
		}
		DATA_TYPE* vPtr = (DATA_TYPE*)realloc(array->pStart, (array->length - num) * sizeof(DATA_TYPE));//压缩内存空间 num个元素大小
		if (vPtr != NULL)
		{
			array->pStart = vPtr;
		}
		array->length -= num;


		return TRUE;
	}
	else
	{
		printf("delete_All_Object error! The data structure pointer is empty.\n");
		return FALSE;
	}
}

/*
   功能:       修改符合条件的第一个指定元素
  --------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        修改的数据
			   DATA_TYPE newData     新值
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int change_First_Object(ARRAY* array, DATA_TYPE data, DATA_TYPE newData)
{
	if (array != NULL || array->pStart != NULL)
	{
		DATA_TYPE* pIndex = findFirst(array, data);
		if (pIndex == NULL)
		{
			printf("change_First_Object error! The specified data was not found.\n");
			return FALSE;
		}

		*pIndex = newData;


		return TRUE;
	}
	else
	{
		printf("change_First_Object error! The data structure pointer is empty.\n");
		return FALSE;
	}
}

/*
   功能:       修改符合条件的所有指定元素
  -------------------------------------------------
   参数:       ARRAY* array          数据结构指针
			   DATA_TYPE data        删除的数据
				DATA_TYPE newData    新值
  --------------------------------------------------
   返回:       (int 类型)            0 或 1
*/
int change_All_Object(ARRAY* array, DATA_TYPE data, DATA_TYPE newData)
{
	if (array != NULL && array->pStart != NULL)
	{
		//指针循环
		for (DATA_TYPE* pCurr = findFirst(array, data); pCurr!=NULL; pCurr = findFirst(array, data))
		{
			*pCurr = newData;
		}
		//下标循环
		/*for (int i = 0; i < array->length - 1; i++)
		{
			if (array->pStart[i] == data)
			{
				array->pStart[i] = newData;
			}
		}*/
		
		return TRUE;
	}
	else
	{
		printf("delete_All_Object error! The data structure pointer is empty.\n");
		return FALSE;
	}
}

调用:


#include"arraytable.h"

void main()
{
	ARRAY arr;
	int data[10] = { 0,1,2,3,4,5,6,7,5,9 };
	init_with_array(&arr, data, 10);
	show(&arr);
	int a[6] = { 21,22,23,24,5,26 };
	add_Objects_Tail(&arr, a, 6);

	insert_Object_Head(&arr, 8, 88);

	show(&arr);
	//delete_First_Object(&arr, 88);
	//delete_All_Object(&arr, 5);
	change_All_Object(&arr, 5, 55);
	
	show(&arr);
	RES res = findAll(&arr, 55);
	if (res.count != 0 && res.vPtr_Start != NULL)
	{
		for (int i = 0; i < res.count; i++)
		{
			printf("%p -- %d \n", res.vPtr_Start[i], *(res.vPtr_Start[i]));
		}
	}
	system("pause");
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值