数组
数组是由类型相同的数据元素构成的有序集合,每个元素称为数组元素。
虽然是在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,每周两更