用连续内存空间实现线性表

用结构体,实现了线性表初始化,删除索引的元素,查找元素,销毁线性表空间。

#include 
#include 
#define error -1
#define ok 1


typedef unsigned unit;
typedef int eleType;

//定义一个结构体,用来存线性表的属性
typedef struct {
    eleType * element;//定义一个元素类型指针
    unit length;
    unit listsize;
}arrayList;

//初始化一个线性表,给定线性表的可容纳元素的总个数
arrayList array_init(unit len){
    arrayList t; // 构造一个结构体,类型是arrayList
    //分配一块堆内存空间,用来存储线性表
    t.element=(eleType *)malloc(len* sizeof(eleType)); //element是线性表元素所在内存的指针
    t.length = 0; //初始元素个数为0
    t.listsize = len;
    return t;
};

//顺序表的输出,按顺序遍历线性表,打印出来其中的每一个元素
void print_array(arrayList t){
    printf("the array elements are:\n");
    int i;
    for (i=0;ielement != NULL){
        free(t->element);
        t->length=0;
        t->listsize=0;
    }
    return ok;
}

//删除指定位置的元素,先判定索引是否合法,如果不合法,返回错误。
// 如果合法,把指定元素删除后,i+1到length-1的索引元素往前移动一位。线性表长度-1
int locate_element_delete(arrayList *t,unit index){
    if (NULL == t)
        return error;
    if (index > t->length-1){
        printf("index out range");
        return error;
    }
    int i;
    for (i=index;ilength-1;i++){
        t->element[i]=t->element[i+1];
    }
    t->length = t->length -1;
    return ok;
}


int main()
{   arrayList t;//构造一个结构体
    t = array_init(20);//初始化结构体
    int i=0;  //往线性表里赋值
    for (i;i<10;i++){
        t.element[i]=100+i;
        t.length++;
    }
    //打印出线性表中的元素

    locate_element_delete(&t,3);
   /* int j=0;
    for (j;j
  • 删除指定元素
  • 线性表扩容
  • 在指定索引出插入元素
#define error -1
#define ok 1

//删除指定的元素值,指定的元素值可能有多个重复的元素,要遍历整个列表长度
int delete_designated_element(arrayList *t,unit elem){
    if (NULL == t){
        return error;
    }
    int index=0;
    while (index !=t->length-1){
        if (t->element[index] != elem){
            index++;
            continue;
        }
        //查找到相同的元素,从这个元素之后的所有元素往前移动一位
        //指针index不要+1,后边移位来的元素可能还是要删除的元素,但是列表的长度要-1
        int i=index;
        for (i;ilength-1;i++){
            t->element[i]=t->element[i+1];
        }
        t->length--;
    }
    return ok;
}

//线性表扩容成原来2倍
int expand(arrayList *t){
    if (NULL == t){
        return error;
    }
    t->listsize *=2;//为顺序表分配新的空间
    t->element = (eleType *)realloc(t->element,t->listsize* sizeof(eleType));
    return ok;
}

//在指定索引处插入一个元素
int element_insert(arrayList *t, int index,int elem){
    if (NULL == t)
    {
        printf("[%s %d] SqList is NULL\n", __FUNCTION__ , __LINE__);
        return error;
    }
    //判断插入的位置是否合法
    if (index > t->length)
        return error;

    //判断顺序表是否满了,如果满了则扩容
    if (t->length == t->listsize)
    {
        expand(&t);
    }
    int i=0;
    for (i;ilength-index;i++){
        //从最后一个元素开始,往后移动一位
        t->element[t->length-i]=t->element[t->length-i-1];
    }
    t->element[index] = elem;
    t->length++;
    return ok;
}

你可能感兴趣的:(数据结构,算法,链表,c++,c语言)