第3章——表、栈和队列

来源:互联网 发布:linux修改ftp用户密码 编辑:程序博客网 时间:2024/05/22 02:02

一、表

1、线性表的实现

(1)顺序表

顺序表:用一组地址连续的存储单元来依次存储线性表中的数据元素;
顺序表是一种随机存储结构;
顺序表根据存储分配方式可分为:静态顺序表和动态顺序表;

a、静态顺序表:

静态顺序表的定义:

#define max 100//理论最大长度 typedef struct{ElemType data[max];//线性表中的元素将依次存储在一维数组data中。ElemType可以代表任何一种数据类型,这么做的目的是便于维护和代码重用(可用define对其进行任意改动); int len;//此成员将依次记录线性表的当前长度; }SqList;//SqList是类型名,可以利用它定义相应变量(如SqList L;);

静态表的创建:

//线性表的创建:创建成功返回0,否则返回-1int CreatList(SqList *L){int i;printf("Please input the length of the list which you want to creat :\n");scanf("%d",&(*L).len));if((*L).len>max)return -1;for(i=1;i<(*L).len;i++){printf("Please input NO.%d element :\n",i);scanf("%d",&(*L).data[i-1]);//i-1是为了保证数组下标和数据位序保持统一 }return 0;}

静态表的插入:

 //插入运算:在线性表指定位置i上插入元素e int ListInsert(SqList *L,int i,ElemType e) { int j; if(i<1||i>(*L).len+1) //由于i值不合理,无法插入  return -1; if(ListFull(*L)==1)//线性表已满  return -2; for(j=(*L).len-1;j>=i-1;j--) (*L).data[j+1]=(*L).data[j];//从第i个元素起向后平移一位 (*L).data[i-1]=e;(*L).len++;return 0;} 

b、动态顺序表:

动态顺序表定义:

typedef struct{ElemType *data;//线性表中的数据元素将依次存放在data指示的存储空间中 int len;//记录线性表当前长度 int listsize;//记录线性表分配的存储空间大小 }SqList;


先定义 SqList L;

通过 L.data=(ElemType*)malloc(L.listsize *sizeof(ElemType));

不要忘了 L.data所指示的存储空间使用完后用free(L.data);进行释放,以免造成内存泄漏

#define INITSIZE 30 //表示动态分配空间的初始大小 
#define INCSIZE 20 //表示动态分配空间的增量

初始化时,先为其分配一个容量为 L.listsize=INITSIZE的存储空间,在运行中若已满,可通过调用 realloc库函数为顺序表重新分配一个大小为 L.listsize=L.listsize+INCSIZE的存储空间 。

假设typedef int ElemType

初始化运算:初始化一个空的线性表L,若初始化成功返回0,否则返回 -1

int InitList(SqList *L){(*L).data=(ElemType*)malloc(sizeof(ElemType)*INITSIZE);//为其动态分配一个大小为INITSIZE的存储空间 if((*L).data==0)return -1;(*L).len=0;//当前长度为0,实现线性表为空 (*L).listsize=INITSIZE;return 0; }

线性表的创建:

int CreateList(SqList *L){int i;printf("Please input the length of the list which you want to create:\n");scanf("%d",&((*L).len));//进行判断,若长度大于初始存储空间大小,那么重新申请一个更大的存储空间 if((*L).len>(*L).listsize){(*L).listsize=(*L).len+INCSIZE;free((*L).data);(*L).data=(ElemType*)malloc(sizeof(ElemType)*(*L).listsize);if((*L).data)return -1; }for(i=1;i<=(*L).len;i++){printf("Please input NO.%d element:\n",i);scanf("%d",&((*L).data[i-1]));} return 0;} 

线性表的插入:在指定位置 i上插入元素 e:

int ListInsert(SqList *L,int i,ElemType e) {int j;if(i<1||i>(*L).len+1) return -1;if(L.len==L.listsize)//若已满则分配一个更大的存储空间 {(*L).listsize=(*L).len+INCSIZE;(*L).data=(ElemType*)ralloc((*L).data,sizeof(ElemType)*(*L).listsize);if((*L).data==0)return -2; }//将第 i个到最后一个元素一起向后平移for(j=(*L).len-1;j>=i-1;j--)(*L).data[j+1]=(*L).data[j];(*L).data[i-1]=e;//在第 i个位置上存放新的元素 e(*L).len++;return 0; }

线性表的删除:删除指定位置 i上的元素,并用变量 e返回被删除的元素

int ListDelete(SqList *L,int i,ElemType *e){int j;if(i<1||i>(*L).len) return -1;if(L.len==0)return -2;*e=(*L).data[i-1];for(j=1;j<=(*L).len-1;j++)(*L).data[j-1]=(*L).data[j];(*L).len--;return 0;}  

因为动态顺序表中用来存储数据的存储空间是动态分配的,为了防止内存泄漏,增加撤销运算;

撤销运算:动态顺序表使用完后要回收其用于存储线性表的存储空间

void DestroyList(SqList *L){free((*L).data);(*L).data=null;(*L).len=0;(*L).listsize=0;} 








原创粉丝点击