顺序表

作者: 郑明明 | 来源:发表于2016-07-01 15:55 被阅读89次
直接上代码:
#include <stdio.h>
#include <stdlib.h>

#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1

typedef int Status;
typedef int ElementType;
typedef struct
{
    ElementType *base;// 顺序表的起始地址
    int length;// 当前的长度
    int listSize;// 初始化时制定的长度
} SequentialList;

// 创建顺序表
void initList(int initLength, SequentialList *list) {
    list->length = 0;
    list->listSize = initLength;
    list->base = (ElementType *)malloc(list->listSize * sizeof(ElementType));// 分配这个存储空间(不像Java中直接使用数组来写,C语言写的话更加能理解工作机制)
}

// 判断是否为空
_Bool listEmpty(SequentialList *list) {// 使用的是_Bool而不是bool
    return list->length == 0;
}

// 返回顺序表的当前长度
int listLength (SequentialList *list) {
    return list->length;
}

// 得到指定位置的值
ElementType listGetElement(SequentialList *list, int index) {
    if (index < 1 || index > (list->length+1)) {
        printf("不存在这个位置");
        return ERROR;
    }
    return list->base[index-1];
}

// 得到指定值的位置
int listGetIndex(SequentialList *list, ElementType element) {
    for (int i = 0; i < list->length; i++) {
        if(list->base[i] == element) {
            return i+1;
        }
    }
    return ERROR;
}

// 插入元素
Status listInsert(SequentialList *list, int index, ElementType element) {
    if (list->length == list->listSize) {
        printf("已经满了,不能再插入");
        return ERROR;
    } else if (index<1 || index>(list->length + 1)) {// 这里的index是面向用户的,所以和数组中的序号相差一位
        printf("插入的位置不对");
        return ERROR;
    }
    // 插入的算法
    for (int i = (list->length - 1); i >= (index-1); i--) {
        list->base[i+1] = list->base[i];
    }
    list->base[index-1] = element;
    list->length++;
    return OK;
}

// 删除元素
Status listDelete(SequentialList *list, int index) {
    if (index<1 || index>(list->length+1)) {
        printf("删除的序号不对");
        return ERROR;
    }
    
    for (int i = index-1; i < list->length; i++) {
        list->base[i] = list->base[i+1];
    }
    list->length--;
    return OK;
}

// 遍历打印顺序表
void listTraverse(SequentialList *list) {
    for(int i = 0; i < list->length; i++) {
        printf("%d ", list->base[i]);
    }
    printf("\n");
}

// 将顺序表清空
void listClear(SequentialList *list) {
    list->length = 0;
}

// 销毁顺序表
Status listDestroy(SequentialList *list) {
    listClear(list);// 先清空数组
    list->listSize = 0;// 将初始长度设置为0
    free(list->base);// 释放malloc出的空间
    if (list->base == NULL && list->length == 0 && list->listSize == 0) {// 最后的确认
        return OK;
    } else {
        return ERROR;
    }
}

int main(int argc, const char * argv[]) {
    /*
    SequentialList list;
    initList(100, &list);// 初始化
    listInsert(&list, 1, 1);// 插入
    listInsert(&list, 2, 2);
    listInsert(&list, 3, 3);
    listInsert(&list, 4, 4);
    listTraverse(&list);
    
    listInsert(&list, 2, 200);
    listTraverse(&list);
    
    listDelete(&list, 2);
    listDelete(&list, 2);
    listTraverse(&list);
    
    printf("%d\n",listGetElement(&list, 2));
    
    printf("%d\n",listGetIndex(&list, 3));
     */
    return 0;
}

相关文章

  • 数据结构与算法(二,线性表的顺序存储结构,穷举法(冒泡和选择排序

    线性表 顺序表 顺序表的特性 顺序表的元素有前驱和后继 顺序表有size 顺序表的增删改查 顺序表的优缺点优点:尾...

  • 顺序表-动态顺序表

    顺序表是逻辑上相邻的元素物理也相邻的。 静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时...

  • 顺序表-静态顺序表

    线性表,全名为线性存储结构。将具有“一对一”关系的数据“线性”地存储到物理空间中,这种存储结构就称为线性存储结构(...

  • 线性表之顺序存储-顺序表

    顺序表的操作 [x] 向有序顺序表插入一个元素 [x] 顺序表的冒泡排序 [x] 顺序表的删除操作 [x] 顺序表...

  • 数据结构之线性表

    1、线性表-顺序表线性表-顺序表

  • 线性表-顺序表与单链表

    顺序表 线性表的顺序存储,是逻辑相邻,物理存储地址也相邻。 结构定义 顺序表的初始化 顺序表的插入 顺序表的取值 ...

  • 顺序表和链表的区别

    参考:线性表和链表的区别 注:参考文中的‘线性表’准确的说应该是’顺序表‘,链表与顺序表都是线性表。 顺序表:顺序...

  • 快速理解数据结构中链表

    组织数据作用的线性表分为顺序表和链表 顺序表:平常所使用的各类数组均为顺序表,即存储逻辑顺序和物理顺序相同。较常见...

  • 顺序表

    在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传...

  • 顺序表

    https://blog.csdn.net/qq_41943578/article/details/82934644

网友评论

      本文标题:顺序表

      本文链接:https://www.haomeiwen.com/subject/qmofjttx.html