自己用C语言结构体实现一个数组结构(增删查改)

myarray.h

#pragma once
#include<stdlib.h>
#include<stdio.h>
typedef int datatype;
typedef struct myarray
{
	datatype *data;
	int length;
}array;

struct Res//创建一个新的结构体用来存储二级指针(用来存储返回查找到的重复元素)
{
	datatype **ppstart;//创建指针数组
	int n;

};

struct Res findall(array *pstart, datatype data);


void init(array *pstart);
void initwithdata(array *pstart, datatype data);
void initwitharray(array *pstart, datatype *data, int datalength);
void show(array *pstart);
void addwithdata(array *pstart, datatype data);
void addwitharray(array *pstart, datatype *data, int datalength);
datatype *findfirst(array *pstart, datatype data);
void deletedata(array *pstart, datatype data);
void deletealldata(array *pstart, datatype data);
void changedata(array *pstart, datatype data, datatype newdata);
void changealldata(array *pstart, datatype data, datatype newdata);
void insertdata(array *pstart, datatype data,datatype newdata);
void insertarray(array *pstart, datatype data, datatype *newdata, int insertlength);

myarray.c

#include "myarray.h"


struct Res findall(array *pstart, datatype data)
{	
	struct Res res;
	res.n = 0;
	for (int i = 0; i < pstart->length; i++)
	{
		if (pstart->data[i]==data)
		{
			res.n++;
		}

	}
	res.ppstart = malloc(sizeof(datatype *)*res.n);
	int j = 0;
	for (int i = 0; i < pstart->length; i++)
	{
		if (pstart->data[i]==data)
		{
			res.ppstart[j++] = pstart->data + i;

		}

	}
	return res;


}
void init(array *pstart)
{
	if (pstart!=NULL)
	{
		pstart->data = NULL;
		pstart->length = 0;
		

	}
	else
	{
		printf("init error");
	}
	

}
void initwithdata(array *pstart, datatype data)
{
	if (pstart!=NULL)
	{
		if (pstart->data==NULL||pstart->length==0&&data!=NULL)
		{
			pstart->data = malloc(sizeof(datatype));
			*(pstart->data) = data;
			pstart->length++;


		}
		else
		{
			printf("initwithdata error\n");
		}

	}
	else
	{
		printf("initwithdata error\n");
	}

}
void initwitharray(array *pstart, datatype *data, int datalength)
{
	if (pstart!=NULL)
	{
		if (pstart->data==NULL||pstart->length==0&&data!=NULL)
		{
			pstart->data = malloc(sizeof(datatype)*datalength);
			for (int i = 0; i < datalength; i++)
			{
				pstart->data[i] = data[i];
			}

			pstart->length += datalength;

		}
		else
		{
			printf("initwitharray error\n");
		}

	}
	else
	{
		printf("initwitharray error\n");
	}

}

void show(array *pstart)
{	
	printf("数组内情况:");
	if (pstart!=NULL)
	{
		for (int i = 0; i < pstart->length; i++)
		{
			printf("%4d", pstart->data[i]);
		}
		printf("\n");

	}
	else
	{
		printf("没有数据\n");
	}

}

void addwithdata(array *pstart, datatype data)
{
	if (pstart!=NULL)
	{
		if (pstart->data!=NULL||pstart->length!=0)
		{
			pstart->data = realloc(pstart->data, (pstart->length + 1) * sizeof(datatype));
			(pstart->data)[pstart->length] = data;
			pstart->length++;

		}
		else
		{
			init(pstart);
			initwithdata(pstart, data);
		}

	}
	else
	{
		printf("addwithdata error");
	}

}
void addwitharray(array *pstart, datatype *data, int datalength)
{
	if (pstart!=NULL)
	{
		if (pstart->data!=NULL||pstart->length!=0)
		{
			pstart->data = realloc(pstart->data, (pstart->length + datalength) * sizeof(datatype));
			datatype *temp=(pstart->data) + (pstart->length);
			for (size_t i = 0; i < datalength; i++)
			{
				*(temp + i) = data[i];

			}
			pstart->length += datalength;

		}
		else
		{
			init(pstart);
			initwitharray(pstart, data, datalength);
		}


	}
	else
	{
		printf("addwitharray error");
	}

}
void changealldata(array *pstart, datatype data, datatype newdata)
{
	if (pstart!=NULL)
	{
		datatype *pfind = findfirst(pstart, data);
		if (pfind==NULL)
		{
			printf("没有数据改什么该");

		}
		else
		{
			for (datatype *p=pfind; p!=NULL;p=findfirst(pstart,data))
			{
				changedata(pstart, data,newdata);
			}
		}

	}
	else
	{
		printf("changealldata error");
	}



}

void changedata(array *pstart, datatype data,datatype newdata)
{
	if (pstart!=NULL)
	{
		datatype *pfind = findfirst(pstart, data);
		if (pfind==NULL)
		{
			printf("没有找到要更改的数据");

		}
		else
		{
			int curr = pfind - pstart->data;
			pstart->data[curr] = newdata;
			
		}

	}
	else
	{
		printf("changedata error");
	}



}

void deletedata(array *pstart, datatype data)
{
	if (pstart!=NULL)
	{
		datatype *pfind = findfirst(pstart, data);
		if (pfind==NULL)
		{
			printf("没找到,怎么删除");
		}
		else
		{
			int curr = pfind - (pstart->data); //地址(指针)相减等于下标


			for (int i = curr; i < pstart->length - 1; i++)
			{
				pstart->data[i] = pstart->data[i + 1];
			}
			pstart->length-=1;
			pstart->data = realloc(pstart->data, (pstart->length) * sizeof(datatype));


		}
		
		
		

	}
	else
	{
		printf("deletedata error");
	}

}

void deletealldata(array *pstart, datatype data)
{
	if (pstart!=NULL)
	{
		datatype *pfind = findfirst(pstart, data);
		if (pfind==NULL)
		{
			printf("没有数据删除个鬼");
			

		}
		else
		{
			for (datatype *p=pfind; p!=NULL; p=findfirst(pstart,data))
			{
				deletedata(pstart, data);
			}
		}
	}
	else
	{
		printf("deletealldata errors");
	}

}

datatype *findfirst(array *pstart, datatype data)
{
	if (pstart!=NULL)
	{
		if (pstart->data!=NULL||pstart->length!=0)
		{
			for (int i = 0; i < pstart->length; i++)
			{
				if (pstart->data[i]==data)
				{
					return pstart->data + i;

				}

			}
			return NULL;

		}
		else
		{
			return NULL;
		}

	}
	else
	{
		return NULL;
	}


}

void insertarray(array *pstart, datatype data, datatype *newdata, int insertlength)
{
	if (pstart!=NULL)
	{
		datatype *pfind = findfirst(pstart, data);
		if (pfind==NULL)
		{
			printf("找不到怎么插入");

		}
		else
		{
			int curr = pfind - pstart->data;
			pstart->data = realloc(pstart->data, sizeof(datatype)*(pstart->length + insertlength));
			for (int i = pstart->length; i >curr; i--)
			{
				pstart->data[i + insertlength - 1] = pstart->data[i - 1];

			}
			for (int i = 0; i < insertlength; i++)
			{
				pstart->data[i + curr] = newdata[i];
			}
			pstart->length += insertlength;
		}

	}
	else
	{
		printf("insertarray error");
	}


}
void insertdata(array *pstart, datatype data, datatype newdata)
{
	if (pstart!=NULL)
	{
		datatype *pfind = findfirst(pstart, data);
		if (pfind==NULL)
		{
			printf("没找到怎么插入??");

		}
		else
		{
			int curr = pfind - pstart->data;
			pstart->data = realloc(pstart->data, (pstart->length + 1) * sizeof(datatype)); //注意这里是给pstart->data重新分配内存而不是给整个结构体
			for (int i = pstart->length; i >curr ; i--)
			{
				pstart->data[i] = pstart->data[i - 1];
			}
			pstart->data[curr] = newdata;
			pstart->length++;
		}

	}
	else
	{
		printf("insertdata error");
	}

}
main.c
#include"myarray.h"

void main()
{
	int data = 5;
	int date[3] = { 5,2,3 };
	int a[4] = { 5,6,7,8 };
	int c[4] = { 9,10,11,12 };
	array Myarray;
	init(&Myarray);	//必须先初始化

	initwitharray(&Myarray, date, 3);
	addwithdata(&Myarray, data);
	addwitharray(&Myarray, a, 4);
	//deletealldata(&Myarray, 5);  
	//changealldata(&Myarray, 5, 4);
	//insertdata(&Myarray, 6, 9);
	//insertarray(&Myarray, 6, c, 4);
	struct Res res=findall(&Myarray, 5);
	for (int i = 0; i < res.n; i++)
	{
		printf("%p %d\n", res.ppstart[i], *res.ppstart[i]);

	}
	show(&Myarray);




	system("pause");
}

猜你喜欢

转载自blog.csdn.net/haku_yyf/article/details/79734749
今日推荐