经过一段忙碌的学习,今天总算有时间将数据结构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);
}