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

1.数据结构中的数据类型?

我总结了一下,数据结构将现实生活中的类型分为两类,一类是线性结构(也叫线性表)还有一类是非线性结构。


2.什么是线性结构和非线性结构?

线性结构,顾名思义,就是像线一样的结构,数据元素在逻辑上一个连着一个,可以通过当前的位置找到下一个,甚至是之后的所有位置的元素。


非线性结构:和线性结构相反,用这种结构存储的数据元素在逻辑上是不连续的,也就是无法通过当前位置找到下一个元素。


3.线性结构的两个分类?
线性结构分为数组和链表:
1º首先数组大家肯定都用过,底层封装了很多事先定义好的代码可供使用。它的结构也是显而易见的,1)它不仅在逻辑上是连续的,在物理上也是连续的,一个接着一个.2)我定义一个数组,必须事先给他分配好几个长度的内存空间。(静态存储)

2º1)链表只是在逻辑上市连续的(满足线性结构),但是在物理上它并不是连续,它可以通过每个节点的指针找到下一个元素。2)定义链表的同时,并不需要事先分配好内存空间可以在程序运行的时候分配内存(动态存储)。

总结:假如要存储班级的人数,有可能每个班级的人数不一样,这个时候如果用数组存储,你必须事先定义好数组的长度,但由于班级人数不一样,你必须根据最大的班级数定义长度这样就会造成空间浪费,这种事先分配长度的静态存储很不好。这个时候可以选择链表(动态存储)。

4.数组常用方法实现

这里我是用C语言实现的。java等也可以,但是最好不要用。

//反转数组元素

void inversion_arr(pArr arr);

//升序排序

void sort_arr(pArr arr);

//获得指定下标的元素

int get(pArr arr,int pos);

//修改指定下标的元素

bool update_arr(pArr arr,int pos,int val);

//删除指定下标的元素

bool delete_arr(pArr arr,int pos,int *val);

//向指定下标插入一个数

bool insert_arr(pArr arr,int pos,int val);

//追加数组一个元素

bool append_arr(pArr arr,int val);

//初始化数组

void init_arr(pArr arr,int len);

//显示数组的相关信息

void show_arr(pArr arr);

//判断数组是否为空

bool is_empty(pArr arr);

//判断数组是否已满

bool is_full(pArr arr);

//测试数据结构中线性表中的顺序表
 #include 
 #include 
 #include  
 typedef struct Arr{
 	int *pBase;
 	int length;
 	int cnt;
 }*pArr; //pArr=struct Arr *
 void inversion_arr(pArr arr);
 void sort_arr(pArr arr);
 int get(pArr arr,int pos);
 bool update_arr(pArr arr,int pos,int val);
 bool delete_arr(pArr arr,int pos,int *val);
 bool insert_arr(pArr arr,int pos,int val);
 bool append_arr(pArr arr,int val);
 void init_arr(pArr arr,int len);
 void show_arr(pArr arr);
 bool is_empty(pArr arr);
 bool is_full(pArr arr);
 int main(){
 	struct Arr arr;
 	int len,delVal;
 	printf("请输入你想要分配的内存空间长度len=");
 	scanf("%d",&len);
 	init_arr(&arr,len);
 	append_arr(&arr,12);
 	append_arr(&arr,2);
 	append_arr(&arr,3);
 	append_arr(&arr,11);
 	append_arr(&arr,4);
 	append_arr(&arr,19);
 	append_arr(&arr,103);
 	append_arr(&arr,41);
 	append_arr(&arr,9);
 	show_arr(&arr);
 	inversion_arr(&arr);
 	show_arr(&arr);
 //	printf("%d",get(&arr,2));
 	/*
 	if(update_arr(&arr,2,111)){
 		show_arr(&arr);
	 }
	//show_arr(&arr);
 	//insert_arr(&arr,1,18);
 	//bool flag = delete_arr(&arr,1,&delVal);
 	//if(flag){
 		//printf("删除成功,删除的数为%d\n",delVal);
	 //}
 	*/
 }

 //反转数组元素
 void inversion_arr(pArr arr){
 	if(is_empty(arr)){
 		printf("该数组为空,退出程序!\n");
 		exit(-1);
	 }
 	int i,j;
 	for(i=0;icnt/2;i++){
 		int temp=arr->pBase[i];
 		arr->pBase[i]=arr->pBase[arr->cnt-1-i];
 		arr->pBase[arr->cnt-1-i]=temp;
	 }
 }
//选择法升序排序 
 void sort_arr(pArr arr){
 	int i,j;
 	if(is_empty(arr)){
 		printf("该数组为空,退出程序!\n");
 		exit(-1);
	 }
	 for(i=0;icnt;i++){
	 	for(j=i+1;jcnt;j++){
	 		if(arr->pBase[i]>arr->pBase[j])
			 {
		 		int temp=arr->pBase[i];
		 		arr->pBase[i]=arr->pBase[j];
		 		arr->pBase[j]=temp;
		 	 }
		}
	 }
 }
//获得指定元素的下标,pos表示第几个数 
 int get(pArr arr,int pos){
 	if(is_empty(arr)){
 		printf("该数组为空,退出程序!");
 		return false;
	 }
	 if(pos<1||pos>arr->cnt){
	 	printf("输入下标不合法");
	 	return false;
	 }
	 return arr->pBase[pos-1];
 }
//修改指定下标的元素
bool update_arr(pArr arr,int pos,int val){
 	if(is_empty(arr)){
 		printf("该数组为空,退出程序!\n");
 		return false;
	 }
	 if(pos<1||pos>arr->cnt){
	 	printf("修改下标不符合!\n");
	 	return false;
	 }
	 arr->pBase[pos-1]=val;
	 return true;
 }
  //删除指定下标的元素
  bool delete_arr(pArr arr,int pos,int *val){
 	int i;
 	if(is_empty(arr)){
 		printf("数组为空,没得删除了!\n");
 		return false;
	 }
	 if(pos<1||pos>arr->cnt){
	 	printf("删除的下标不合法!\n");
	 	return false;
	 }
	 *val = arr->pBase[pos-1];
	 for(i=pos-1;icnt;i++){
	 	arr->pBase[i-1]=arr->pBase[i];
	 }
	 arr->cnt--;
	 return true;
 }
 //指定位置下标插入元素 
 bool insert_arr(pArr arr,int pos,int val){//pos从1开始,表示在第几个数插入 
 	int i;
 	if(is_full(arr)){
 		printf("数组已满,不能再插入了!\n");
 		return false;
	 }
	 if(pos<1||pos>arr->cnt+1){
	 	printf("数组插入下标不合法!\n");
	 	return false;
	 }
	 for(i=arr->cnt-1;i>=pos-1;i--){
	 	arr->pBase[i+1]=arr->pBase[i];
	 }
	 arr->pBase[pos-1]=val;
	 arr->cnt++;
	 return true;
 }
 //追加元素到数组的后面 
 bool append_arr(pArr arr,int val){
 	if(is_full(arr)){
 		printf("数组已满,不能在添加了,退出程序\n");
 		return false;
	 }
	 arr->pBase[arr->cnt++]=val;
	 return true;
 }
//打印数组的基本信息 
 void show_arr(pArr arr){
 	int i;
 	if(arr==NULL){
 		printf("数组分配空间失败,退出程序\n");
 		exit(-1);
	 }
	 printf("数组的最大长度为%d,实际长度为%d",arr->length,arr->cnt);
	 if(arr->cnt>0){
	 	printf(",数组元素有:");
	 	for(i=0;icnt;i++){
	 		printf("%d,",arr->pBase[i]);
		 }
		 printf("\n");
	 }else{
	 	printf(",没有有效元素\n");
	 }
 }
 //初始化数组
 void init_arr(pArr arr,int len){
 	arr->pBase = (int *)malloc(sizeof(int)*len);
 	if(arr==NULL){
 		printf("分配空间失败,退出程序!\n");
 		exit(-1);
	 }
	 arr->length=len;
	 arr->cnt=0;
 } 
 //判断数组是否为空
 bool is_empty(pArr arr){
 	if(arr->cnt==0)
 		return true;
 	return false;
 } 
 //判断数组是否满
 bool is_full(pArr arr){
 	if(arr->length==arr->cnt)
 		return true;
 	return false;
 } 

到此为止,数组的基本方法都实现了,因为是用C语言实现的,所以涉及到了指针,动态内存分配(malloc),以及C结构体,所以看不太懂的同学可以先看一些有关这些内容的资料。写的不好,还请多多指教。


具体源码参考:http://download.csdn.net/download/qq_31308883/10141495

你可能感兴趣的:(数据结构和算法)