数据结构——顺序表

顺序表的相关操作和说明都放在代码里面了
图片来自网络,如有问题,请联系
图片来自网络,如有问题请联系

/*顺序表的相关操作
* 2021-4-11
* 顺序的创建,查找,插入,删除,增加
* //TKOTW
*/


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

#define Jnum 10     //静态创建,最大字符


typedef struct {
	int data[Jnum];
	int length;
}SQL;	//定义静态顺序表结构体

/*初始化静态顺序表*/
void Jlistinit(SQL	*sql) {
	for (int i = 0; i < Jnum; i++) {
		sql->data[i] = 0;
	}
	sql->length = 0;
}	
//、、、、、、、、、、、、、、、、、、、、、

#define init 20
typedef struct {
	int *data;
	int MaxSize;
	int length;
}SeqList;	//动态顺序表结构体创建

/*初始化动态顺序表*/
void InitList(SeqList* L) {
	L->data = (int*)malloc(init * sizeof(int));		//malloc函数,前面是要开辟的数据类型,后面是大小。一个int占的字符乘上最大值
	L->length = 3;
	for (int i = 0; i < L->length; i++) {
		L->data[i] = 1;
	}
	L->MaxSize = init;
}	

/*扩容操作*/
void IncreaseList(SeqList* L, int len) {		//两个参数,第一个是顺序表指针,第二个是要增加的长度
	int* p = L->data;	//将表内数据移动的p里
	L->data = (int*)malloc((init + len) * sizeof(int));		//扩容
	int i = 0;
	for (i = 0; i < L->length; i++) L->data[i] = p[i];		//把之前的值返回去
	L->MaxSize = L->MaxSize + len;		//最大的长度增加
	free(p);	//释放指针
}	

/*插入操作*/
_Bool ListInsert(SeqList* L, int i, int e) {	//c里面好像没布尔类型,这个是返回0为假,返回1为真
	//i表示要插入的位序,是数组下标+1,e表示要插入的值
	if(i<1|| i>L->length + 1) {
		printf("超出所能查的位序");
		return 0;
	}	//进行判断在范围之内
	else if (L->length + 1 > L->MaxSize) {
		printf("顺序表已达最大长度");
		return 0;
	}	//进行判断顺序表长度够用
	else for (int j = L->length; j >= i; j--)//减减式for循环
		L->data[j] = L->data[j - 1];		//将i之后的每一个元素全都往后退一个
		
	L->data[i - 1] = e;
	L->length++;
	return 1;
}

/*删除操作*/
_Bool ListDelete(SeqList* L, int i) {	//i表示要删除的位序,是数组下标+1,e是工具人
	if (i<1 || i>L->length ) {
		return 0;
	}	//进行判断在范围之内
	for (int j = i; j < L->length; j++)
		L->data[j-1] = L->data[j];		
	L->length--;
	return 1;
}//这边没有保留删除的值,有想法的可以尝试将删除的值保留下来

/*按值查找操作*/
int LocateElem(SeqList* L, int e) {		//e是要查找的值
	int i;
	for (i = 0; i < L->length; i++) {
		if (e == L->data[i]) {
			return i+1;		//输出第一个位序
		}
	
	}
	printf("无");
	return 0;
}//这里只能输出第一个查找值的位序,若是想输出所有查找值的位序,可以尝试改用void型函数,并且循环输出

/*按位查找操作*/
int GetElem(SeqList* L, int i) {
	return L->data[i - 1];
}
/*输出顺序表*/
int input(SeqList* L) {
	printf("顺序表:\n");
	for (int i = 0; i < L->length; i++) {
		printf("%d\n",L->data[i]);
	}
}
int main() {
	SQL l;
	Jlistinit(&l);
	for (int i = 0; i < Jnum; i++) {
		printf("%d\n", l.data[i]);
	}
	//以上为静态顺序表
	int h=1, f=1;
	int k;
	SeqList S;
	InitList(&S);//初始化
	input(&S);
	while (1)
	{
		printf("请选择操作: 1.插入	2.删除	3.按值查找	4.按位查找	5.扩容	6,输出顺序表\n");
		scanf_s("%d",&k);	//由于版本原因不能使用scanf
		switch (k)
		{
		case 1:
			printf("请输入位序 值\n");
			scanf_s("%d %d", &h, &f);
			printf("执行操作插入:\n位序为 %d 数值为 %d\n", h, f);
			ListInsert(&S, h, f);
			input(&S);
			break;
		case 2:
			printf("请输入位序\n");
			scanf_s("%d", &h);
			printf("执行操作删除:\n位序为 %d\n", h);
			ListDelete(&S, h);
			input(&S);
			break;
		case 3:
			printf("请输入要查找的值\n");
			scanf_s("%d", &h);
			printf("执行操作按值查找:\n所查值为 %d\n", h);
			printf("%d\n",LocateElem(&S, h));//int型,输出的是第一个位序
			input(&S);
			break;
		case 4:
			printf("请输入位序\n");
			scanf_s("%d", &h);
			printf("执行操作按位查找:\n位序为 %d\n", h);
			printf("按位查找的值:%d",GetElem(&S, h));
			break;
		case 5:
			printf("请输入扩容大小\n");
			scanf_s("%d", &h);
			printf("执行操作扩容:\n大小为 %d\n", h);
			printf("【原】顺序表最大长度:%d\n", S.MaxSize);
			IncreaseList(&S, h);
			printf("顺序表最大长度:%d\n", S.MaxSize);
			break;
		case 6:
			input(&S);
			break;
		default:
			printf("没有该指令,请输入1到6!");
			break;
		}
	}

	return 0;
}

(个人总结,如有问题,还望指出)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值