C语言——顺序表

目录

前言

创建顺序表

顺序表初始化

顺序表的销毁

顺序表的清空

判断顺序表是否为空

按值查找顺序表

按位查找顺序表

求顺序表中某个位置的前一个元素

求顺序表中某个位置的后一位元素

在顺序表中插入元素

删除顺序表中某位元素


前言

    顺序表的创建和链表相似,但顺序表里元素的地址是连续的,也就是说顺序表可以像数组一样通过下标来查找元素,顺序表结构里除了数据区以外还有两个数据,一个是length用来记录顺序表当前的长度,另一个是size用于记录顺序表最大长度。

创建顺序表

    类似于创建一个整形数组:int nums[szie];

typedef struct SqList
{
	int *elem; //地址
	int length; //当前长度
	int size; //最大长度
}SqList;

顺序表初始化

void InitList(SqList *head){ 
	head->elem = malloc(sizeof(int)* 1);
	if (head->elem == NULL){
		printf("malloc失败!\n");
		exit(0);
	}
	head->length = 0; //长度为0
	head->size = Max; //大小为max
}

顺序表的销毁

void destoryList(SqList *head){
	if (head->elem != NULL){
		free(head->elem);
	}
	head->elem = NULL; //释放空间后记得置空
}

顺序表的清空

void cleanList(SqList *head){
	head->length = 0;    //直接让表的当前长度置零
}

判断顺序表是否为空

void judgeList(SqList head){  //因为不需要修改表里的数据,所以直接传值就行,不用传地址
	if (head.length == 0)
		printf("表为空!\n");
	else{
		printf("表不为空!\n");
	}
}

按值查找顺序表

int getval(SqList head,int x){
	for (int i = 0; i < head.length; ++i){
		if (head.length == x){
			printf("所在位置为第%d位!\n", i + 1);
			return i-1;
		}
	}
	printf("没有该数据!\n");
	return 0;
}

按位查找顺序表

int getelem(SqList head, int i, int *re){  //获取第i位元素(按位顺序查找)
	if (i<1 || i>head.length){
		printf("获取失败,位置非法!\n");
		return 0;
	}
	else{
		*re = head.elem[i - 1];  //将值赋值给要返回的变量
		return *re;
	}
}

求顺序表中某个位置的前一个元素

int* prevVal(SqList head, int x, int *prev){
	int k=-1;
	for (int i = 0; i < head.length; ++i){
		if (head.elem[i]== x){
			k = i - 1;
			break;
		}
	}
	if (k>-1){
		*prev = head.elem[k];
		printf("%d的前一位元素是%d!\n", x, *prev);
		return prev;
	}
	else{
		printf("%d没有前一位元素!\n", x);
		return 0;
	}
}

求顺序表中某个位置的后一位元素

int* nextVal(SqList head, int x, int* next){
	int k = -1;
	for (int i = 0; i < head.length; ++i){
		if (head.elem[i] == x){
			k = i + 1;
			break;
		}
	}
	if (k < head.length){
		*next = head.elem[k];
		printf("%d的下一位元素是%d \n", x, *next);
		return next;
	}
	else{
		printf("%d没有下一位元素!\n", x);
		return 0;
	}
}

在顺序表中插入元素

void InsertList(SqList *head, int i, int val){ //在i位置插入val
	if (i<1 || i>head->length){
		printf("插入位置不合法!\n");
		exit(0);
	}
	if (head->length == head->size){
		printf("表已满无法插入!\n");
		exit(0);
	}
	for (int j = head->length; j > i - 1; --j){
		head->elem[j] = head->elem[j - 1];  //将第i位后的元素往后搬移
	}
	head->elem[i - 1] = val;
	head->length++;  //长度加一
}

删除顺序表中某位元素

void DeleteVal(SqList *head, int i){
	if (i<1 || i>head->length){
		printf("删除位置不合法!\n");
		exit(0);
	}
	for (; i < head->length;++i){  //i位后元素全部前移一位
		head->elem[i - 1] = head->elem[i];
	}
	head->length--;    //长度减一
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值