我总结了一下,数据结构将现实生活中的类型分为两类,一类是线性结构(也叫线性表)还有一类是非线性结构。
线性结构,顾名思义,就是像线一样的结构,数据元素在逻辑上一个连着一个,可以通过当前的位置找到下一个,甚至是之后的所有位置的元素。
非线性结构:和线性结构相反,用这种结构存储的数据元素在逻辑上是不连续的,也就是无法通过当前位置找到下一个元素。
线性结构分为数组和链表:
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;
}
具体源码参考:http://download.csdn.net/download/qq_31308883/10141495