线性表之连续存储(数组)

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值