数据结构之动态顺序表(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语言实现,附图分析)