C语言实现顺序表(考研笔记)

概述

给需要考研的同学一个参考,顺序表作为常见数据结构的一种,这里记录一期关于C语言实现顺序表。

代码实现

函数定义、结构体、常量、宏定义

c 复制代码
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define MAX_SIZE 10
#define true 1
#define false 0
#define bool char
typedef int ElementType ;
typedef struct SeqList {
	ElementType* data;
	int maxLen;
	int len;
} SeqList;
SeqList* intSeqList(SeqList* L);
void increaseSize(SeqList *L, int increaseLen);
bool insert(SeqList* L,int pos, int element);
bool del(SeqList* L, int pos);
bool update(SeqList* L, int pos, ElementType elemnt);
ElementType getElement(SeqList* L, int pos);

main函数

c 复制代码
jint main() {
	SeqList L;
	intSeqList(&L);
	for (int i = 0; i < L.maxLen; i++) {
		insert(&L, i, i);
	}
	increaseSize(&L, 10);
	insert(&L, 15, 126);
	update(&L, 7, 77);
	del(&L, 15);
	for (int i = 0; i < L.maxLen; i++) {
		printf("L->data[%d]=%d\n", i, L.data[i]);
	}
	printf("长度为%d\n", L.len);
	printf("L->data[%d]\n", getElement(&L, 7));
	return 0;
}

顺序表初始化

c 复制代码
SeqList* intSeqList(SeqList* L) {
	assert(L);
 	ElementType* newL = (ElementType*)malloc(MAX_SIZE * sizeof(ElementType));
	if (newL) {
		L->data = newL;
		for (int i = 0; i < MAX_SIZE; i++) {
			L->data[i] = 0;
		}
		L->len = 0;
		L->maxLen = MAX_SIZE;
	}
	return L;
}

动态扩容顺序表

c 复制代码
void increaseSize(SeqList* L, int increaseLen) {
	ElementType* p = L->data;
	ElementType* newL = (ElementType*)realloc(L->data, (L->maxLen + increaseLen) * sizeof(ElementType));
	if (newL) {
		L->data = newL;
		for (int i = L->maxLen; i < L->maxLen+increaseLen; i++) {
			L->data[i] = 0;
		}
		L->maxLen = L->maxLen + increaseLen;
	}
}

顺序表插入元素

c 复制代码
bool insert(SeqList* L,int pos, ElementType elemnt) {
	if (pos < 0 || pos >= L->maxLen) {
		return false;
	}
	ElementType* p = L->data;
	//pos位置以后的元素后移
	int start = 0;
	while (start < L->maxLen) {
		if (start == pos) {
			break;
		}
		p++;
		start++;
	}
	for (int i = L->maxLen - 1; i > start; i--) {
		L->data[i] = L->data[i - 1];
	}
	*p = elemnt;
	L->len = L->len + 1 > L->maxLen ? L->maxLen : ++L->len;
	return true;
}

表删除元素(通过位置删除)

c 复制代码
bool del(SeqList* L, int pos) {
	if (pos < 0 || pos >= L->maxLen) {
		return false;
	}
	ElementType* p = L->data;
	//pos位置以后的元素后移
	int start = 0;
	while (start < L->maxLen) {
		if (start == pos) {
			break;
		}
		p++;
		start++;
	}
	for (int i = start; i < L->maxLen; i++) {
		if (i == L->maxLen-1) {
			L->data[i] = 0;
		}
		else {
			L->data[i] = L->data[i + 1];
		}
	}
	L->len--;
	return true;
}

顺序表修改元素(通过位置修改)

c 复制代码
bool update(SeqList* L, int pos, ElementType elemnt) {
	if (pos < 0 || pos >= L->maxLen) {
		return false;
	}
	L->data[pos] = elemnt;
	return true;
}

顺序表查找元素(通过位置查找)

c 复制代码
ElementType getElement(SeqList* L, int pos) {
	if (pos < 0 || pos >= L->maxLen) {
		return false;
	}
	return L->data[pos];
}

总结

上面代码按照我个人习惯书写,更多的临界值判断可以自行添加。

相关推荐
KYGALYX2 分钟前
服务异步通信
开发语言·后端·微服务·ruby
掘了7 分钟前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅10 分钟前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅32 分钟前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法44 分钟前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
崔庆才丨静觅1 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment1 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅1 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊1 小时前
jwt介绍
前端
爱敲代码的小鱼1 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax