经过一段忙碌的学习,今天总算有时间将数据结构C语言代码整理一下。
总的来说,这段时间还是很有收获的,原来根本写不出来的线性存储之连续存储(数组)篇可以完全自主的写出来了。
可能还有一些不熟悉,代码的健壮性也欠考虑。但万事开头难嘛。
如果哪里有错误或者不足的地方,希望各路路过的大神多多提点意见。
ADT List{ 基本操作: InitList(&L) 操作结果:构造一个空的线性表L。 ListEmpty(L) 初始条件:线性表L已存在。 操作结果:若L为空表,则返回TRUE,否则返回FALSE。 ListInsert(&L,i,e) 初始条件:线性表L已存在。 操作结果:在L的第i个位置之前插入新的数据元素e,L的长度加1。 ListDelete(&L,i,&e) 初始条件:线性表L已存在且非空。 操作结果:删除L的第i个数据元素,并用e返回其值,L的长度增1。 }ADT List
/*
目的:构造一个动态数组InitList();
作用:可完成append(追加)、ListDlete(删除)、ListInsert(插入)、show(显示)、判断空满等功能。
*/
----参考 《郝斌数据结构自学视频》、《数据结构C语言版》(严蔚敏)
#include<stdio.h> #include<stdlib.h> #include<malloc.h> struct Arrary{ //构造一个名为Arrary的结构体 int *pBase; //首地址 int len; //最大长度 int cnt; //有效长度 }; /***********初始化数组*************/ int InitList(struct Arrary *L, int length){ L->pBase=(int *)malloc( sizeof(int) * length ); if(L->pBase==NULL){ printf("分配内存失败!\n"); } else{ L->len=length; L->cnt=0; } } /********判断是否为空**********/ bool is_empty(struct Arrary *L){ if(L->cnt==0) return 1; else return 0; } /********判断是否为满*********/ bool is_full(struct Arrary *L){ if(L->cnt==L->len) return 1; else return 0; } /*********追加操作*********/ int append(struct Arrary *L, int e){ if(is_full(L)){ printf("追加失败!\n"); exit(-1); } else{ L->pBase[L->cnt++]=e; } } /**********插入**************/ int ListInsert(struct Arrary *L, int pos, int e){ if(pos<1||pos>L->cnt){ printf("插入失败!\n"); } else{ printf("插入成功!\n"); for(int i=L->cnt-1; i>=pos-1; i--){ L->pBase[i+1]=L->pBase[i]; } L->pBase[pos-1]=e; L->cnt++; } } /**********删除***********/ bool ListDelete(struct Arrary *L, int pos, int *e){ if(pos<1||pos>L->cnt) return 0; else{ //printf("删除成功!\n"); *e=L->pBase[pos-1]; for(int i=pos; i<=L->cnt-1; i++){ L->pBase[i-1]=L->pBase[i]; } L->cnt--; return 1; } } /**********显示***********/ void show(struct Arrary *L){ if(L->cnt==0) printf("数组为空!\n"); else{ for(int i=0; i<L->cnt; ++i){ printf("%d ",L->pBase[i]); } printf("\n"); } } int main(){ struct Arrary L; int e; InitList(&L,8); append(&L,1); append(&L,2); append(&L,3); append(&L,4); append(&L,5); append(&L,6); append(&L,7); show(&L); //显示进行追加后的数组 ListInsert(&L,4,99); //插入操作 show(&L); if(ListDelete(&L,2,&e)){ //删除操作 printf("删除的元素是:---%d---\n",e); show(&L); } else printf("删除失败!\n"); //while(1); }