《数据结构-C语言》顺序表
@
顺序表
结构定义
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define YES 1
#define NO 0
#define MAX_SIZE 100 // 顺序表最大长度
typedef int ElemType;
typedef int Status;
#pragma warning(disable:4996)
/*
顺序表的类型定义
*/
typedef struct
{
ElemType* elem; // 指向数据元素的基地址
int length; // 顺序表的当前长度
}SequenceList;
初始化
/*
初始化顺序表
*/
Status InitList(SequenceList* L)
{
// 为顺序表分配空间
L->elem = (ElemType*)malloc(MAX_SIZE * sizeof(ElemType));
L->length = 0; // 空表长度为0
return OK;
}
创建表
/*
创建指定大小的顺序表
*/
void CreateSqList(SequenceList* L, int n)
{
for (int i = 0; i < n; i++) {
scanf("%d", &L->elem[i]);
L->length++;
}
}
求表长
/*
求顺序表L的长度
*/
int GetLength(SequenceList L)
{
return (L.length);
}
判断表是否为空
/*
判断顺序表L是否为空
*/
Status IsEmpty(SequenceList L)
{
if (L.length == 0)
return YES;
else
return NO;
}
取值
/*
获取顺序表中第i个数据元素的内容
*/
Status GetElem(SequenceList L, int i, ElemType* e)
{
if (i < 1 || i > L.length)
return ERROR;
*e = L.elem[i - 1]; // 第i-1个单元存储着第i个数据
return OK;
}
查找
/*
在顺序表中查找值为e的数据元素
*/
int LocateELem(SequenceList L, ElemType e)
{
for (int i = 0; i < L.length; i++)
if (L.elem[i] == e) {
return i + 1; // 第i个单元存储着第i+1个数据
}
return 0;
}
插入
/*
插入,将元素插入到指定位序(插在第 i 个元素之前,0<i<=len+1)
*/
Status InsertElem(SequenceList* L, int i, ElemType e)
{
if (i < 1 || i > L->length + 1)
return ERROR; // i值不合法
if (L->length == MAX_SIZE)
return ERROR; // 当前存储空间已满
for (int j = L->length - 1; j >= i - 1; j--) {
L->elem[j + 1] = L->elem[j]; // 插入位置及之后的元素后移
}
L->elem[i - 1] = e; // 将新元素e放入第i个位置
L->length++; //表长增1
return OK;
}
删除
/*
将顺序表中第i个数据元素删除
*/
Status DeleteElem(SequenceList* L, int i, ElemType* e)
{
if ((i < 1) || (i > L->length)) {
return ERROR; // 删除位置不合理
}
*e = L->elem[i - 1];
for (int j = i;j <= L->length - 1;j++) {
L->elem[j - 1] = L->elem[j];
}
L->length--;
return OK;
}
逆置
/*
将顺序表所有元素逆置,空间复杂度为O(1)
*/
void Reverse(SequenceList* L) {
int temp = 0;
int i = 0;
for (i = 0; i < (L->length) / 2; i++) {
temp = L->elem[i];
L->elem[i] = L->elem[(L->length) - i - 1];
L->elem[(L->length) - i - 1] = temp;
}
}
清空
/*
清空顺序表L
*/
void ClearList(SequenceList* L)
{
L->length = 0;
}
销毁
/*
销毁顺序表L
*/
void DestroyList(SequenceList* L)
{
if (L->elem)
free(L->elem);
}
遍历打印
/*
打印顺序表
*/
void PrintSqList(SequenceList L)
{
for (int i = 0; i < L.length; i++)
{
printf("%d", L.elem[i]);
if (i < L.length - 1) {
printf(" ");
}
}
}
测试
int main() {
// 测试数据:1 3 8 5 6 7 9 2
SequenceList Sq;
Status a1 = InitList(&Sq);
printf("初始化:\na1 = %d\n", a1);
CreateSqList(&Sq, 8);
PrintSqList(Sq);
ElemType e2 = 0;
Status a2 = GetElem(Sq, 2, &e2);
printf("\n\na2 = %d, e2 = %d\n\n", a2, e2);
ElemType e3 = 0;
Status a3 = DeleteElem(&Sq, 2, &e3);
PrintSqList(Sq);
printf("\n\n");
ElemType e4 = 666;
Status a4 = InsertElem(&Sq, 2, e4);
PrintSqList(Sq);
printf("\n\n");
Reverse(&Sq);
PrintSqList(Sq);
printf("\n\n");
ClearList(&Sq);
DestroyList(&Sq);
return 0;
}
测试结果:

《数据结构-C语言》顺序表的更多相关文章
- 数据结构C语言顺序表
#include <stdio.h> #include <stdlib.h> typedef int EmenType; typedef struct Node { int d ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- 【数据结构】之顺序表(C语言描述)
顺序表是线性表的一种,它将元素存储在一段连续的内存空间中,表中的任意元素都可以通过下标快速的获取到,因此,顺序表适合查询操作频繁的场景,而不适合增删操作频繁的场景. 下面是使用 C语言 编写的顺序表的 ...
- 五种编程语言解释数据结构与算法——顺序表1(理论与C语言实现)
1.线性表的分类 2.线性表的定义及其基本操作 2.1.定义:线性表是具有相同类型的n(n>=0)个元素的有序序列,其中n为表长,当n=0时,该表为空表. 2.3.线性表的逻辑结构为: 2.4. ...
- 五种编程语言解释数据结构与算法——顺序表3(JavaScript与Python语言实现)
7.JavaScript语言实现 7.1.用ES6语法编写顺序表类 //1.创建类 class MyList { //1. initList(&L):初始化表.构造一个空的线性表.放回值应该是 ...
- 【C语言--数据结构】线性顺序表
线性表的本质: 1.线性表(List)是零个或者多个数据元素的集合: 2.线性表中的数据元素之间是有顺序的: 3.线性表中的数据元素个数是有限的: 4.线性表中的数据元素的类型必须相同: 定义: 线性 ...
- 五种编程语言解释数据结构与算法——顺序表2(java与C++语言实现)
5.java实现方式: 5.1.顺序表的抽象结构 package com.xgp.顺序表; public interface MyList<T> { //1. initList(& ...
- C++数据结构学习之顺序表
顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...
- 数据结构 单链表&顺序表
顺序表: 一般使用数组(C语言中的数组采用顺序存储方式.即连续地址存储)来描述. 优点:在于随机访问元素, 缺点:插入和和删除的时候,需要移动大量的元素. 链表: 优点:插入或删除元素时很方便,使用灵 ...
随机推荐
- 人手一个 Midjourney,StableStudio 重磅开源!
人手一个 Midjourney,StableStudio 重磅开源! Stability AI 公司在上个月 19 号推出了 Alpha 版本 StableLM 大语言模型,包含了 30 亿和 70 ...
- 从源码角度剖析 golang 如何fork一个进程
从源码角度剖析 golang 如何fork一个进程 创建一个新进程分为两个步骤,一个是fork系统调用,一个是execve 系统调用,fork调用会复用父进程的堆栈,而execve直接覆盖当前进程的堆 ...
- C++面试八股文:指针占用多少个字节?
某日小二参加XXX科技公司的C++工程师开发岗位4面: 面试官:memset.memcpy和strcpy的区别是什么? 小二:memset用于将一块内存设置为特定的值, memcpy用于将一块内存从一 ...
- 18.详解AQS家族的成员:Semaphore
关注:王有志,一个分享硬核Java技术的互金摸鱼侠. 欢迎你加入Java人的提桶跑路群:共同富裕的Java人 今天我们来聊一聊AQS家族中另一个重要成员Semaphore,我只收集到了一道关于Sema ...
- CANoe_系统变量的创建过程
在Canoe中创建系统变量,可以用于定义和管理与CAN网络通信相关的参数和配置.遵循以下步骤: 1.打开Canoe 启动Canoe软件. 2.打开项目 在Canoe的菜单栏中,选择"File ...
- 【LeetCode滑动窗口专题#2】无重复字符的最长子串
#1传送门 无重复字符的最长子串 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为 ...
- WPF 入门笔记 - 03 - 样式基础及模板
程序的本质 - 数据结构 + 算法 本篇为学习李应保老师所著的<WPF专业编程指南>并搭配WPF开发圣经<WPF编程宝典第4版>以及痕迹大佬<WPF入门基础教程系列> ...
- 【PAT】1001 害死人不偿命的(3n+1)猜想(动态更新)
卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...
- 云原生时代崛起的编程语言Go远程调用gRPC实战
@ 目录 概述 定义 背景 特点 四种服务方法 实战 环境配置 proto文件 简单RPC Token认证 服务器流式RPC 客户端流式RPC 双向流式RPC 概述 定义 gRPC 官网地址 http ...
- [数据分析与可视化] Python绘制数据地图3-GeoPandas使用要点
本文主要介绍GeoPandas的使用要点.GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口.GeoPandas扩展了Pandas的数据类型,并使用matplotl ...