参考严蔚敏数据结构
编译环境:vc++6.0

1. 顺序表:顺序表是在计算机内存中以数组的形式保存的线性表。
2. 头指针:不是头结点的指针,是指向头结点的指针,无论链表是否为空,头指针均不为空。
3. 头结点:放在第一个结点之前的结点(“零结点”),数据域可以不存放东西,也可以存放链表信息(如链表长度)

逻辑结构图示(百度)

总共12大操作

  1. 初始化InitList(*L); //构造空线性表L
  2. 销毁DestoryList(*L); //销毁线性表L
  3. 清空ClearList(*L); //清空线性表L
  4. 判表空ListEmpty(L); //判断线性表是否为空
  5. 求表长Length(L); //求线性表元素个数
  6. 按位查找GetElem(L,i,*e); //查找位序为i的元素,用e返回
  7. 按值查找LocateElem(L,e); //查找元素e,返回第一次出现的位序
  8. 求前驱PriorElem(L, cur_e,*pre_e); //用pre_e返回cur_e的前驱
  9. 求后继NextElem(L,cur_e,*next_e);//用next_e返回cur_e的后继
  10. 插入ListInsert( *L, i, e); //将元素e插入的位置i;
  11. 删除ListDelete(*L, i,*e); //删除位置i的元素,用e返回其值
  12. 遍历(输出)ListTraverse(L); //遍历访问整个表L

顺序存储结构

typedef struct                   //顺序表存储结构
{int* elem;                          //动态分配空间的首地址,int length;                             //线性表当前长度int listsize;                      //线性表最大长度
}SqList;

初始化InitList(*L)

int InitList(SqList *L)                                   //初始化操作
{L->elem = (int*)malloc(MAX * sizeof(int));             //动态分配内存if (!L->elem){printf("动态分配内存失败\n");exit(0);}L->length = 0;                             //初始化长度为0L->listsize = MAX;                         //初始化大小为MAXreturn 0;
}

销毁DestoryList(*L)

int DestoryList(SqList* L)               //销毁操作
{if (L->elem)        free(L->elem);      //释放空间L->elem = NULL;         //指针指空return 0;
}

清空ClearList(*L)

int ClearList(SqList* L)              //清空操作
{L->length = 0;return 0;
}

判表空ListEmpty(L)

int ListEmpty(SqList L)                      //判断是否为空操作
{if (L.length == 0)return 1;         elsereturn 0;
}

求表长Length(L)

int Length(SqList L)
{return L.length;
}

按位查找GetElem(L,i,*e)

int GetElem(SqList L, int i, int* e)         //按位序查找操作
{if (i<1 || i>L.length){printf("位置%d不合法\n", i);return 0;}else{printf("元素值为%d\n", L.elem[i - 1]);return *e = L.elem[i - 1];}
}

按值查找LocateElem(L,e)

int LocateElem(SqList L,int e)                   //按位置查找操作
{int i, flag=1;                               //flag标志,没找到为1for (i = 0; i < L.length; i++)if (L.elem[i] == e){flag = 0;printf("所查元素位序为%d", i + 1);return i + 1;                            //找到返回位置序号}if (flag)printf("查询无果");return 0;                                      //失败返回0
}

求前驱PriorElem(L, cur_e,*pre_e)

int PriorElem(SqList L, int cur_e, int* pre_e)                    //求前驱操作
{int i, k=-1;                                                //k存放cur_e的前驱数组坐标,初始化值为-1for (i = 0; i < L.length; i++)if (L.elem[i] == cur_e){k = i - 1;break;}if (k > -1)                                                         //有前驱{*pre_e = L.elem[k];printf("前驱元素为%d\n", *pre_e);return pre_e;}else                                                             //无前驱{printf("查询无果\n");return 0;}
}

求后继NextElem(L,cur_e,*next_e)

int NextElem(SqList L,int cur_e, int *next_e)            //求后继操作
{int i, k=-1;                                           //k存放cur_e的后继数组坐标,初始值为-1       for(i=0;i<L.length;i++)if (L.elem[i] == cur_e){k = i + 1;break;}if (k > 0 && k < L.length)                         //没有元素后继坐标为0,最后一个元素也没有后继{*next_e = L.elem[k];printf("后继元素为%d\n",*next_e);return *next_e;}else                                                              //无后继{printf("查询无果\n");return 0;}
}

插入ListInsert( *L, i, e)

int ListInsert(SqList* L, int i, int e)           //插入操作
{if (i<1 || i>L->length+1){printf("插入位置%d不合法\n", i);return 0;}if (L->length == L->listsize)             //顺序表已满{printf("顺序表已满,插入失败\n");return 0;}                                    for (int k = L->length; k > i-1; k--)    //位置i和之后的元素全部后移L->elem[k] = L->elem[k - 1];L->elem[i - 1] = e;L->length++;                               //当前长度加一return e;
}

删除ListDelete(*L, i,*e)

int ListDelete(SqList* L, int i, int* e)          //删除操作
{if (i<1 || i>L->length){printf("位置%d不合法\n", i);return 0;}*e = L->elem[i-1];for (int k = i - 1; k < L->length; k++)//位置i和之后的元素全部前移L->elem[k] = L->elem[k + 1];L->length--;return *e;
}

遍历(输出)ListTraverse(L)

int ListTraverse(SqList L)      //遍历所有元素
{if (ListEmpty(L)){printf("顺序表为空\n");return 0;}for (int i = 0; i < L.length; i++)printf("%-5d", L.elem[i]);return 0;
}

所有模块集成一起测试代码如下:
注:所有操作都必须在初始化操作之后执行,编译环境vc++6.0

#include <stdio.h>
#include <stdlib.h>
#define MAX 10typedef struct                   //顺序表存储结构
{int* elem;                          //动态分配空间的首地址,int length;                             //线性表当前长度int listsize;                      //线性表最大长度
}SqList;int InitList(SqList *L);                            //构造空线性表L
int DestoryList(SqList* L);                         //销毁线性表L
int ClearList(SqList* L);                       //清空线性表L
int ListEmpty(SqList L);                        //判断线性表是否为空
int Length(SqList L);                               //求线性表元素个数
int GetElem(SqList L,int i, int *e);                    //查找位序为i的元素,用e返回
int LocateElem(SqList L, int e);                    //查找元素e,返回第一次出现的位序
int PriorElem(SqList L, int cur_e,int  *pre_e);     //用pre_e返回cur_e的前驱
int NextElem(SqList L,int  cur_e,int *next_e);          //用next_e返回cur_e的后继
int ListInsert(SqList* L,int i, int e);          //将元素e插入的位置i;
int ListDelete(SqList* L,int i, int *e);            //删除位置i的元素,用e返回其值
int ListTraverse(SqList L);                      //遍历访问整个表L
int menu();                                         //菜单int main()
{SqList L;int i, e, pre_e, next_e;                  //i存放位序,e存放元素值, pre_e存放e的前驱,next_e存放e的后继int option;menu();do{printf("\n输入选项:\n");scanf("%d", &option);switch (option){case 1:InitList(&L);printf("初始化成功\n");break;case 2:DestoryList(&L);printf("销毁成功\n");break;case 3:ClearList(&L);printf("清空成功\n");break;case 4:if (ListEmpty(L))                                  //返回值为1为空printf("线性表为空\n");elseprintf("线性表不为空\n");break;case 5:printf("线性表当前长度为%d\n", Length(L));break;case 6:printf("输入查找位序i\n");scanf("%d", &i);GetElem(L, i, &e);break;case 7:printf("输入要查找的元素e\n");scanf("%d", &e);LocateElem(L, e);break;case 8:printf("输入要查找的元素e\n");scanf("%d", &e);PriorElem(L, e, &pre_e);break;case 9:printf("输入要查找的元素e\n");scanf("%d", &e);NextElem(L, e, &next_e);break;case 10:printf("输入插入位序i和元素e\n");scanf("%d%d", &i, &e);if (i < 1 || i > L.length + 1){printf("插入位序非法\n");break;}ListInsert(&L, i, e);break;case 11:printf("输入需要删除的位序i\n");scanf("%d", &i);if (i < 1 || i > L.length){printf("删除位序非法\n");break;}e = ListDelete(&L, i, &e);printf("删除后\n");ListTraverse(L);printf("\n删除元素为%d\n", e);break;case 12:printf("遍历结果为:\n");ListTraverse(L); break;case 13: break;default:printf("输入选项不合法\n");break;}} while (option != 13);                                    //option==13退出return 0;
}
int InitList(SqList *L)                                  //初始化操作
{L->elem = (int*)malloc(MAX * sizeof(int));             //动态分配内存if (!L->elem){printf("动态分配内存失败\n");exit(0);}L->length = 0;                             //初始化长度为0L->listsize = MAX;                         //初始化大小为MAXreturn 0;
}int DestoryList(SqList* L)             //销毁操作
{if (L->elem)        free(L->elem);      //释放空间L->elem = NULL;         //指针指空return 0;
}int ClearList(SqList* L)                //清空操作
{L->length = 0;return 0;
}int ListEmpty(SqList L)                        //判断是否为空操作
{if (L.length == 0)return 1;         elsereturn 0;
}int Length(SqList L)
{return L.length;
}int GetElem(SqList L, int i, int* e)           //按位序查找操作
{if (i<1 || i>L.length){printf("位置%d不合法\n", i);return 0;}else{printf("元素值为%d\n", L.elem[i - 1]);return *e = L.elem[i - 1];}
}int LocateElem(SqList L,int e)                 //按位置查找操作
{int i, flag=1;                               //flag标志,没找到为1for (i = 0; i < L.length; i++)if (L.elem[i] == e){flag = 0;printf("所查元素位序为%d", i + 1);return i + 1;                            //找到返回位置序号}if (flag)printf("查询无果");return 0;                                      //失败返回0
}int PriorElem(SqList L, int cur_e, int* pre_e)                  //求前驱操作
{int i, k=-1;                                                //k存放cur_e的前驱数组坐标,初始化值为-1for (i = 0; i < L.length; i++)if (L.elem[i] == cur_e){k = i - 1;break;}if (k > -1)                                                         //有前驱{*pre_e = L.elem[k];printf("前驱元素为%d\n", *pre_e);return *pre_e;}else                                                                //无前驱{printf("查询无果\n");return 0;}
}int NextElem(SqList L,int cur_e, int *next_e)          //求后继操作
{int i, k=-1;                                           //k存放cur_e的后继数组坐标,初始值为-1       for(i=0;i<L.length;i++)if (L.elem[i] == cur_e){k = i + 1;break;}if (k > 0 && k < L.length)                         //没有元素后继坐标为0,最后一个元素也没有后继{*next_e = L.elem[k];printf("后继元素为%d\n",*next_e);return *next_e;}else                                                              //无后继{printf("查询无果\n");return 0;}
}int ListInsert(SqList* L, int i, int e)           //插入操作
{if (i<1 || i>L->length+1){printf("插入位置%d不合法\n", i);return 0;}if (L->length == L->listsize)             //顺序表已满{printf("顺序表已满,插入失败\n");return 0;}                                    for (int k = L->length; k > i-1; k--)    //位置i和之后的元素全部后移L->elem[k] = L->elem[k - 1];L->elem[i - 1] = e;L->length++;                               //当前长度加一return e;
}int ListDelete(SqList* L, int i, int* e)          //删除操作
{if (i<1 || i>L->length){printf("位置%d不合法\n", i);return 0;}*e = L->elem[i-1];for (int k = i - 1; k < L->length; k++)//位置i和之后的元素全部前移L->elem[k] = L->elem[k + 1];L->length--;                  //表长减1          return *e;
}int ListTraverse(SqList L)      //遍历所有元素
{if (ListEmpty(L)){printf("顺序表为空\n");return 0;}for (int i = 0; i < L.length; i++)printf("%-5d", L.elem[i]);return 0;
}int menu()
{printf("\n\n\n**************************************菜单**********************************************\n");printf("****************************************************************************************\n");printf("**********1、    初始化InitList(*L),                    2、销毁DestoryList(*L)**********\n");printf("**********3、    清空ClearList(*L) ,                   4、判表空ListEmpty(L)**********\n");printf("**********5、  求表长Length(L),                   6、按位查找GetElem(L,i,*e)**********\n");printf("**********7、  按值查找LocateElem(L,e),            8、求前驱PriorElem(L, cur_e,*pre_e)**********\n");printf("**********9、    求后继NextElem(L,cur_e,*next_e),       10、插入ListInsert(*L, i, e)**********\n");printf("**********11、 删除ListDelete(*L, i,*e),             12、遍历(输出)ListTraverse(L)**********\n");printf("**********13、退出\n");return 0;
}

测试案例

C语言顺序表的12个基本操作(增删改查等)相关推荐

  1. mysql 修改库的校对集_mysql数据库的基本操作(增删改查、字符集、校对集)

    MySQL数据库概述 MySQL数据库是经典的关系型数据库管理系统,MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Dat ...

  2. Mysql —— C语言链接mysql数据库,实现可以增删改查的角色权限登录系统

    /******************************************************************** * 标题:C语言链接mysql数据库,实现可以增删改查的角色 ...

  3. go语言学习第八天==》mysql数据库增删改查、用go语言 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求

    go语言学习第八天==>mysql数据库增删改查.用go语言写 客户端(client)发起htttp get请求,post请求,postForm请求,Head请求,Do请求 引包 import的 ...

  4. 数据结构(C语言)顺序表的定义及基本操作

    顺序表的定义及基本操作 一.数据结构:顺序表的定义,创建,基本运算,实现 二.全部代码 定义顺序表 #include<stdio.h> #include<malloc.h> # ...

  5. mongodb基本操作=增删改查

    这两天总算清闲下来了,这里只介绍mongodb的一些基本增删改查,从大到小,从数据库到下面的集合表等,这里推荐一个mongodb的可视化工具Robo3T,在上面操作增删改查使用起来也简单 数据库相关的 ...

  6. oracle将查询结果声明为伪表,Oracle查询操作(增删改查,伪表,高级查询)实例讲解...

    SQL查询操作:增删改查 一.SQL操作符 算术操作符 + - * / 比较操作符 = != < > <= >= BETWEEN--AND IN LINK IS NULL 逻辑 ...

  7. crmeb从创建数据表到实现最基础增删改查的实现全过程【带附件】

    很多使用了 CRMEB 单商户系统的童鞋在进行二开的时候,都会遇到新建了数据表之后不知道对数据表怎么进行操作.那么,这篇文章将带你完整的实现一遍,以后就不会怕啦. 创建数据表 就以最简单的为例,创建一 ...

  8. c语言实现双链表的基本操作—增删改查

    //初始化 Node*InitList() {Node*head=(Node*)malloc(sizeof(Node));if(NULL==head){printf("内存分配失败!&quo ...

  9. MySQL基础(三)表关系及数据的增删改查

    这一部分主要使用SQL中的DML,数据库操作语言(data manipulation language),对数据库数据进行增.删.改.查操作,作为前提,先介绍关系型数据库中的表关系. 关系型数据库(R ...

  10. Oracle数据库 登录命令 用户管理 建表 修改字段 数据类型 约束 增删改查

    什么是数据库? 存储数据的仓库 优点: 1.可存储大量数据 2.方便检索 3.保持数据的一致性.完整性 4.安全,可共享 解决的问题? 数据的持久化(把数据写到磁盘中) 安装看安装文档: 口令管理: ...

最新文章

  1. SqlSessionFactoryBean的构建流程
  2. 推荐本人微博及浅谈发博原则
  3. 2020各省份大学排名出炉!
  4. @Accessors
  5. JAVA多线程学习小结
  6. AI: DL方法与问题空间探索
  7. 云服务器,Linux上安装xampp,搭建node服务,云服务器Firewalld、iptables,nginx反向代理
  8. (96)FPGA PLL与MMCM区别?
  9. SQLite(二)高级操作
  10. python学习网站-关于python学习,最系统的学习网站看这里
  11. 十面阿里,屌丝程序员的逆袭之路
  12. 带grub的软盘镜像制作
  13. MPush开源实时消息推送系统
  14. 移动端车牌识别sdk-手机拍照识别车牌技术
  15. mongodb数据检索大全
  16. Beijing's Antitrust Blunder
  17. linux常用之必备基础命令一
  18. Java各版本发布时间
  19. android中录音断点播放,Android实现暂停--继续录音(AudioRecord)
  20. python写文字冒险游戏手机版_用128行代码实现一个文字冒险游戏

热门文章

  1. h5 移动端电子签名
  2. J2EE快速入门之集合框架【01】
  3. html5 的属性和方法,Qunee for HTML5 - 中文 : 常用属性与方法
  4. 必学:入行电商产品经理必备知识,原来这么简单
  5. 如何将应用从Win7迁移到Win10 ?
  6. 这才叫会PS,普通照片分分钟P成好莱坞海报!
  7. php1108脱机使用,电脑打印机脱机怎么重新连接
  8. 计算机系统硬件基本组成
  9. 小写字母转大写代码HTML,CSS控制转换字母的大写和小写
  10. 步进电机基础(7.2)-步进电机的选择方法-位置定位精度、转速方面、转速变化率和依据使用环境来选择