一、预备知识(先说到这么多,具体问题和所需的内容在后面的编程中再说)

1、开发环境和开发语言:
环境:visual studio 2019
语言:C
2、形参的生命周期(一定要明白形参的生存周期,特别、特别、特别的重要,许多分析问题的时候都会用到这个东西):
形参会在调用函数时,开辟内存空间,在调用函数并且函数执行结束后会自动收回开辟的内存空间,不管开辟的形参是普通变量(值传递)还是指针变量(地址传递)都会被收回。即被 “释放”。
3、函数参数的传递:

值传递:即将实参(普通变量或常量)做一份备份赋值给形参(普通变量)。

地址传递:同样也是将实参(指针或指针变量)做一份备份赋值给形参(指针变量),但区别的是此时实参和形参都是指向同一空间的。

引用传递:引用传递是C++新增加的参数传递方式,在本实验中不会使用,但是要特别注意许多书籍中都有使用引用传递.而在我们使用c语言编程(特别是源文件的后缀名是“.c”)的时候使用引用传递的时候是会报错的(不知道其他IDE会不会,但visual studio2019肯定会),因为c语言是没有引用传递的。所以此处要特别注意。而引用传递就是在形参的前面加上&符号,标识该形参是实参(实参必须是变量不能是常量,只能给变量取别名,不能给常量取别名)的引用(或别名),此时调用函数时就会给实参取上名为形参的别名。

二、准备工作

1、先创建好工程项目,源文件的后缀名可以为C也可以为C++

2、数据结构准备和常用信息的定义

//引入相关头文件
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义常用的宏常量
#define OVERFLOW -1
#define OK 1
#define ERROR 0
//空间初始分配量,为了检验空间扩展,初值取小一点
#define MAXSIZE 6
//空间分配增量
#define INCREMENT 10//定义相关的新数据类型
typedef int Status;//
typedef int ElemType;
//定义用于存放线性表的数据结构体
typedef struct {ElemType* elem;//用于存放空间基地址int length;//当前顺序表中实际元素的个数int listsize;//当前所分配的存储容量
}SqList;

3、方法清单:

//初始化顺序表的方法
Status InitList01(SqList *L)//将新元素e插入到顺序表L的第i个位置上
//方法的三个参数,顺序表的地址,插入的位置,插入的元素
Status InsertList(SqList *L,int i, ElemType e)//查找数据元素,返回该元素的下标
int SearchList(SqList L, ElemType e)//删除顺序表中指定的元素出现第一次的值
//删除成功返回元素出现的位置,否则返回-1
int Del_List1(SqList L, ElemType e) //删除顺序表中的第i个元素,被删除的元素用e带回
Status Del_list2(SqList L, int i, ElemType* e) //打印顺序表中的元素
void PrintList(SqList* L)

三、方法实现

一、初始化方法:主要实现对传递过来的顺续表进行初始化,

方法功能:
1、开辟数组空间,
2、初始当前顺序表长度
3、初始顺序的容量

Status InitList01(SqList *L){ L->elem = (ElemType *)malloc(MAXSIZE * sizeof(ElemType));if (L->elem == NULL) exit(OVERFLOW);//设置数组中的数据为0个元素L->length = 0;//设置数组的长度,由于上面开辟的空间共MAXSIZE个故而,此处的值也该为MAXSIZE个L->listsize = MAXSIZE;return OK;
}

二、插入方法:将新元素e插入到顺序表L的第i个位置上

方法功能:
1、检测用户输入的i值是否合法,
2、当数组中的元素已经满了,需要重新开辟新空间,并将原来数组中的内容复制到新数组中(这也是顺序表的一大弊端,当空间不够时需要重新开辟空间,并将原来的内容复制到新数组中,大大增加了了运行时间)
3、移动元素使i之后的元数全部后移一位(顺序表的另一弊端需要移动元素,增大开销)
4、将元素插入到i所指的空间,并修改length的值
知识点:这个方法中用到了realloc函数,该函数有两个参数,第一个参数:原来的地址(基地址),第二个参数:要开辟多大的空间

//将新元素e插入到顺序表L的第i个位置上
//方法的三个参数,顺序表的地址,插入的位置,插入的元素
Status InsertList(SqList *L,int i, ElemType e) {//检测用户输入的数据是否合法if (i<1 || i>L->length + 1)return ERROR;//用于暂存数组的新地址ElemType* p=NULL;//控制数组下标int j;//判断顺序表是否已满,若满,需要重新分配空间,并更新相关的数据项if (L->length >= L->listsize) {p = (ElemType*)realloc(L->elem, (L->listsize + INCREMENT) * sizeof(ElemType));if (p == NULL) exit(OVERFLOW);L->elem = p;L->listsize += INCREMENT;}//插入数据//1、移动数据元素for (j = L->length - 1; j >= i - 1; j--)L->elem[j + 1] = L->elem[j];//2、插入新元素L->elem[j + 1] = e;//3、修改length的值L->length++;return OK;
}

查找元素,并返回其下标

方法功能:通过将e和数组元素依次对比,若找到则返回该数组元素的下标,否则返回-1,表示没有找到

//查找数据元素,返回该元素的下标
int SearchList(SqList L, ElemType e) {int i;for (i = 0; i < L.length; i++)if (L.elem[i] == e)return ++i;return -1;
}

删除方法一:删除顺序表中指定的元素e在数组中第一次出现的元素

方法功能:
1、移动下标i使之指到元素和e相同的元素
2、删除元素,将该元素后面的全部元素向向前移动一位即可实现对该元素的删除,最后修改length的值

//删除顺序表中指定的元素出现第一次的值
//删除成功返回元素出现的位置,否则返回-1
int Del_List1(SqList L, ElemType e) {int i, j;for (i = 0; i < L.length; i++)if (L.elem[i] == e)break;if (i < L.length) {for (j = i; j < L.length; j++)L.elem[j] = L.elem[j + 1];L.length--;return ++i;}return -1;
}

删除方法二;删除顺序表中的第i个位置元素,并由e带回该元素

方法功能:
1、判断用户输入的数据是否合法,即是否大于数组的最大下标或者小于数组的最小下标
2、将下标i的内容赋值给*e
2、将i之后的元素全部向前移动一个位置,最后修改length的值

//删除顺序表中的第i个元素,被删除的元素用e带回
Status Del_list2(SqList L, int i, ElemType* e) {if (i<1 || i>L.length)return ERROR;int j;*e = L.elem[i - 1];for (j = i; j < L.length; j++) L.elem[j - 1] = L.elem[j];L.length--;return OK;
}

打印顺序表

方法功能:实现顺序的输出

//打印顺序表中的元素
void PrintList(SqList* L) {int i;if (L->length == 0)printf("当前的顺序表为空表\n");printf("当前顺序的状态如下:\n");for (i = 0; i < L->length; i++)printf("%d ", L->elem[i]);printf("\n");
}

四、测试代码和测试结果

在测试这里我多bb两句:你可以将每个功能的测试写成一个函数,然后在主函数中调用测试即可,这种方式更直观也更便于调试。也可以直接在主函数种直接写测试代码,但维护就测试就比较麻烦一点,还需要理清方法之间的先后顺序等等。。。但可以偷懒

测试初始化方法;

     SqList L;int i;int j = 1;int e;//测试初始化i = InitList01(&L);if ( i==OK)printf("初始化成功\n");elseprintf("初始化失败\n");

测试结果:

测试插入方法:

当输入-1时候表示插入完成,并退出插入,每插入一个数据后都会打印当前顺序表的状态

//测试插入功能while (1){printf("请输入一个数据进行插入;");scanf_s("%d", &e);if (e == -1)break;i = InsertList(&L, j, e);if (i == OK)printf("插入成功\n");elseprintf("插入失败\n");j++;PrintList(&L);}

测试结果

测试查询功能和删除功能

//测试查找功能int result;printf("请输入一个数据进行查找;");scanf_s("%d", &e);printf("查询的结果:%d\n", SearchList(L, e));//测试删除功能并返回指定元素while (1){printf("请输入一个数据进行删除;");scanf_s("%d", &e);if (e == -1)break;i = Del_List1(L, e);if (i != -1) {printf("删除成功\n");printf("删除元素的位置是:%d\n", i);}elseprintf("删除失败\n");j++;PrintList(&L);}//测试删除功能删除指定位置的元素,并返回该位置的元素while (1) {printf("请输入一个索引删除:");scanf_s("%d", &j);if (j == -1)break;i = Del_list2(L, j, &e);if (i == OK) {printf("删除成功\n");printf("被删除的元素是:%d\n", e);}elseprintf("删除失败\n");}

测试结果

小小的总结

今天的内容就是上面的内容。由于水平有限还有许多不足的地方还请谅解(轻点喷。。。),当然有错误的地方或者更优秀的算法可以一起讨论(等你哦。。。亲)。

C语言--实现顺序表的基本操作相关推荐

  1. 顺序表的基本操作(C语言)

    1.要求 编程实现顺序表的基本操作,并设计一个菜单调用. ①建立(初始化).遍历.取值.查找.插入.删除 ②判空.求元素个数.前驱.后继.置为空表.销毁 2.分析 我们需要去定义一个结构体(以下代码的 ...

  2. c语言顺序表的基本操作

    该代码段包含了几种比较常见的顺序表的基本操作,有:求表长,按位取值,按值取位,插入和删除几种方式: #include <stdio.h> #define listsize 100typed ...

  3. 【头歌】顺序表的基本操作

    第1关:顺序表的插入操作 任务描述 本关任务:编写顺序表的初始化.插入.遍历三个基本操作函数. 相关知识 顺序表的存储结构 顺序表的存储结构可以借助于高级程序设计语言中的数组来表示,一维数组的下标与元 ...

  4. 线性表-顺序表的基本操作

    线性表的定义和特点 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列 线性表中元素的个数n(n≥0)称为线性表的长度 空表:n=0 对于非空的线性表或线性结构,特点为: 存在唯一的一个被称作& ...

  5. C语言实现顺序表(顺序存储结构)

    顺序表(顺序存储结构)及初始化过程详解 顺序表,全名顺序存储结构,是线性表的一种.通过<线性表>一节的学习我们知道,线性表用于存储逻辑关系为"一对一"的数据,顺序表自然 ...

  6. C++:顺序表的基本操作(待完善)

    根据命令提示进行顺序表的基本操作(待完善) #include<iostream> #include<algorithm> using namespace std; #defin ...

  7. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  8. c语言实现顺序表源程序,C语言实现静态顺序表的实例详解

    C语言实现静态顺序表的实例详解 线性表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. ...

  9. C语言-查找顺序表中的最大值

    [问题描述] 编写算法:在顺序表中查找最大值,输出最大值及其在顺序表中的位置(若出现多个相同最大值,位置为第一次出现的) [输入形式] 输入若干个整数建立顺序表.(若输入整数个数为0,则表示建立空表) ...

最新文章

  1. 宏基因组学习交流4群成立
  2. Gartner 2019年超融合魔力象限:新增深信服,国内华为、华云在榜
  3. 佩恩:京奥了不起 10年后“水落石出”
  4. 外网无法访问hdfs文件系统
  5. python在线课程价格-杭州python课程价格
  6. 《深度探索C++对象模型》--2 构造函数语意学
  7. Linux操作(5)——创建硬链接与软链接
  8. 计算机软件中级职称 入职,计算机职调称论文.doc
  9. 对X264/FFMPEG架构探讨---感觉不错
  10. 【转】excel表格导出集锦repeater实用,和普通用法
  11. python 使用期物处理并发
  12. RabbitMQ+haproxy+keeplived 高可用负载均衡+镜像集群模式_集成负载均衡组件 Ha-Proxy_02
  13. 详解Python中函数和模块的特殊属性__annotations__
  14. fastjson maven依赖_Spring Boot 使用 Maven 定制一个 parent 简化开发
  15. Maven的性质与部署整理
  16. 【Python】改变对象的字符串显示
  17. 两种方式打开jar文件
  18. 通俗易懂的方式讲解最大流和最小割问题
  19. HTML转PDF字体的坑,搞了半天
  20. 牛客网 月出皎兮,佼人僚兮。 树上启发式合并

热门文章

  1. 密码加盐(salt)
  2. OpenStack-Placement组件部署-----T版
  3. 首家完成并购并进行重新备案公示的企业征信牌照公司-湖南省征信
  4. 练习2-7 编写一个函数invert(x,p,n),该函数返回对x执行下列操作后的结果:将x从第p位开始的n个(二进制)位求反(即1变成0,0变成1),x的其余各位保持不变。
  5. Android通用流行框架大全,零基础入门学习android
  6. Matlab之保存/写矩阵数据到文本(fprintf, save, dlmwrite)
  7. vue使用prop通信出错:Avoid mutating a prop directly since the value will be overwritten whenever the parent
  8. admin.php生成地址,FastAdmin隐藏后台登录入口地址的方法
  9. 网络编程中的基本概念
  10. APP指的是智能手机的第三方应用