使用C語言封裝數組,動態實現增刪改查


myArray.h :

#pragma once    //包含的時候只包含一次
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define datatype int

struct array
{
    datatype *pstart;    //數組首地址
    int length;            //長度
    int sortstat;        //有序或者無序,0無序,1有序
};

void init(struct array *parr);                                            //初始化
void initWithData(struct array *parr, datatype data);                     //初始化並插入數據
void initWithArr(struct array *parr, datatype *pdata, int datalength);    //初始化並插入數組

void show(struct array *parr);                                            //顯示
 
datatype *findfirst(struct array *parr, datatype data);                   //查找元素,找到返回地址,沒找到返回NULL

void addobject(struct array *parr, datatype data);                        //尾部插入一個數據
void addobjects(struct array *parr, datatype *pdata,int datalength);      //尾部插入一個數組
void insertobject(struct array *parr, datatype data, datatype insertdata);                 //任意位置插入一個數據
void insertobjects(struct array *parr, datatype data, datatype *pdata, int datalength);    //任意位置插入一個數組

myArray.c :

#include "myArray.h"

//初始化
void init(struct array *parr)
{
    if (parr != NULL)
    {
        parr->pstart = NULL;
        parr->length = 0;
        parr->sortstat = 0;
    }
    else
        printf("init Error!\n");
}

//初始化並插入數據
void initWithData(struct array *parr, datatype data)
{
    if (parr != NULL)
    {
        parr->pstart = malloc(sizeof(datatype));
        *(parr->pstart) = data;                    //初始化
        parr->length = 1;
        parr->sortstat = 0;
    }
    else
        printf("initWithData Error!\n");
}

//初始化並插入數組
void initWithArr(struct array *parr, datatype *pdata, int datalength)
{
    if (parr != NULL)
    {
        parr->pstart = malloc(sizeof(datatype)*datalength);            //分配數組長度的內存
        memcpy(parr->pstart, pdata, sizeof(datatype)*datalength);    //內存拷貝
        parr->length = datalength;
        parr->sortstat = 0;
    }
    else
        printf("initWithArr Error!\n");
}


//顯示
void show(struct array *parr)
{
    if (parr == NULL || parr->pstart == NULL || parr->length == 0)
    {
        printf("沒有數據,無法打印\n");
        return;
    }
    else
    {
        printf("\n數組此時狀態:\n");
        for (int i = 0; i < parr->length; i++)
        {
            printf("%4d", parr->pstart[i]);        //打印數據
        }
    }
}

//尾部插入一個數據
void addobject(struct array *parr, datatype data)
{
    if (parr != NULL)
    {
        if (parr->pstart == NULL || parr->length == 0)
            initWithData(parr, data);
        else
        {
            parr->pstart = realloc(parr->pstart, (parr->length + 1) * sizeof(datatype));//拓展內存
            parr->length += 1;                    //長度加一
            parr->pstart[parr->length] = data;    //插入
        }
    }
    else
        printf("addobject Error!\n");
}

//尾部插入一個數組
void addobjects(struct array *parr, datatype *pdata, int datalength)
{
    if (parr != NULL)
    {
        if (parr->pstart == NULL || parr->length == 0)
            initWithArr(parr, pdata, datalength);
        else
        {
            parr->pstart = realloc(parr->pstart, (parr->length + datalength)*sizeof(datatype));//拓展內存

            memcpy(parr->pstart + parr->length, pdata, datalength * sizeof(datatype));

            parr->length += datalength;    //插入

        }
    }
    else
        printf("addobjects Error!\n");
}

//查找元素,找到返回地址,沒找到返回NULL
datatype *findfirst(struct array *parr, datatype data)
{
    if (parr == NULL || parr->pstart == NULL || parr->length == 0)
    {
        printf("沒有數據,無法查找\n");
        return NULL;
    }
    else
    {
        int *pfind = NULL;
        for (int i = 0; i < parr->length; i++)
        {
            if (parr->pstart[i] == data)
            {
                pfind = &parr->pstart[i];
                break;
            }
        }

        return pfind;
    }
}

//任意位置插入一個數據
void insertobject(struct array *parr, datatype data, datatype insertdata)
{
    if (parr != NULL)
    {
        datatype *pfind = findfirst(parr, data);
        
        if(pfind==NULL)
            printf("can not insertobject Error!\n");
        else
        {
            int cur = pfind - parr->pstart;        //指針相減確定下標
            parr->pstart = realloc(parr->pstart, (parr->length +1) * sizeof(datatype));
            
            for (int i = parr->length - 1; i >= cur; i--)
            {
                parr->pstart[i + 1] = parr->pstart[i];    //往后移動
            }

            parr->pstart[cur] = insertdata;        //插入數據
            parr->length += 1;                     //長度增加
        }

    }
    else
        printf("insertobject Error!\n");

}

//任意位置插入一個數組
void insertobjects(struct array *parr, datatype data, datatype *pdata, int datalength)
{
    if (parr != NULL)
    {
        datatype *pfind = findfirst(parr, data);

        if (pfind == NULL)
            printf("can not insertobject Error!\n");
        else
        {
            int cur = pfind - parr->pstart;        //指針相減確定下標
            parr->pstart = realloc(parr->pstart, (parr->length + datalength) * sizeof(datatype));

            for (int i = parr->length - 1; i >= cur; i--)
            {
                parr->pstart[i + datalength] = parr->pstart[i];    //往后移動
            }

            memcpy(parr->pstart + cur, pdata, datalength * sizeof(datatype));//插入數據
    
            parr->length += datalength;                    //長度增加
        }

    }
    else
        printf("insertobjects Error!\n");
}

main.c :

#include "myArray.h"

void main()
{
    struct array mydata;
    int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int b[5] = { 11,12,13,14,15 };
    int c[3] = { 21,22,23 };

    initWithArr(&mydata, a, 10);      //初始化數組
    show(&mydata);

    addobjects(&mydata, b, 5);        //尾部插入數組b
    show(&mydata);

    addobjects(&mydata, c, 3);        //尾部插入數組c
    show(&mydata);

    insertobject(&mydata, 21, 666);
    show(&mydata);

    insertobjects(&mydata, 6, c, 3);
    show(&mydata);

    system("pause");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM