基于数组实现的线性表:
包含增删查改
头文件: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");
}