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");
}