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