数据结构(C语言版)之线性表
前言
这学期学校开设了数据结构与算法,为帮助更多小伙伴和巩固学习,我开始整理这门课的学习内容,希望能给同样在学习这门课的小伙伴们提供一些浅薄的思路。
正文部分
目录
前言
正文部分
什么是线性表
整体思路
整体设计
顺序表结构体以及状态码类型创建
实现线性表的“创删查改”功能
完整代码
main.c
LinearList.c
LinearList.h
什么是线性表
线性表(linear_list)是最常用且最简单的一种数据结构。线性表在内存中的布局和数组一样,都是连续的 。因此和链表相比,线性表的创建比链表更加容易,理解起来也更加易懂。
整体思路
整体设计
在开始设计线性表整体程序之前,我们首先需要进行思路整理,可以创建一个main.c文件来存放主函数,创建LinearList.c文件用于存放线性表相关函数,创建LinearList.h文件用于存放线性表相关结构体声明、函数声明、状态码。
顺序表结构体以及状态码类型创建
可以参考以下顺序表结构体与状态类型来进行设计
//顺序表的数据结构体
typedef struct Dat {int i;
}Dat;//顺序表结构体
typedef struct SqList {Dat* listDat; //顺序表数据的地址int Length; //顺序表长度
}SqList;typedef int Status; //状态码类型//所需要的状态码
#define INIT_SUCCEED 1 //状态码:初始化成功
#define DESTORY_SUCCEED 1 //状态码:销毁成功
#define SUCCEED 1 //状态码:成功
#define ERROR_LENGTH 0 //状态码:错误的长度
实现线性表的“创删查改”功能
- 顺序表结构体创建完成后就可以编写代码实现“创删查改”等功能的编写了,接下来我会尽量详细为大家讲解相关代码,但由于本人也是大一生且初学数据结构,难免有一些错误之处,欢迎大家进行指正。
- 创 —— 创建新的线性表并初始化线性表
在LinearList.c文件中编写如下代码,记得创建完成后在LinearList.h文件中写下该函数的函数声明。
/************************************************
函数名称:顺序表初始化函数
函数介绍:创建一个新的指定大小的顺序表,并赋初值0
函数参数:SqList *list -- 要创建的顺序表的地址int length -- 要新建的顺序表的长度
返回类型:Status -- 状态类型INIT_SUCCEED -- 1
************************************************/
Status InitList(SqList* list,int length)
{//创建线性表list->listDat = (Dat*)malloc(sizeof(Dat) * length);list->Length = length;//赋初值for (int i = 0; i < list->Length; i++){((list->listDat) + i)->i = 0;}return INIT_SUCCEED;
}
在创建线性表时我使用了动态内存分配的方法,先在内存中开辟一块所需要的线性表的空间,将这块空间强制类型转换为 Dat* 类型(可理解为Dat类型的数组),并将其首地址赋给 SqList结构体的成员变量 listDat 。在赋初值时,也使用了下标偏移的方法(第一个 i 为偏移量,第二个 i 为 Dat 结构体中的成员变量)。
- 删 —— 销毁该线性表
销毁该线性表时,只需要将这块内存空间 free 并将 list->Length 赋为0即可。
/************************************************
函数名称:顺序表销毁函数
函数介绍:销毁指定的顺序表
函数参数:SqList *list -- 要销毁的顺序表的地址
返回类型:Status -- 状态类型INIT_SUCCEED -- 1
************************************************/
Status DestoryList(SqList* list)
{free(list->listDat);list->Length = 0;return DESTORY_SUCCEED;
}
- 查 —— 查看该线性表中指定的数据
/************************************************
函数名称:顺序表查看函数
函数介绍:查看顺序表的指定位置
函数参数:SqList *list -- 要查看的顺序表的地址int n -- 要查看的值的下标(从0开始)
返回类型:Dat* dat -- 数据结构体的地址特别的,若查找错误则返回NULL
************************************************/
Dat* FindList(SqList* list, int n)
{if (n<0 || n>list->Length){return NULL;}else{return (list->listDat + n);}
}
这里返回的为顺序表指定位置的数据域的地址(Dat*类型),返回时也使用了下标偏移的方法。
- 改 —— 为顺序表指定数据域赋值
/************************************************
函数名称:顺序表赋值函数
函数介绍:对指定顺序表的指定位置赋值
函数参数:SqList *list -- 要赋值的顺序表的地址int n -- 要赋的值的下标(从0开始)Dat dat -- 要赋的值的结构体
返回类型:Status -- 状态类型SUCCEEED -- 1ERROR_LENGTH -- 0
************************************************/
Status InputElem(SqList* list, int n,Dat dat) {if (n<0 || n>list->Length){return ERROR_LENGTH;}else{(list->listDat + n)->i = dat.i;return SUCCEED;}
}
以上就已经把这四个函数写完了。
- 代码验证
开始在主函数中验证以上代码。
#include <stdio.h>
#include "LinearList.h"void main()
{//创建顺序表SqList myList;(void)InitList(&myList, 6);//链表赋值Dat dat = { 4 };InputElem(&myList, 2, dat);//查看顺序表值Dat* datGet = FindList(&myList, 2);//输出值printf("%d", datGet->i);//销毁顺序表(void)DestoryList(&myList);
}
运行后发现没有问题。
完整代码
main.c
#include <stdio.h>
#include "LinearList.h"void main()
{//创建顺序表SqList myList;(void)InitList(&myList, 6);//链表赋值Dat dat = { 4 };InputElem(&myList, 2, dat);//查看顺序表值Dat* datGet = FindList(&myList, 2);//输出值printf("%d", datGet->i);//销毁顺序表(void)DestoryList(&myList);
}
LinearList.c
#include "LinearList.h"/************************************************
函数名称:顺序表初始化函数
函数介绍:创建一个新的指定大小的顺序表,并赋初值0
函数参数:SqList *list -- 要创建的顺序表的地址int length -- 要新建的顺序表的长度
返回类型:Status -- 状态类型INIT_SUCCEED -- 1
************************************************/
Status InitList(SqList* list,int length)
{list->listDat = (Dat*)malloc(sizeof(Dat) * length);list->Length = length;for (int i = 0; i < list->Length; i++){((list->listDat) + i)->i = 0;}return INIT_SUCCEED;
}/************************************************
函数名称:顺序表销毁函数
函数介绍:销毁指定的顺序表
函数参数:SqList *list -- 要销毁的顺序表的地址
返回类型:Status -- 状态类型INIT_SUCCEED -- 1
************************************************/
Status DestoryList(SqList* list)
{free(list->listDat);list->Length = 0;return DESTORY_SUCCEED;
}/************************************************
函数名称:顺序表赋值函数
函数介绍:对指定顺序表的指定位置赋值
函数参数:SqList *list -- 要赋值的顺序表的地址int n -- 要赋的值的下标(从0开始)Dat dat -- 要赋的值的结构体
返回类型:Status -- 状态类型SUCCEEED -- 1ERROR_LENGTH -- 0
************************************************/
Status InputElem(SqList* list, int n,Dat dat) {if (n<0 || n>list->Length){return ERROR_LENGTH;}else{(list->listDat + n)->i = dat.i;return SUCCEED;}
}/************************************************
函数名称:顺序表查看函数
函数介绍:查看顺序表的指定位置
函数参数:SqList *list -- 要查看的顺序表的地址int n -- 要查看的值的下标(从0开始)
返回类型:Dat* dat -- 数据结构体的地址特别的,若查找错误则返回NULL
************************************************/
Dat* FindList(SqList* list, int n)
{if (n<0 || n>list->Length){return NULL;}else{return (list->listDat + n);}
}
LinearList.h
#pragma once
#include <stdlib.h>#define INIT_SUCCEED 1 //状态码:初始化成功
#define DESTORY_SUCCEED 1 //状态码:销毁成功
#define SUCCEED 1 //状态码:成功
#define ERROR_LENGTH 0 //状态码:错误的长度typedef int Status; //状态码类型//顺序表的数据结构体
typedef struct Dat {int i;
}Dat;//顺序表结构体
typedef struct SqList {Dat* listDat; //顺序表数据的地址int Length; //顺序表长度
}SqList;//函数声明
Status InitList(SqList* list, int n); //顺序表初始化函数
Status DestoryList(SqList* list); //顺序表销毁函数
Status InputElem(SqList* list, int n, Dat dat); //顺序表赋值函数
Dat* FindList(SqList* list, int n); //顺序表查看函数
数据结构(C语言版)之线性表相关推荐
- 《数据结构C语言版》——线性表详解,你一定能够看得懂学得会的宝典
哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...
- 数据结构C语言版之线性表
//顺序表: #include<stdio.h> #include<stdlib.h> #define maxlength 20 #define listincreament ...
- c语言线性表拷贝,数据结构(C语言版)---线性表顺序存储表示
1.顺序表:线性表的顺序存储,用一组地址连续的存储单元存储线性表中的数据元素. 1) 特点:随机访问,即通过首地址和元素序号可在时间O(1)内找到指定元素. 表中元素的逻辑顺序与其物理顺序相同,线性表 ...
- 数据结构C语言实现系列——线性表(线性表链接存储(单链表))
#include <stdio.h> #include <stdlib.h> #define NN 12 #define MM 20 typedef int elemType ...
- c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解
<数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...
- 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码
一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...
- C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文
数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00 浏览量:763 手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...
- c语言 静态链表插入排序,数据结构C语言版 表插入排序
西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...
- 数据结构源码笔记(C语言):线性表的单链表示
/* LinkList.c*/ /*线性表的单链表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...
- 数据结构源码笔记(C语言):线性表的顺序表示
/* SeqList.c*/ /*线性表的顺序表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...
最新文章
- 多进程fork()函数
- Tailwind CSS 是一个工具集 CSS 框架
- 阿里云人脸识别sdk
- 持续集成部署Jenkins工作笔记0003---Web工程部署方式说明
- debian安装oracle java_如何在Ubuntu 18.04/18.10和Debian 9上安装Oracle Java 13
- SpringBoot 优雅停止服务的几种方法
- windows下python xgboost 安装方法以及安装了xgboost,pycharm却不能自动补全问题解决
- TPT中脚本评估的正确打开方式 (上):强大的内置函数库
- 比亚乔-截至2020年5月,全球两轮车销量同比下降21%
- PHP程序员战地日记
- python 大气污染物模型_Python AQI空气污染指数数据分析与机器学习
- c语言如何画简单图形,如何用C语言画基本图形
- word批量调整图片大小
- 聚焦Magik –最新的JVM语言
- mysql in个数限制_mysql where in 条件中参数个数问题
- 悦联 android auto,马自达6兼容Apple CarPlay和Android Auto系统 三款车载屏幕吸睛
- Ulua调用C#枚举
- manjaro安装搜狗拼音
- 解读UDS协议中NRC以及NRC优先级
- Linux安装gitlab教程