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

数组

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

虽然是在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,每周两更

猜你喜欢

转载自blog.csdn.net/qq_38234071/article/details/80172471