C语言数据结构之动态数组

List.h

#include <stdbool.h>

typedef struct list{
    int length;
    int * data;
} List;

//初始化动态数组
void InitList(List * list);

//销毁动态数组
void DestroyList(List * list);

//查看列表是否为空
bool ListIsEmpty(const List * list);

//获取动态数组长度
int ListLength(const List * list);

//插入元素
bool insert(List * list,int data);

//获取元素
int * GetElem(const List * list,int i);

//删除元素
bool removeByIndex(List * list,int i);

/**
 * 下标是否在动态数组范围内
 * @param plist
 * @param index
 * @return
 */
bool indexInBounds(const List * plist,int index);

/**
 * 修改元素
 * @param list 修改的列表
 * @param pos 位置
 * @param data 数据
 * @return
 */
bool update(List * list,int pos,int data);

/**
 * 为每个元素应用函数
 * @param list
 * @param pfun
 */
void ListTraverse(List * list,void(*pfun)(int));

List.c

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


/**
 * 初始化动态数组
 * @param list
 */
void InitList(List * list)
{
    list->length = 0;
    list->data = NULL;
}

/**
 * 销毁动态数组
 * @param list
 */
void DestroyList(List * list)
{
    list->length = 0;
    free(list->data);
}


/**
 * 判断动态数组是否为空
 * @param list
 * @return
 */
bool ListIsEmpty(const List * list)
{
    return list->data == NULL;
}


/**
 * 获取列表长度
 * @param list
 * @return
 */
int ListLength(const List * list)
{
    if(list->data == NULL || list->length == 0)
        return 0;
    else
        return list->length;
}

//插入元素
bool insert(List * list,int data)
{
    int * array = (int *)malloc(sizeof(int)*(list->length+1));
    if(array)//如果分配成功!
    {
        int i;
        if(list->data)
        {
            for(i=0;i<list->length;i++)//拷贝数组
                array[i] = list->data[i];

            array[i] = data;
        }else{
            array[0] = data;
        }
        free(list->data);//释放原始动态数组内存
        list->data = array;
        list->length++;

        return true;
    }
    return false;
}

/**
 * 获取动态数组元素从0开始
 * @param list
 * @param i
 * @return
 */
int * GetElem(const List * list,int i)
{
    if(indexInBounds(list,i))
    {
        int * array = list->data;
        return &array[i];
    }

    return NULL;
}

/**
 * 删除元素
 * @param list
 * @param i
 * @return 返回true删除成功,返回false元素不存在或者动态数组为空!
 */
bool removeByIndex(List * list,int i)
{
    if(indexInBounds(list,i))
    {
        int * array = (int *)malloc(sizeof(int) * (list->length-1));
        if(array)
        {
            int j;
            for(j=0;j<list->length;j++)
            {
                if(j<i)
                    array[j] = list->data[j];
                else
                    array[j] = list->data[j+1];
            }

            list->length--;
            free(list->data);
            list->data = array;
        }
    }

    return false;
}

/**
 * 修改元素
 * @param list 修改的列表
 * @param pos 位置
 * @param data 数据
 * @return
 */
bool update(List * list,int pos,int data)
{
    if(indexInBounds(list,pos))
    {
        list->data[pos] = data;
        return true;
    }

    return false;
}


void ListTraverse(List * list,void(*pfun)(int))
{
    if(list->data && list->length>0)
    {
        for(int i=0;i<list->length;i++)
        {
            (*pfun)(list->data[i]);
        }
    }
}

/**
 * 下标是否在动态数组范围内
 * @param plist
 * @param index
 * @return
 */

bool indexInBounds(const List * plist,int index)
{
    if(plist->data && plist->length>0 && index >= 0 && index<plist->length)
        return true;
    else
        return false;
}


main.c

#include <stdio.h>
#include <memory.h>
#include "List.h"

#define TEXT_MAX 10

void list_print_info();
void list_test();
char * s_gets(char * st,int n);


void createList(List *pList);

void destroyList(List *pList);

void addElementToList(List *pList);

void viewAllElement(List *pList);

void printElement(int data);

void removeElement(List *pList);

void updateElement(List *pList);

void viewIndexElement(List *pList);

void list_choose();

void eatline();

int main() {


//    char st;
//    s_gets(st,1);

    list_test();


    return 0;
}

/**
 * 动态数组测试输出
 */
void list_test()
{

    list_print_info();
    list_choose();

}

void list_print_info()
{
    printf("List动态数组测试-------------------------\n");
    printf("1.初始化动态数组.\n");
    printf("2.添加元素.\n");
    printf("3.删除元素.\n");
    printf("4.修改元素.\n");
    printf("5.查看指定元素.\n");
    printf("v.查看所有元素.\n");
    printf("d.重新输出选项");
    printf("0.销毁动态数组");
    printf("q.退出.\n");
    printf("请输入选项-------------------------\n");
}

void list_choose()
{
    char ar;
    List list;

    do{
        //s_gets(&ar,1);//获取用户选项输入

        ar=getchar();
        eatline();

        switch(ar)
        {
            case '0'://销毁动态数组
                destroyList(&list);
                printf("已经销毁!\n");
                break;
            case '1'://初始化动态数组
                createList(&list);
                printf("初始化完毕!\n");
                break;
            case '2'://添加元素
                addElementToList(&list);
                break;
            case '3'://删除元素
                removeElement(&list);
                break;
            case '4'://修改元素
                updateElement(&list);
                break;
            case '5'://查看指定元素
                viewIndexElement(&list);
                break;
            case 'v'://查看所有元素
                viewAllElement(&list);
                break;
            case 'd'://重新输出选项
                list_print_info();
                break;
            case 'q'://退出
                printf("Bye!\n");
                ar = 'q';
                break;
            default:
                break;
        }
        printf("->");

    }while(ar != '\0' && ar != 'q');

}

void viewIndexElement(List *pList) {
    printf("请输入要查看元素的下标:");
    printf("->");
    int index = -1;
    if(scanf("%d",&index) == 1)
    {
        if(indexInBounds(pList,index))
        {
            printf("List[%d]->%d",index,pList->data[index]);
        }
        eatline();
    }
}


void updateElement(List *pList) {
    printf("请输入要修改元素的下标:\n");
    printf("->");
    int index = -1;
    int value;
    if(scanf("%d",&index) == 1)
    {
        eatline();
        while(getchar() != '\n')
            continue;
        if(indexInBounds(pList,index))
        {
            printf("元素当前值为:%d,要修改为:",pList->data[index]);
            printf("->");
            if(scanf("%d",&value) == 1)
            {
                update(pList,index,value);
                viewAllElement(pList);
                eatline();
            }
        }
    }


}

void removeElement(List *pList) {
    printf("请输入要删除的元素下标:\n");
    printf("->");
    int index = -1;
    scanf("%d",&index);
    while(getchar() != '\n')
        continue;
    removeByIndex(pList,index);
}

void addElementToList(List *pList) {
    printf("请输入要添加的元素,EOF表示结束\n");
    printf("->");
    int d;
    while(scanf("%d",&d)==1)
    {
        insert(pList,d);
    }
    viewAllElement(pList);
}

/**
 * 打印所有元素
 * @param pList
 */
void viewAllElement(List *pList) {
    ListTraverse(pList,printElement);
    printf("\n");
}

void printElement(int data)
{
    printf("%d ",data);
}
void destroyList(List *pList) {
    DestroyList(pList);
}

void createList(List *pList) {
    InitList(pList);
}


char * s_gets(char * st,int n)
{
    char * ret_val;
    char * find;
    ret_val = fgets(st,n,stdin);
    if(!ret_val)
    {
        find = strchr(ret_val,'\n');
        if(!find)
            *find = '\0';
        else
            while(getchar() != '\n')
                continue;
    }

    return ret_val;
}

void eatline()
{
    while(getchar()!='\n')
        continue;
}

运行截图:


  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值