线性表之连续存储(数组)
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);
1 //测试数据结构中线性表中的顺序表 2 #include <stdio.h> 3 #include <malloc.h> 4 #include <stdlib.h> 5 typedef struct Arr{ 6 int *pBase; 7 int length; 8 int cnt; 9 }*pArr; //pArr=struct Arr * 10 void inversion_arr(pArr arr); 11 void sort_arr(pArr arr); 12 int get(pArr arr,int pos); 13 bool update_arr(pArr arr,int pos,int val); 14 bool delete_arr(pArr arr,int pos,int *val); 15 bool insert_arr(pArr arr,int pos,int val); 16 bool append_arr(pArr arr,int val); 17 void init_arr(pArr arr,int len); 18 void show_arr(pArr arr); 19 bool is_empty(pArr arr); 20 bool is_full(pArr arr); 21 int main(){ 22 struct Arr arr; 23 int len,delVal; 24 printf("请输入你想要分配的内存空间长度len="); 25 scanf("%d",&len); 26 init_arr(&arr,len); 27 append_arr(&arr,12); 28 append_arr(&arr,2); 29 append_arr(&arr,3); 30 append_arr(&arr,11); 31 append_arr(&arr,4); 32 append_arr(&arr,19); 33 append_arr(&arr,103); 34 append_arr(&arr,41); 35 append_arr(&arr,9); 36 show_arr(&arr); 37 inversion_arr(&arr); 38 show_arr(&arr); 39 // printf("%d",get(&arr,2)); 40 /* 41 if(update_arr(&arr,2,111)){ 42 show_arr(&arr); 43 } 44 //show_arr(&arr); 45 //insert_arr(&arr,1,18); 46 //bool flag = delete_arr(&arr,1,&delVal); 47 //if(flag){ 48 //printf("删除成功,删除的数为%d\n",delVal); 49 //} 50 */ 51 }
1 //反转数组元素 2 void inversion_arr(pArr arr){ 3 if(is_empty(arr)){ 4 printf("该数组为空,退出程序!\n"); 5 exit(-1); 6 } 7 int i,j; 8 for(i=0;i<arr->cnt/2;i++){ 9 int temp=arr->pBase[i]; 10 arr->pBase[i]=arr->pBase[arr->cnt-1-i]; 11 arr->pBase[arr->cnt-1-i]=temp; 12 } 13 }
1 //选择法升序排序 2 void sort_arr(pArr arr){ 3 int i,j; 4 if(is_empty(arr)){ 5 printf("该数组为空,退出程序!\n"); 6 exit(-1); 7 } 8 for(i=0;i<arr->cnt;i++){ 9 for(j=i+1;j<arr->cnt;j++){ 10 if(arr->pBase[i]>arr->pBase[j]) 11 { 12 int temp=arr->pBase[i]; 13 arr->pBase[i]=arr->pBase[j]; 14 arr->pBase[j]=temp; 15 } 16 } 17 } 18 }
1 //获得指定元素的下标,pos表示第几个数 2 int get(pArr arr,int pos){ 3 if(is_empty(arr)){ 4 printf("该数组为空,退出程序!"); 5 return false; 6 } 7 if(pos<1||pos>arr->cnt){ 8 printf("输入下标不合法"); 9 return false; 10 } 11 return arr->pBase[pos-1]; 12 }
1 //修改指定下标的元素 2 bool update_arr(pArr arr,int pos,int val){ 3 if(is_empty(arr)){ 4 printf("该数组为空,退出程序!\n"); 5 return false; 6 } 7 if(pos<1||pos>arr->cnt){ 8 printf("修改下标不符合!\n"); 9 return false; 10 } 11 arr->pBase[pos-1]=val; 12 return true; 13 }
1 //删除指定下标的元素 2 bool delete_arr(pArr arr,int pos,int *val){ 3 int i; 4 if(is_empty(arr)){ 5 printf("数组为空,没得删除了!\n"); 6 return false; 7 } 8 if(pos<1||pos>arr->cnt){ 9 printf("删除的下标不合法!\n"); 10 return false; 11 } 12 *val = arr->pBase[pos-1]; 13 for(i=pos-1;i<arr->cnt;i++){ 14 arr->pBase[i-1]=arr->pBase[i]; 15 } 16 arr->cnt--; 17 return true; 18 }
1 //指定位置下标插入元素 2 bool insert_arr(pArr arr,int pos,int val){//pos从1开始,表示在第几个数插入 3 int i; 4 if(is_full(arr)){ 5 printf("数组已满,不能再插入了!\n"); 6 return false; 7 } 8 if(pos<1||pos>arr->cnt+1){ 9 printf("数组插入下标不合法!\n"); 10 return false; 11 } 12 for(i=arr->cnt-1;i>=pos-1;i--){ 13 arr->pBase[i+1]=arr->pBase[i]; 14 } 15 arr->pBase[pos-1]=val; 16 arr->cnt++; 17 return true; 18 }
1 //追加元素到数组的后面 2 bool append_arr(pArr arr,int val){ 3 if(is_full(arr)){ 4 printf("数组已满,不能在添加了,退出程序\n"); 5 return false; 6 } 7 arr->pBase[arr->cnt++]=val; 8 return true; 9 }
1 //打印数组的基本信息 2 void show_arr(pArr arr){ 3 int i; 4 if(arr==NULL){ 5 printf("数组分配空间失败,退出程序\n"); 6 exit(-1); 7 } 8 printf("数组的最大长度为%d,实际长度为%d",arr->length,arr->cnt); 9 if(arr->cnt>0){ 10 printf(",数组元素有:"); 11 for(i=0;i<arr->cnt;i++){ 12 printf("%d,",arr->pBase[i]); 13 } 14 printf("\n"); 15 }else{ 16 printf(",没有有效元素\n"); 17 } 18 }
1 //初始化数组 2 void init_arr(pArr arr,int len){ 3 arr->pBase = (int *)malloc(sizeof(int)*len); 4 if(arr==NULL){ 5 printf("分配空间失败,退出程序!\n"); 6 exit(-1); 7 } 8 arr->length=len; 9 arr->cnt=0; 10 }
1 //判断数组是否为空 2 bool is_empty(pArr arr){ 3 if(arr->cnt==0) 4 return true; 5 return false; 6 }
1 //判断数组是否满 2 bool is_full(pArr arr){ 3 if(arr->length==arr->cnt) 4 return true; 5 return false; 6 }
到此为止,数组的基本方法都实现了,因为是用C语言实现的,所以涉及到了指针,动态内存分配(malloc),以及C结构体,所以看不太懂的同学可以先看一些有关这些内容的资料。写的不好,还请多多指教。
具体源码参考:http://download.csdn.net/download/qq_31308883/10141495
浙公网安备 33010602011771号