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];
}

总结

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

相关推荐
码事漫谈5 分钟前
C++死锁深度解析:从成因到预防与避免
后端
码事漫谈11 分钟前
智能体颠覆教育行业:现状、应用与未来展望调研报告
后端
蓝-萧13 分钟前
【玩转全栈】----Django基本配置和介绍
java·后端
priority_key13 分钟前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
韩立学长13 分钟前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
编程社区管理员44 分钟前
React 发送短信验证码和验证码校验功能组件
前端·javascript·react.js
全马必破三1 小时前
React“组件即函数”
前端·javascript·react.js
三思而后行,慎承诺1 小时前
React 底层原理
前端·react.js·前端框架
座山雕~1 小时前
html 和css基础常用的标签和样式
前端·css·html
汤姆yu1 小时前
基于SpringBoot的动漫周边商场系统的设计与开发
java·spring boot·后端