(数据结构与算法)递归函数、顺序表和链表 9/13

1.给递归函数一个明确的语义信息  即fn具体代表了什么

2.设计边界条件 就是n==1时候 f(n)=?

3.假设我们的递归函数是正确的,来设计本层的设计  即写出fn的关系式

1.这里的f(n)代表了能吃n天的桃子数量

2.n==1----->1

3.(f(n-1)+1)*2=f(n)


                                                                顺序表和链表

数据结构=结构定义+结构操作

一、顺序表

顺序表的结构定义:1.一段连续的存储区(这里的连续用指针来实现) 2.一个整型的变量来标记我们数组的长度大小 3.也是一个整型的变量来标记我们存储了几个数据

和数组类似 但是多了两个属性size count

顺序表的结构操作:插入or 删除

顺序表因为是连续的所以在插入或者删除的操作过程中需要对后面的元素进行存储空间的移动

代码演示:

数据结构就是定义一种性质然后去维护这种性质

实在是大多了参考代码吧

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct vector
{
	int size, count;
	int* date;
}vector;//这是结构定义

//结构操作 1.初始化操作
vector* getNewVector(int n)
{
	vector* p = (vector*)malloc(sizeof(vector));
	p->size = n;
	p-> count = 0;
	p->date = (int *)malloc(sizeof(vector));
	return p;
}

//2.销毁操作
void clear(vector* v)
{
	if (v == NULL) return;
	free(v->date);
	free(v);
	return;
}
//扩容操作
int expand(vector* v)
{
	if (v == NULL) return 0;
	printf("expand v ");
	v->date = (int*)realloc(v->date, sizeof(int) * 2 * v->size);
	v->size *= 2;
	return 1;
}



//3.顺序表的插入操作

int insert(vector* v, int pos, int val)
{
	if (pos < 0 || pos > v->count) return 0;
	//先要判断size==count 判断还有没有空间 能否插入进去
	if (v->size == v->count && !expand(v)) return 0;//顺序表满了并且扩容操作不成功
	if (v->size == v->count) return 0;
	 
	for (int i = v->count - 1; i >= pos; i--)//这个很关键 用的是i--逆序遍历 如果正着的话会有元素覆盖
	{
		v->date[i + 1] = v->date[i];

	}//完成了pos以后的元素向后移动的操作为pos 腾出了一块空间

	v->date[pos] = val;//进行插入
	v->count += 1;//数据结构就是定义一种性质然后去维护这种性质 ,这里就是维护的部分
	return 1;
}


void output_vector(vector* v)
{
	printf("\n");
	int len = 0;
	for (int i = 0; i < v->size; i++)
	{
		len += printf("%3d", i);
	}
	printf("\n");
	for (int i = 0; i < len; i++)
	{
		printf("-");
	}
	for (int i = 0; i < v->size; i++)
	{
		printf("%3d", v->date[i]);
		
	}
	printf("\n");
	return;

}
//下面是数据表的删除操作

int erase(vector* v, int pos)
{
	if (pos < 0 || pos >= v->count) return 0;

	for (int i = pos + 1; i < v->count; i++)//进行删除的操作,用正序进行直接覆盖
	{
		v->date[i - 1] = v->date[i];
	}
	v->count -= 1;
	return 1;
}
int main()
{
	srand(time(0));
#define MAX_OP 20
	vector* v = getNewVector(2);
	for (int i = 0; i < MAX_OP; i++)
	{
		int op = rand() % 4, pos, val;
		switch (op)
		{
		case 0:
		case 1:
		case 2:
			pos = rand() % (v->count + 2);
			val = rand() % 100;
			printf("insert %d at %d to vector = %d\n", val, pos, insert(v, pos, val));
			break;
		case 3:
			pos = rand() % (v->count + 2);
			printf("erase item at %d in vector = %d\n", pos, erase(v, pos));
			break;

		}
		output_vector(v);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值