数据结构——顺序表的C语言代码实现
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
系列文章目录
数据结构——顺序表的C语言代码实现
数据结构——八种链表的C语言代码实现
数据结构——栈的C语言代码实现
数据结构——队列的C语言代码实现
数据结构——堆的C语言代码实现
文章目录
- 系列文章目录
- 前言
- 一、基础知识
- 1.顺序表的概念(Sequential List)
- 2.常用的接口函数
- 3.realloc()函数使用细节
- 4.assert( )函数
- 二、代码实现
- 1.SepList.h
- (1)引用函数库
- (2)定义动态顺序表
- (3)接口函数声明
- 2.SepList.c
- (1)引用头文件
- (2)初始顺序表
- (3)检测顺序表容量是否足够
- (4)顺序表的尾插法
- (5)顺序表的尾删法
- <1>使用if判断的温和法
- <2>使用assert()断言的暴躁法
- (6)全部删除
- (7)头插法
- (8)头删法
- (9)查找某个数值的位置
- (10)指定位置插入
- (11)指定位置删除
- (12)打印函数
- 3.test.c
- (1)引用头文件
- (2)各种测试函数
- (3)主函数
- 三、总结
前言
使用C语言实现顺序表,重点实现动态顺序表。加强模块化实现功能的能力,了解并熟练使用realloc(),assert()等函数。
一、基础知识
1.顺序表的概念(Sequential List)
鬼话:顺序表 就是把线性表中的所有元素按照其逻辑顺序,依次储存到从指定的储存位置开始的一块 连续 的储存空间中。
人话:自我理解,特殊的数组!即将连续的数据存储在数组中,注意连续性,不可跳跃式存储。
2.常用的接口函数
在进行数据结构的代码实现时,最常用的接口函数便是:增、删、查、改。
增:尾插、头插、指定位置插入;
删:尾删、头删、指定位置删除;
查:遍历查找;
改:先找后改;
3.realloc()函数使用细节
realloc()函数:
void* realloc (void* ptr, size_t size);
注意:
1.返回值是void*,实际使用中应合理使用强制类型转换;
2.size_t size 是字节数,即所需要开辟的空间大小,此处应和calloc()结合记忆,注意区别!
3.引用<stdlib.h>
戳此处,查看realloc函数标准形式
realloc()是C语言中最常用的扩容或缩容函数,其改变已开辟的内存空间大小的工作实质是:
在已有空间的末尾寻找空余的连续空间,若末尾的空余空间足够开辟,则便在此处进行开辟,返回的指针为原指针,即所开辟的空间的起始地址没有发生改变;若末尾的空余空间不足以开辟,则对已开辟空间所存储的内容进行拷贝,然后在内存的其它位置寻找足够大的连续空间进行开辟,而原有空间被系统释放,故此时该函数的返回值不再是原指针,即所开辟的空间的起始地址发生了改变;
但实际使用时,未避免引用过多指针,常使用以下方式进行操作:
(DataType*) ptr=(DataType*)realloc(p,sizeof(DataType)*size_t);
if(ptr!=NULL)p=ptr;
4.assert( )函数
assert()函数:
void assert (int expression);
戳此处,查看assert()函数标准形式
注意引用<assert.h>
条件为真,继续向下执行;
条件为假,终止程序。
二、代码实现
1.SepList.h
(1)引用函数库
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
(2)定义动态顺序表
建议遵循命名规则,将动态数组命名为arr等名字,p总是带来误解,但我懒得改了。。。
typedef int SLDataType;
//便于更改所存储数据的类型
typedef struct SeqLIst
{SLDataType* p;int size;int capacity;
}SL;
(3)接口函数声明
注意在设计接口函数时应使用传址的参数
//初始顺序表
void SeqListInit(SL* ps);//顺序表的尾插法
void SeqListPushBack(SL* ps, SLDataType n);//顺序表的尾删法
void SeqListPopBack(SL* ps);//顺序表的头插法
void SeqListPushFront(SL* ps, SLDataType n);//顺序表的头删法
void SeqListPopFront(SL* ps);//查找顺序表中的数据位置
int Find(SL* ps,SLDataType n);//指定位置插入
void SeqListInsert(SL* ps, int location, SLDataType n);//指定位置删除
void SeqListDelete(SL* ps, int location);//检测顺序表容量是否足够
void CheckCapacity(SL* ps);//接口函数测试函数
void PrintSeqList(SL* ps);//删除顺序表
void DestroySeqList(SL* ps);
2.SepList.c
此文件用于实现各接口函数。
(1)引用头文件
#include"SeqList.h"
(2)初始顺序表
//初始顺序表
void SeqListInit(SL* ps)
{(*ps).p = NULL;ps->capacity = 0;ps->size = 0;
}
(3)检测顺序表容量是否足够
//检测顺序表容量是否足够
void CheckCapacity(SL* ps)
{//进行扩容,两种情况:1.没有开辟空间;2.容量用尽if (ps->size == ps->capacity){int Newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* ptr = (SLDataType*)realloc(ps->p, sizeof(SLDataType) * Newcapacity);if (ptr != NULL)//扩容成功ps->p = ptr;else{printf("realloc fail !");//异常退出,终止程序,使用return的话,只是退出该函数exit(-1);}ps->capacity = Newcapacity;}
}
(4)顺序表的尾插法
//顺序表的尾插法
void SeqListPushBack(SL* ps, SLDataType n)
{CheckCapacity(ps);ps->p[ps->size] = n;ps->size += 1;
}
(5)顺序表的尾删法
<1>使用if判断的温和法
void SeqListPopBack(SL* ps)
{if(ps->size>0)ps->size--;
}
<2>使用assert()断言的暴躁法
何为暴躁?
assert(条件)条件为假,直接终止函数!
void SeqListPopBack(SL* ps)
{assert(ps->size>0)ps->size--;
}
(6)全部删除
//删除顺序表
void DestroySeqList(SL* ps)
{free(ps->p);//防止该指针成为野指针ps->p = NULL;ps->capacity = ps->size = 0;
}
(7)头插法
//顺序表的头插法
void SeqListPushFront(SL* ps, SLDataType n)
{CheckCapacity(ps);//用前值覆盖后值,实现整体后移,必须从后向前两两操作ps->size += 1;int end = ps->size - 1;while (end > 0){//实现插入前的数组的整体后移ps->p[end] = ps->p[end - 1];end--;}ps->p[0] = n;
}
(8)头删法
//顺序表的头删法
void SeqListPopFront(SL* ps)
{ assert(ps->size > 0);//将已有数组整体前移int head = 0;while (head < ps->size - 1){ps->p[head] = ps->p[head + 1];head++;}ps->size--;
}
(9)查找某个数值的位置
int Find(SL* ps, SLDataType n)
{if (ps->size == 0){printf("顺序表为空!\n");exit(-1);}int tem = 0;while (tem < ps->size){if (ps->p[tem] == n){return tem;}tem++;}printf("顺序表中没有该值!\n");return -1;
}
(10)指定位置插入
注意判断所要插入的位置,进而合理使用已有的接口函数,该程序设计中输入的位置是从1开始的!
//指定位置插入
void SeqListInsert(SL* ps, int location,SLDataType n)
{//因为输入的位置是从1开始数的int L = location - 1;//确保所要插入的位置合法assert(L>=0&&L<=ps->size);//确保顺序表不为空assert(ps->size > 0);CheckCapacity(ps);//如果插入位置在头部if (L == 0){SeqListPushFront(ps, n);}//如果插入位置在尾部else if (L == ps->size){SeqListPushBack(ps, n);}//如果插入位置在已有数组内部else{ps->size++;int temend = ps->size - 1;while (temend > L){ps->p[temend] = ps->p[temend - 1];temend--;}ps->p[L] = n;}
}
(11)指定位置删除
//指定位置删除
void SeqListDelete(SL* ps, int location)
{int L = location - 1;//确保输入的位置合法assert(L>=0&&L<=ps->size-1);//确保顺序表不为空assert(ps->size > 0);if (L == 0){SeqListPopFront(ps);}else if (L == ps->size - 1){SeqListPopBack(ps);}else{int temend = L;while (temend < ps->size - 1){ps->p[temend] = ps->p[temend+1];temend++;}ps->size -= 1;}
}
(12)打印函数
//接口函数测试
void PrintSeqList(SL* ps)
{int i = 0;for (i = 0; i < ps->size; i++){printf("%d ", ps->p[i]);}}
3.test.c
该文件用于存放主函数,本程序只研究如何代码实现顺序表,故多为测试语句,不具有参考价值。具体使用时,可在此处代码实现菜单功能!
(1)引用头文件
#include"SeqList.h"
(2)各种测试函数
该处无参考价值,大家随意设置
void testSeqList()
{SL sl;SeqListInit(&sl);SeqListPushBack(&sl, 1);SeqListPushBack(&sl, 2);SeqListPushBack(&sl, 3);SeqListPushBack(&sl, 4);/*SeqListPopBack(&sl,5);SeqListPushFront(&sl, 0);*///用来测试接口函数PrintSeqList(&sl);DestroySeqList(&sl);
}
void testSeqListPushFront()
{SL sl;SeqListInit(&sl);SeqListPushFront(&sl, 1);SeqListPushFront(&sl, 2);SeqListPushFront(&sl, 3);SeqListPushFront(&sl, 4);SeqListPopFront(&sl);//int ret=Find(&sl, 2);PrintSeqList(&sl);/* printf("\n");printf("%d", ret);*/SeqListDelete(&sl,3);PrintSeqList(&sl);}
(3)主函数
亦无实际价值
int main()
{//testSeqList();testSeqListPushFront();return 0;
}
三、总结
数据结构的学习在于实际操作,大学课堂的教学偏向于理论学习,如若只是浅尝辄止地了解一些名词概念毫无作用,故特此逐一实现数据结构的C语言代码,进而鞭策自己迎难而上!
与君共勉!
数据结构——顺序表的C语言代码实现相关推荐
- 数据结构 - 线性表(顺序表)C语言代码实现-处理整型数据(附详细解释)。 _清风明月
#include <stdio.h> #include <conio.h> //conio是Console Input / Output(控制台输入输出)的简写,其中定义了通过 ...
- 室友一把王者的时间我拿捏了数据结构——顺序表(C语言版)
话不多说,先上整体动态顺序表实现的代码给大家 SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h> ...
- 数据结构-顺序表(C语言实现)
主函数代码(main.c) #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "sqlist.h&quo ...
- 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码
数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...
- C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...
c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...
- rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...
- C语言/C++常见习题问答集锦[八十三]之数据结构顺序表(operand types are error: no match for “operator==“)
C语言/C++常见习题问答集锦[八十三]之数据结构顺序表{operand types are error: no match for "operator=="} 程序之美 前言 主 ...
- python代码大全表解释-Python中顺序表的实现简单代码分享
顺序表python版的实现(部分功能未实现) 结果展示: 代码示例: #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object ...
- c语言实现顺序表源程序,C语言实现静态顺序表的实例详解
C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. ...
- Educoder头歌数据结构顺序表及其应用
头歌实践平台答案educoder 数据结构-顺序表及其应用 第1关:顺序表的实现之查找功能 /***************************************************** ...
最新文章
- POJ 3723 Conscription 最小生成树
- Oracle 存储过程入门
- Numbers on the Chessboard
- mybatis-plus分页查询_SpringBoot + MyBatisPlus 快速入门
- wpf项目中类库内新建用户控件和自定义控件的问题
- 五道口服装市场关闭前 职业“甩货人”赚一笔
- 总结接口和抽象类的异同
- 各种调试接口(SWD、JTAG、Jlink、Ulink、STlink)的区别
- Word下修改默认新建样式模板方法
- 洛谷P3939填颜色
- UVA - 10827 Maximum sum on a torus(dp最大子矩阵和)
- 【译】3D打印:介绍
- vba 输出文本 m Linux,利用VBA实现EXCEL数据输出TXT等文本文件
- 怎样通过其他下载工具下载某盘文件
- pandas实现分类汇总--小计,总计
- C语言经典面试题 - 字母的大小写转化
- 模型评价 - 回归模型的常用评价指标
- 单片机外围电路设计之三:电感
- java xsd校验xml文件
- 为什么现在的年轻人动不动就离职