C语言实现动态链表结构

类似java中的ArrayList 实现一个长度变化的数组结构体,嗯,实现起来很简单,重要的是数组长度的增加的处理,数组中插入数据的元素移动以及删除时候的元素移动;
定义结构体

typedef struct ArrayList{
    int allLen; //数组总长度
    int nowlen;//数组现在的元素个数
    int * list;
}array;

然后是数组增删的算法:

/*
 * arrayList.c
 *
 *  Created on: 2017-9-14
 *      Author: Administrator
 *      建立一个动态存储数字的数组
 *      根据存储大小动态增加数组长度 关键是数组的赋值程序 和增量程序
 */
#include<stdio.h>
#include<stdlib.h>
#include"testhead.h"

void arrayTest() {
    array * arr = malloc(sizeof(array));
    arr->allLen = 5;
    arr->nowlen = 0;
    arr->list = malloc(5 * sizeof(int));
    insertEnd(arr, 1);
    insertEnd(arr, 2);
    insertEnd(arr, 3);
    insertEnd(arr, 4);
    insertEnd(arr, 6);
    insertEnd(arr, 7);
    deleIndex(5,arr);
    showArray(arr);
//  printf("%d",arr->allLen);

}
//无法遍历出没有赋予初始值的数组
void showArray(array* arr) {
    int i, j;
    int * list = arr->list;
    j = arr->nowlen;
    if (arr->nowlen == 0) {
        printf("there have no value");
        return;
    }
    for (i = 0; i < j; i++) {
        printf("the index%d is %d\n ", i, *(list + i));
    }

}
//插入第一个
void push(array*arr, int value) {
    insertIndex(0, arr, value);

}
//删除并弹出第一个
int pop(array*arr) {

    return deleIndex(0,arr);
}
//根据下标进行插入
void insertIndex(int index, array* arr, int value) {
    int * lt = arr->list;
    if (index > arr->allLen - 1) {
        //插入下标大于当前长度  应该返回错误,不过无所谓 也可以这么写,实际影响了删除
        int * newarry = malloc((index + 5) * sizeof(int));
        arr->allLen = index + 5;
        int i;
        for (i = 0; i < arr->nowlen; i++) {
            newarry[i] = lt[i];
        }
        newarry[index] = value;
        arr->nowlen += 1;
        arr->list = newarry;
        free(lt);

    } else {
        if (arr->nowlen < arr->allLen) {
            //所有index 大于index 这个值的,往后移动,首先从后面进行移动
            int i;
            for (i = arr->nowlen; i > -1; i--) {
                if (i >= index) {
                    lt[i + 1] = lt[i];
                }
            }
            arr->nowlen += 1;
            lt[index] = value;
        } else if (arr->nowlen == arr->allLen) {
            arr->allLen += 5;
            int * newArray = (int*) malloc((arr->allLen) * sizeof(int));
            int j;
            for (j = 0; j < arr->nowlen; j++) {
                if (j < index) {
                    newArray[j] = lt[j];
                } else {
                    newArray[index] = value;
                    newArray[j + 1] = lt[j];
                }

            }
//       int i;
//       for(i=arr->nowlen;i>-1;i--){
//         if(i>=index){
//             newArray[i+1]=newArray[i];
//         }
//       }
//       newArray[index]=value;
            arr->nowlen += 1;
            arr->list = newArray;
            free(lt);

        } else {
            printf("wrong");
        }
    }

}
//结尾进行插入
void insertEnd(array*arr, int value) {
    int i, j;
    int * lt;
    i = arr->allLen;
    j = arr->nowlen;
    lt = arr->list;
    if (j < i) {
        //当前量小于总量
        arr->nowlen += 1;
        lt[j] = value;

    } else if (j == i) {
        //数组满了的情况 对数组进行增加容量,然后复制值, 然后改变指针,然后回收之前的数组
        arr->allLen = i + 5;
        arr->nowlen += 1;
        int * newArray = (int*) malloc((i + 5) * sizeof(int));//每次增加5个byte
        int k;
        for (k = 0; k < j; k++) {
            newArray[k] = lt[k];
        }
        newArray[i] = value;
        arr->list = newArray;
        free(lt);
    } else {
        printf("wrong");
    }

}

//根据下标进行删除  删除之后,
int deleIndex(int index, array*arr) {
    if (index > arr->nowlen - 1) {
        //删除大于当前长度时候直接报错
        printf("wrong,with no this value");
        return -1;
    } else {
        int i;
        int value = arr->list[index];
        //直接通过赋值将之前的值覆盖
        for (i = index; i < arr->nowlen; i++) {
            arr->list[i] = arr->list[i + 1];
        }
        arr->nowlen-=1;
        return value;
    }

    return -1;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值