1. 程式人生 > 其它 >C語言實現Java中的ArrayList

C語言實現Java中的ArrayList

C語言實現Java中的ArrayList

1. 定義結構體

typedef struct ArrayList
{
    int *array;
    int size;
} ArrayList;

//ArrayList中包含一個數組和一個size屬性,size用來指示array中的資料數量。

2. ArrayList初始化

void init(ArrayList *list)
{
    list->size = 0;
    list->array = NULL;
}

// 初始化,讓list的array為NULL,size為0。傳入引數為ArrayList物件
//(這裡的物件指的是ArrayList結構體,以指標的型別傳入。)

3. 新增元素

bool add(ArrayList *list, int element)
{
    if (list->size == 0)
    {
        static int arr[10];
        list->array = arr;
    }

    list->array[list->size] = element;
    list->size++;
    return True;
}
/*
新增元素:傳入ArrayList的指標和一個元素,如果list的size為0的話,讓list中的array
		指向一個真正的陣列,然後將元素按順序放到該陣列中。
*/

4. 插入元素

/* 
	在指定位置插入元素
	傳入引數:ArrayList指標,索引index,元素element
	插入方式,按照陣列插入方式,在x位置插入,則將x —— (size-1)位置的元素全部向後移動
*/
bool insert(ArrayList *list, int index, int element)
{
    if (index < 0 || index > list->size)
    {
        printf("Insert index is not defined.\n");
        return False;
    }
    if (index == list->size)
    {
        add(list, element);
        return True;
    }
    for (int i = list->size - 1; i >= index; i--)
    {
        list->array[i + 1] = list->array[i];
    }
    list->array[index] = element;
    list->size++;
    return True;
}

5. 刪除元素(按照位置)

/*
	按照索引刪除元素
	引數:ArrayList指標,索引index
*/
bool del_index(ArrayList *list, int index)
{
    if (index < 0 || index >= list->size)
    {
        printf("Del index is not defined");
        return False;
    }
    for (int i = index; i < list->size; i++)
    {
        list->array[i] = list->array[i + 1];
    }
    list->size--;
    return True;
}

6. 獲取元素索引

/*
	獲取元素位置
	引數:ArrayList指標,元素element
	返回值:找到的第一個元素的索引,如果陣列中沒有,則返回-1
*/
int get_ele(ArrayList *list, int element)
{
    int flag = 0;
    for (int i = 0; i < list->size; i++)
    {
        if (list->array[i] == element)
        {
            flag = 1;
            return i;
        }
    }
    if (!flag)
    {
        return -1;
    }
}

7. 刪除元素(按照元素)

/*
	刪除ArrayList中出現的所有該元素
	引數:ArrayList指標,元素element
	
	使用遞迴方式,如果獲取該元素位置為-1,則跳出遞迴,否則,通過索引刪除(獲取元素位置)
	即:del_index(list,get(element));
*/

bool del_ele(ArrayList *list, int element)
{
    if (get_ele(list, element) == -1)
    {
        return True;
    }
    del_index(list, get_ele(list, element));
    del_ele(list, element);
}

8. 按索引獲取元素

/*
	獲取該索引上的元素
	引數:ArrayList指標,索引index
*/

int get(ArrayList *list, int index)
{
    return list->array[index];
}

9. 列印ArrayList

/*
	列印傳入的ArrayList中的所有元素。
	引數:ArrayList指標
*/

void print_list(ArrayList *list)
{
    if (list->size == 0)
    {
        printf("size:%d\n", list->size);
        return;
    }
    int n = 0;
    printf("\n--------------\n");
    for (int i = 0; i < list->size; i++)
    {
        n++;
        printf("%d\t", *(list->array++));
        if (n % 10 == 0)
        {
            printf("\n");
        }
    }
    printf("\n---------------\nsize:%d", list->size);
}

總結:

#include <stdio.h>
#include <stdlib.h>

#define True 1
#define False 0

typedef int bool;


typedef struct ArrayList
{
    int *array;
    int size;
} ArrayList;

void init(ArrayList *list)
{
    list->size = 0;
    list->array = NULL;
}

bool add(ArrayList *list, int element)
{
    if (list->size == 0)
    {
        static int arr[10];
        list->array = arr;
    }

    list->array[list->size] = element;
    list->size++;
    return True;
}

bool insert(ArrayList *list, int index, int element)
{
    if (index < 0 || index > list->size)
    {
        printf("Insert index is not defined.\n");
        return False;
    }
    if (index == list->size)
    {
        add(list, element);
        return True;
    }
    for (int i = list->size - 1; i >= index; i--)
    {
        list->array[i + 1] = list->array[i];
    }
    list->array[index] = element;
    list->size++;
    return True;
}

bool del_index(ArrayList *list, int index)
{
    if (index < 0 || index >= list->size)
    {
        printf("Del index is not defined");
        return False;
    }
    for (int i = index; i < list->size; i++)
    {
        list->array[i] = list->array[i + 1];
    }
    list->size--;
    return True;
}

int get_ele(ArrayList *list, int element)
{
    int flag = 0;
    for (int i = 0; i < list->size; i++)
    {
        if (list->array[i] == element)
        {
            flag = 1;
            return i;
        }
    }
    if (!flag)
    {
        return -1;
    }
}

bool del_ele(ArrayList *list, int element)
{
    if (get_ele(list, element) == -1)
    {
        return True;
    }

    del_index(list, get_ele(list, element));
    // for (int i = 0; i < list->size; i++)
    // {
    //     if (list->array[i] == element)
    //     {
    //         del_index(list, i);
    //         break;
    //     }
    // }
    del_ele(list, element);
}

int get(ArrayList *list, int index)
{
    return list->array[index];
}

void print_list(ArrayList *list)
{
    if (list->size == 0)
    {
        printf("size:%d\n", list->size);
        return;
    }
    int n = 0;
    printf("\n--------------\n");
    for (int i = 0; i < list->size; i++)
    {
        n++;
        printf("%d\t", *(list->array++));
        if (n % 10 == 0)
        {
            printf("\n");
        }
    }
    printf("\n---------------\nsize:%d", list->size);
}