数据结构之动态顺序表(C实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之动态顺序表(C实现)相关的知识,希望对你有一定的参考价值。

  线性表有2种,分为顺序表和链表。
  顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定)
  链表: 有3种,单链表、双向链表、循环链表(长度不固定)

seqList.h
#ifndef SEQLIST_H
#define SEQLIST_H

#include <stdio.h>
#include <malloc.h>

typedef enum
{
    OK=0, //正确
    ERROR=1,   //出错
    TRUE=2,  //为真
    FALSE=3   //为假
}status;

typedef int ElemType;   //宏定义队列的数据类型

#define initSize    20  //线性表存储空间的初始大小

//顺序表的结构
typedef struct
{
    //静态顺序表:使用动态分配的指针方式
    ElemType *data; //顺序表的数据元素指针,指向存放数据元素存储空间的基地址
    int length; //顺序表的长度
    int maxSize;    //顺序表的最大容量
}seqList;

//创建顺序表   pSeqList-顺序表对象指针  elemSize-线性表的初始存储容量
status initList(seqList *pSeqList,int elemSize);

//销毁顺序表
void destroyList(seqList *pSeqList);

//清空顺序表: 将长度清零即可
status clearList(seqList *pSeqList);

//判断顺序表是否为空
status isEmpityList(seqList *pSeqList);

//在第i个位置上插入新元素,即在当前线性表的第i-1和第i个元素之间插入
//将原先的第i个元素以及后面所有元素都后移一个位置
status enList(seqList *pSeqList, int i, ElemType element);

//删除元素,即将位置为i的元素删除,从i+1开始及以后的元素后移
status deList(seqList *pSeqList,int i,ElemType *element);

//遍历队列
void listTraverse(seqList *pSeqList);

#endif // SEQLIST_H

seqList.c
#include "seqlist.h"

/*********************************************
 * 线性表有2种,分为顺序表和链表。
 * 顺序表: 采用顺序存储方式,在一组地址连续的存储空间上存储数据元素的线性表(长度固定)
 * 链表: 有3种,单链表、双向链表、循环链表(长度不固定)
 *********************************************/

 //创建顺序表   pSeqList-顺序表对象指针  elemSize-线性表的初始存储容量
status initList(seqList *pSeqList,int elemSize)
{
    //给顺序表的
    pSeqList->data = (ElemType *)malloc(sizeof(ElemType)*elemSize);
    if(!pSeqList->data)
    {
        printf("pSeqList->data malloc error!\n");
        return ERROR;
    }

    pSeqList->length = 0;   //最开始,顺序表的元素个数为0,即长度为0
    pSeqList->maxSize = elemSize;

    return OK;
}

//销毁顺序表
void destroyList(seqList *pSeqList)
{
    free(pSeqList->data);
    pSeqList->data = NULL;
}

//清空顺序表: 将长度清零即可
status clearList(seqList *pSeqList)
{
    if(!pSeqList->data) //检验顺序表的数据元素指针是否为空
    {
        pSeqList->length = 0; //将长度清零
    }

    return OK;
}

//判断顺序表是否为空
status isEmpityList(seqList *pSeqList)
{
    if(pSeqList->length==0)
        return TRUE;

    return FALSE;
}

//在第i个位置上插入新元素,即在当前线性表的第i-1和第i个元素之间插入
//将原先的第i个元素以及后面所有元素都后移一个位置 (i=0,即删除第一个元素)
status enList(seqList *pSeqList,int i,ElemType element)
{
    int len = pSeqList->length; //获得线性表的长度

    //i的范围限制为0-len+1(原先长度为len,现在为len+1)
    if(i<0 || i>len+1)
    {
        printf("i is false!\n");
        return ERROR;
    }

    //将原先的第i个元素以及后面所有元素都后移一个位置
    for(int j=len-1;j>=i;j--)
    {
        pSeqList->data[j+1] = pSeqList->data[j];
    }

    pSeqList->data[i] = element;    //在i的位置上,下标为i-1,插入新元素element
    pSeqList->length++; //线性表的长度+1

    return OK;
}

//删除元素,即将位置为i的元素删除,从i+1开始及以后的元素后移
status deList(seqList *pSeqList,int i,ElemType *element)
{
    int len = pSeqList->length; //获得线性表的长度

    //i的范围限制为0-len+1(原先长度为len,现在为len+1)
    if(i<0 || i>len+1)
    {
        printf("i is false!\n");
        return ERROR;
    }

    *element = pSeqList->data[i];

    //将被删元素之后的元素逐个前移
    for(int j=i+1;j<len;j++)
    {
        pSeqList->data[j-1] = pSeqList->data[j];
    }

   pSeqList->length--; //线性表的长度-1

    return OK;
}

//遍历队列
void listTraverse(seqList *pSeqList)
{
    //如果队列为空
    if(isEmpityList(pSeqList)==TRUE)
    {
        printf("\nqueue is NULL!\n");
    }

    printf("listTraverse: ");
    for(int i=0;i<pSeqList->length;i++)
    {
        printf("%d  ", pSeqList->data[i]);
    }
    printf("\n");
}

main.c
/*********************************************
 * C实现顺序表   2017/10/26   by nieXianFeng
 *********************************************/
#include <stdio.h>
#include "seqlist.h"

int main()
{
    int value;          //用于保存删除的元素

    seqList *pSeqList = (seqList*)malloc(sizeof(seqList));
    if(!pSeqList) //检测是否申请失败
    {
        printf("pSeqList malloc error!\n");
        return -1;
    }

    //调用初始化队列的函数
    initList(pSeqList,initSize);
    //调用出队函数
    enList(pSeqList,0,1);
    enList(pSeqList,1,2);
    enList(pSeqList,2,3);
    //调用遍历队列的函数
    listTraverse(pSeqList);

    //调用出队函数
    if(deList(pSeqList,1,&value)==OK)
    {
        printf("出队一次,元素为:%d\n", value);
    }
    //调用遍历队列的函数
    listTraverse(pSeqList);

    return 0;
}

以上是关于数据结构之动态顺序表(C实现)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构初阶:动态顺序表的功能实现(用C语言实现,附图分析)

数据结构之动态顺序表(含游戏菜单)

数据结构顺序表—纯C实现顺序表

C语言顺序表的动态存储:增删改查的实现

数据结构顺序表(实现+详解+源码+通讯录项目(静态+动态+文件保存))

数据结构之单链表