关于数组的一点想法和延伸

xiaoxiao2021-02-28  32

数组

数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素。

虽然是在C和C++里就有出现的数组,但是现在出现在了数据结构里,也需要重新认识

网上百度了一下在数据结构里的数组

https://blog.csdn.net/singit/article/details/70175462

这里有一句很有意思的话,特殊矩阵和稀疏矩阵。今天主要讨论的是数组,所以有机会再学习一下(各类)矩阵这种东西

作为变相的把数组看作是线性表的推广,觉得还是很好理解的

其实想开点,内存也可以看成一个超大数组就释然了,经常用数组表示的:数据量小的栈、队列,以及最大堆最小堆,用数组模拟链表、多叉链表。既然如此,那今晚上还是来写个数组好了。

1 struct Arr 2 { 3 int *pBase; //存储的是数组的第一个元素的地址 4 int len; //数组所能容纳的最大元素的个数 5 int cnt; //数组有效元素的个数 6 7 };

简单的定义,bulingbuling,还是定义了一个结构体

所以还是加点东西,今晚上就把详细的部分而且平时都大概能够用到的记录一下233

/*  数组初始化函数  初始化仅仅是给出一个具有一定长度的数组,但是数组中没有有效值  */  void init_arr(struct Arr * pArr,int len)  {      pArr->pBase=(int *)malloc(sizeof(int)*len);     if(NULL==pArr->pBase){          printf("动态内存分配失败");         exit(-1); //终止整个程序      }     else{         pArr->len=len;         pArr->cnt=0;     } } /* 判断数组是否为空的函数  */  int is_empty(struct Arr * pArr){     if(pArr->cnt==0){         return 0;   //0代表true      }     else{         return 1;   //1代表false      } }  /* 数组输出显示函数  在进行数组输出时,首先应该判断数组是否为空  */ void show_arr(struct Arr * pArr){         if(is_empty(pArr)==0){         printf("当前数组为空!");     }     else{         int i;         for(i=0; i<pArr->cnt; ++i){             printf("%d   ",pArr->pBase[i]);         }         printf("\n");     } }  /* 判断数组是否已满的函数  */ int is_full(struct Arr * pArr){     if(pArr->cnt==pArr->len){         return 0; //0代表true,表示已满      }     else{         return 1; //1代表false,表示未满      } }  /* 在数组的最后追加一个元素  在追加数组元素前要判断当前数组是否已满,已满时不允许追加新的元素  */ int append_arr(struct Arr *pArr,int val){     if(is_full(pArr)==0){         return 0;     }     else{         pArr->pBase[pArr->cnt]=val;         pArr->cnt++;         return 1;     } }  /* 在数组的指定位置插入元素  插入算法:首先将被插入位置的元素全部后移,然后再将空出来的位置插入。 根据算法原理,所以,在插入的时候应该检查数组是否已满。  上述两种情况均合理时,进行数据的插入,插入时,若插入第三个位置,实际是将数据赋值给arr[pos-1]  注意:再将插入位置后的元素后移时,应该从后向前移动。否则,将会造成“被移到”的位置的值被覆盖  */ int insert_arr(struct Arr *pArr,int pos,int val){     if(is_full(pArr)==0){         return 0; //0表示当前数组已满,无法再进行插入      }         //在数组可插入的情况下,应该检查用户输入的pos位置值是否合理     if(pos<0||pos>(pArr->len)){         return 1; //1表示当前用户插入位置不合法      }      //移动位置      int i;     for(i=pArr->cnt    -1;i>=pos-1;--i){         pArr->pBase[i+1]=pArr->pBase[i];     }      //空缺位置插入元素    pArr->pBase[pos-1]=val;     return 2; //2表示当前插入成功  }

讲真,感觉又回到考核的时候还是很紧张的,那时候忽然学链表(没有提前学习真的是菜

再贴上自己的约瑟夫,在老师的辅导下,正确地重新理解链表、节点等等,喊一声数据结构牛逼

#include <stdio.h>#include <stdlib.h>typedef struct node{    int data;    struct node *link;}Node;int main(){    int m,n;//n个人,报数上限m    printf("请输入报数上限数和报数人数:\n");    scanf("%d" "%d",&m,&n);    struct node *head,*p,*q;    int i,count;    count = 0;    head = NULL;   //头指针初始为空    //创建循环单链表并传值    for(i = 1;i <=n;i++){        p = (struct node *)malloc(sizeof(struct node));        //动态申请空间        p->data = i;        p->link = NULL;        if(head == NULL)            {            head = p;            p->link = p;            q = p;            }        else{            p->link = head;            q->link = p;            q = p;        }    }    for(i = 1;count < n-1;i++){        if(i%m == 0){            printf("%d",p->link->data);            printf(" ");            q = p->link;            p->link = q->link;            count ++;            free(q);        }else{            p = p->link;        }    }    system("pause");    return 0;

}

经常回头看看,今天立个flag,每周两更

转载请注明原文地址: https://www.6miu.com/read-2624909.html

最新回复(0)