2022-03-27 19:36阅读: 57评论: 0推荐: 0

数据结构 - (1)顺序表

1、

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//类型重命名
typedef struct Vector 
{
	int *data;
	int size, length;
}Vector;

//初始化1个存储n个元素的顺序表
Vector* init(int n) 
{
	//申请一个顺序表的空间
	Vector* vec = (Vector*)malloc(sizeof(Vector));
	//申请顺序表中连续存储区的存储空间
	vec->data = (int*)malloc(sizeof(int) * n);
	vec->size = n;
	vec->length = 0;
	return vec;
}

//顺序表的插入操作(顺序表,插入位置,插入值)
int insert(Vector* vec,int ind,int val)
{
	//排除异常
	if (vec == NULL)return 0;
	if (vec->length == vec->size)return 0;
	if (ind < 0 || ind > vec->length)return 0;

	//将插入位置后方数据后移一位
	for (int i = vec->length; i > ind; i--)
	{
		vec->data[i] = vec->data[i - 1];
	}
	vec->data[ind] = val;
	vec->length += 1;
	return 1;
}

//顺序表的删除操作(顺序表,位置)
int erase(Vector* vec, int ind)
{
	//排除异常
	if (vec == NULL)return 0;
	if (vec->length == vec->size)return 0;
	if (ind < 0 || ind >= vec->length)return 0;

	//将后方位置元素向前移动一位
	for (int i = ind + 1; i < vec->length; i++)
	{
		vec->data[i - 1] = vec->data[i];
	}
	vec->length -= 1;
	return 1;
}

//输出顺序表
void output(Vector* vec)
{
	printf("Vector(%d) = [", vec->length);

	for (int i = 0; i < vec->length; i++)
	{
		if (i != 0)printf(", ");
		printf("%d", vec->data[i]);
	}
	printf("]\n");
	return;
}

//顺序表的销毁操作
void clear(Vector* vec)
{
	if (vec == NULL)return;
	//先顺序表销毁数据区
	free(vec->data);
	//再顺序表销毁本身空间
	free(vec);
	return;

}
//主函数
int main()
{
	//传入当前时间作为随机数种子
	srand(time(0));
	//随机操作20组数
	#define MAX_OP 20
	Vector* vec = init(MAX_OP);
	int op, ind, val;

	for (int i = 0; i < MAX_OP; i++)
	{
		op = rand() % 2;//得到的 op 为0或1
		ind = rand() % (vec->length + 1);//随机数索引
		val = rand() % 100;//0-100之内随机生成一个值
		//判断操作功能 0:插入、1:删除
		switch (op) 
		{
		case 0: 
		{
			printf("insert %d at %d to vector = %d\n",
				val, ind, insert(vec, ind, val));
		} break;
		case 1: 
		{
			printf("erase item at %d from vector = %d\n",
				ind, erase(vec, ind));
		} break;
		}
		output(vec);
	}
	return 0;
}

2、上述代码只能存储最大为20个空间的数据,故一下代码进行升级可以扩容操作

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//类型重命名
typedef struct Vector 
{
	int *data;
	int size, length;
}Vector;


//初始化1个存储n个元素的顺序表
Vector* init(int n) 
{
	//申请一个顺序表的空间
	Vector* vec = (Vector*)malloc(sizeof(Vector));
	//申请顺序表中连续存储区的存储空间
	vec->data = (int*)malloc(sizeof(int) * n);
	vec->size = n;
	vec->length = 0;
	return vec;
}


//对顺序表扩容操作
int expand(Vector* vec)
{
	int new_size = vec->size * 2;
	int* p = (int*)realloc(vec->data, sizeof(int) * new_size);//重新分配
	if (p == NULL) return 0;
	vec->size = new_size;
	vec->data = p;
	return 1;
}


//顺序表的插入操作(顺序表,插入位置,插入值)
int insert(Vector* vec,int ind,int val)
{
	//排除异常
	if (vec == NULL)return 0;
	if (vec->size == vec->length)
	{
		if (!expand(vec))return;//分配空间失败则return
		printf("expand vector size to %d success\n", vec->size);
	}
	if (ind < 0 || ind > vec->length)return 0;


	//将插入位置后方数据后移一位
	for (int i = vec->length; i > ind; i--)
	{
		vec->data[i] = vec->data[i - 1];
	}
	vec->data[ind] = val;
	vec->length += 1;
	return 1;
}


//顺序表的删除操作(顺序表,位置)
int erase(Vector* vec, int ind)
{
	//排除异常
	if (vec == NULL)return 0;
	if (vec->length == vec->size)return 0;
	if (ind < 0 || ind >= vec->length)return 0;

	//将后方位置元素向前移动一位
	for (int i = ind + 1; i < vec->length; i++)
	{
		vec->data[i - 1] = vec->data[i];
	}
	vec->length -= 1;
	return 1;
}


//输出顺序表
void output(Vector* vec)
{
	printf("Vector(%d) = [", vec->length);

	for (int i = 0; i < vec->length; i++)
	{
		if (i != 0)printf(", ");
		printf("%d", vec->data[i]);
	}
	printf("]\n");
	return;
}


//顺序表的销毁操作
void clear(Vector* vec)
{
	if (vec == NULL)return;
	//先顺序表销毁数据区
	free(vec->data);
	//再顺序表销毁本身空间
	free(vec);
	return;

}


//主函数
int main()
{
	//传入当前时间作为随机数种子
	srand(time(0));
	//随机操作20组数
	#define MAX_OP 20
	Vector* vec = init(1);
	int op, ind, val;

	for (int i = 0; i < MAX_OP; i++)
	{
		op = rand() % 2;//得到的 op 为0或1
		ind = rand() % (vec->length + 1);//随机数索引
		val = rand() % 100;//0-100之内随机生成一个值
		//判断操作功能 0:插入、1:删除
		switch (op) 
		{
		case 0: 
		{
			printf("insert %d at %d to vector = %d\n",
				val, ind, insert(vec, ind, val));
		} break;
		case 1: 
		{
			printf("erase item at %d from vector = %d\n",
				ind, erase(vec, ind));
		} break;
		}
		output(vec);
		printf("\n");
	}
	return 0;
}

自此完成

本文作者:HanaKoo

本文链接:https://www.cnblogs.com/HanaKoo/p/16063969.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   HanaKoo  阅读(57)  评论(0编辑  收藏  举报
@format
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑
  1. 1 Tiny Light(TV动画《地缚少年花子君》ED)(翻自 鬼頭明里) 柚卟
Tiny Light(TV动画《地缚少年花子君》ED)(翻自 鬼頭明里) - 柚卟
00:00 / 00:00
An audio error has occurred.

作词 : Saku

作曲 : Saku

優しさに触れて残る温度

消えないまま 愛しいと言えたら

心は軽くなるかな

閉ざした扉の向こうで

微かな声が聴こえてる

踏み出すことさえも出来ないから

孤独に寄り添ってる

まだこの胸の中 生きづいたまま

小さな灯し火のような想いを

風に吹かれぬように

雨に濡れないように

ずっと抱きしめてた

ただ 真っ直ぐなまま願う強さも

泣き出しそうになる脆い自分も

君が居なきゃ知らなかったんだよ

偶然の中で運命を見つけた

瞳閉じる度 記憶の海 漂っては

深い夢のあと

面影を探してたんだ

変わらないモノクロの日々に

君が色を添えてくから

滲んだ過去さえもいつの間にか

意味を持ち始めてる

まだこの胸の中隠したままの

痛いほど愛おしい こんな思いを

いつか消えてしまうその前に

届けたい人は 君だけなんだ

どんな涙も どんな笑顔も

全ては君のためにあるから

まだこの胸の中 生きづいたまま

小さな灯し火のような想いを

風に吹かれぬように

雨に濡れないように

ずっと抱きしめてた

ただ 真っ直ぐなまま願う強さも

泣き出しそうになる脆い自分も

君が居なきゃ知らなかったんだよ

偶然の中で運命を見つけた

君がいるだけで世界は変わった