结构体的定义

//顺序线性表的结构体
typedef struct List {ElemType * dataList;  //数据地址int listLength;  //数据表长度int listSize; //当前分配的存储容量
}List;

状态码的定义

#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define ElemType int //自定义数据类型typedef int Status; //定义状态码类型#define OK 1 //完成
#define OVERFLOW 0 //失败
#define ERROR 0 //错误

初始化

//初始化
Status InitList(List* L) {L->dataList = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));if (!L->dataList) {printf("初始化失败!\n");exit(OVERFLOW);  //终止函数,exit(0)代表正常退出,exit(1)/exit(-1)代表异常退出}L->listLength = 0;L->listSize = LIST_INIT_SIZE;printf("初始化成功!\n");return OK;
}

表尾插入新元素

//表尾插入新元素
void ListPushBack(List* L, ElemType e) {if (L->listLength >= L->listSize) {  //当前存储空间已满,增加分配int* newbase = (ElemType*)realloc(L->dataList, (L->listSize + LISTINCREMENT) * sizeof(ElemType));/** malloc函数是对没有分配过的内存块直接进行分配,需要使用free()来释放内存块* realloc函数是对已经分配好的内存块重新进行分配,不需要使用free()来释放内存块*/if (!newbase) exit(OVERFLOW);L->dataList = newbase;L->listSize += LISTINCREMENT;}L->dataList[L->listLength] = e;L->listLength++;printf("元素%d已经添加至表尾\n",e);
}

删除

//删除第i个元素
Status ListDelete(List* L, int i) {//在顺序表中删除第i个元素if (i<1 || i > L->listLength) //i值不合法return ERROR;int p = L->listLength;int q ;for (i; i <= p; i++) {q = i - 1;L->dataList[q] = L->dataList[i];}L->listLength--;printf("删除成功\n");return OK;
}

插入

//在第i个位置插入一个新元素e
Status ListInsert(List* L, int i, ElemType e) {//i的合法值是1<=i<=listLengthif (i<1 || i > L->listLength) {  //i值不合法printf("i值不合法\n");return ERROR;}if (L->listLength >= L->listSize) {  //当前存储空间已满,增加分配int* newbase = (ElemType*)realloc(L->dataList, (L->listSize + LISTINCREMENT) * sizeof(ElemType));/** malloc函数是对没有分配过的内存块直接进行分配,需要使用free()来释放内存块* realloc函数是对已经分配好的内存块重新进行分配,不需要使用free()来释放内存块*/if (!newbase) exit(OVERFLOW);L->dataList = newbase;L->listSize += LISTINCREMENT;}ElemType *q;q= &(L->dataList[i - 1]);  //插入位置ElemType* p;for (p = &(L->dataList[L->listLength - 1]); p >= q; --p) { //插入位置及以后的元素后移*(p + 1) = *p;}*q = e;L->listLength++;printf("已成功插入值\n");return OK;
}

在顺序表中查找第一个与e相匹配的值

//在顺序表中查找第一个与e相匹配的值
Status LocateElem(List* L, ElemType e) {int i = 0;ElemType *p;p = L->dataList;while (i<L->listLength && p[i]!=e)//&& !compare(*p++,e){i++;}if (i < L->listLength) {printf("与%d相匹配的第一个序号是%d\n", e, i+1);return i;}else{printf("未匹配\n");return 0;}
}

打印顺序表

//顺序打印顺序表
Status ListPrint(List* L) {for (int i = 0; i < L->listLength; i++) {printf("%d\t", L->dataList[i]);}printf("\n");return OK;
}

合并顺序表

//顺序表的合并
void MergeList(List La, List Lb, List *Lc) {//已知顺序线性表La和Lb按非递减排序//归并La和Lb到Lc,并按非递减排序ElemType *pa,*pb,*pc;pa = La.dataList;pb = Lb.dataList;Lc->listSize = Lc->listLength = La.listLength + Lb.listLength;pc = Lc->dataList = (ElemType*)malloc(Lc->listSize * sizeof(ElemType));if (!Lc->dataList) {exit(OVERFLOW);}int* pa_last, * pb_last;pa_last = La.dataList + La.listLength - 1;pb_last = Lb.dataList + Lb.listLength - 1;while (pa<=pa_last&&pb<=pb_last){if (*pa <= *pb) {*pc++ = *pa++;}else {*pc++ = *pb++;}}while (pa<=pa_last){*pc++ = *pa++;}while (pb<=pb_last){*pc++ = *pb++;}
}

完整代码

#include <stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
#define ElemType int //自定义数据类型typedef int Status; //定义状态码类型#define OK 1 //完成
#define OVERFLOW 0 //失败
#define ERROR 0 //错误//顺序线性表的结构体
typedef struct List {ElemType * dataList;  //数据地址int listLength;  //数据表长度int listSize; //当前分配的存储容量
}List;//初始化
Status InitList(List* L) {L->dataList = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));if (!L->dataList) {printf("初始化失败!\n");exit(OVERFLOW);  //终止函数,exit(0)代表正常退出,exit(1)/exit(-1)代表异常退出}L->listLength = 0;L->listSize = LIST_INIT_SIZE;printf("初始化成功!\n");return OK;
}//在第i个位置插入一个新元素e
Status ListInsert(List* L, int i, ElemType e) {//i的合法值是1<=i<=listLengthif (i<1 || i > L->listLength) {  //i值不合法printf("i值不合法\n");return ERROR;}if (L->listLength >= L->listSize) {  //当前存储空间已满,增加分配int* newbase = (ElemType*)realloc(L->dataList, (L->listSize + LISTINCREMENT) * sizeof(ElemType));/** malloc函数是对没有分配过的内存块直接进行分配,需要使用free()来释放内存块* realloc函数是对已经分配好的内存块重新进行分配,不需要使用free()来释放内存块*/if (!newbase) exit(OVERFLOW);L->dataList = newbase;L->listSize += LISTINCREMENT;}ElemType *q;q= &(L->dataList[i - 1]);  //插入位置ElemType* p;for (p = &(L->dataList[L->listLength - 1]); p >= q; --p) { //插入位置及以后的元素后移*(p + 1) = *p;}*q = e;L->listLength++;printf("已成功插入值\n");return OK;
}//删除第i个元素
Status ListDelete(List* L, int i) {//在顺序表中删除第i个元素if (i<1 || i > L->listLength) //i值不合法return ERROR;int p = L->listLength;int q ;for (i; i <= p; i++) {q = i - 1;L->dataList[q] = L->dataList[i];}L->listLength--;printf("删除成功\n");return OK;
}//在顺序表中查找第一个与e相匹配的值
Status LocateElem(List* L, ElemType e) {int i = 0;ElemType *p;p = L->dataList;while (i<L->listLength && p[i]!=e)//&& !compare(*p++,e){i++;}if (i < L->listLength) {printf("与%d相匹配的第一个序号是%d\n", e, i+1);return i;}else{printf("未匹配\n");return 0;}
}//顺序打印顺序表
Status ListPrint(List* L) {for (int i = 0; i < L->listLength; i++) {printf("%d\t", L->dataList[i]);}printf("\n");return OK;
}//表尾插入新元素
void ListPushBack(List* L, ElemType e) {if (L->listLength >= L->listSize) {  //当前存储空间已满,增加分配int* newbase = (ElemType*)realloc(L->dataList, (L->listSize + LISTINCREMENT) * sizeof(ElemType));/** malloc函数是对没有分配过的内存块直接进行分配,需要使用free()来释放内存块* realloc函数是对已经分配好的内存块重新进行分配,不需要使用free()来释放内存块*/if (!newbase) exit(OVERFLOW);L->dataList = newbase;L->listSize += LISTINCREMENT;}L->dataList[L->listLength] = e;L->listLength++;printf("元素%d已经添加至表尾\n",e);
}//顺序表的合并
void MergeList(List La, List Lb, List *Lc) {//已知顺序线性表La和Lb按非递减排序//归并La和Lb到Lc,并按非递减排序ElemType *pa,*pb,*pc;pa = La.dataList;pb = Lb.dataList;Lc->listSize = Lc->listLength = La.listLength + Lb.listLength;pc = Lc->dataList = (ElemType*)malloc(Lc->listSize * sizeof(ElemType));if (!Lc->dataList) {exit(OVERFLOW);}int* pa_last, * pb_last;pa_last = La.dataList + La.listLength - 1;pb_last = Lb.dataList + Lb.listLength - 1;while (pa<=pa_last&&pb<=pb_last){if (*pa <= *pb) {*pc++ = *pa++;}else {*pc++ = *pb++;}}while (pa<=pa_last){*pc++ = *pa++;}while (pb<=pb_last){*pc++ = *pb++;}
}void main() {List L;InitList(&L);ListPushBack(&L, 1);ListPushBack(&L, 2);ListPushBack(&L, 3);ListPushBack(&L, 4);ListPushBack(&L, 5);ListPushBack(&L, 6);ListPushBack(&L, 7);ListPrint(&L);ListInsert(&L, 1, 1);ListInsert(&L, 3, 2);ListInsert(&L, 9, 7);ListPrint(&L);ListDelete(&L, 3);ListPrint(&L);LocateElem(&L, 6 );
}

运行结果

合并顺序表演示

void main() {List La;List Lb;List Lc;InitList(&La);ListPushBack(&La, 1);ListPushBack(&La, 2);ListPushBack(&La, 3);ListPushBack(&La, 4);ListPushBack(&La, 5);ListPushBack(&La, 6);ListPushBack(&La, 7);ListPrint(&La);InitList(&Lb);ListPushBack(&Lb, 2);ListPushBack(&Lb, 4);ListPushBack(&Lb, 6);ListPushBack(&Lb, 8);ListPushBack(&Lb, 10);ListPrint(&Lb);MergeList(La, Lb, &Lc);ListPrint(&Lc);
}

c语言顺序线性表的实现相关推荐

  1. c语言建立线性表(顺序储存,链式储存,循环,双向)全

    c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...

  2. 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...

    1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...

  3. c语言visit_数据结构(c语言)——入门数据结构的世界:顺序线性表(一)

    前面说的话 提到数据结构,最出名的恐怕还是四大基本结构,分别是集合,线性结构,树形结构和图形结构. 本人只是一名普普通通的本科学生,学的东西比较基础,甚至有可能比较落伍,但作为所有国内高等学府相关专业 ...

  4. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  5. C语言实现数据结构顺序线性表

    大家好,我是胡阳阳 数据结构一直以来都是一门很难的学科 学数据结构时老师总讲的思想和伪代码 对于初学者来说很难写出对应的程序 下面我们来讲解如何才能自己写出顺序线性表的代码 首先顺序线性表是由数组来实 ...

  6. c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解

    <数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...

  7. C语言丨线性表(二):线性链表(单链表)

    线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...

  8. 数据结构(C语言)——线性表(定义,基本操作)

    数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...

  9. 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表

    文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...

最新文章

  1. Silverlight中多个Xaml之间的切换/调用/弹出/传参数(转)
  2. perm函数c语言_理解C语言(三) 字符串处理函数
  3. c++心得之struct和class(结构体和类)
  4. 重提URL Rewrite(3):在URL Rewrite后保持PostBack地址(转老赵blog)
  5. php怎么解决雪崩或穿透,Redis之缓存击穿、穿透、雪崩、预热,以及如何解决?...
  6. linux安装nodejs一键脚本,ubuntu16.04部署nodejs+vue框架脚本
  7. 过滤access日志前5条数据
  8. 再测Golang JSON类库
  9. mysql 增加一列 伦理名_MySQL错误提示mysql Statement violates GTID consistency
  10. GoC编程(C++画图) 视频和资料集 -- 2022.07.26
  11. SSM面试题,2021最新Java面试题及答案
  12. 面试官问如何优化慢 SQL ?(附两万字SQL面试题)
  13. 关于msn 微软关闭MSN聊天信息超级链接功能
  14. CountDownTimer 倒计时器
  15. php跳转到qq界面,PHP实现QQ登录的开原理和实现过程
  16. UVA 1603 Square Destroyer
  17. 仿UC视频播放(iOS源代码)
  18. 喝液氮是一种什么样的体验
  19. 天猫平台基础规则(一)
  20. Android数据传输之Parcelable

热门文章

  1. 笨方法学Python笔记(6)
  2. Linux主机IP地址:网络信息不可用
  3. ISTQB FL初级认证系列02:ISTQB FL初级认证考试攻略
  4. Lua全局变量代码规范
  5. SPSS--回归-多元线性回归模型案例解析!(一)
  6. 华清远见百度网盘实训笔记
  7. 运筹学基础——库存管理
  8. 前端行业发展和职业规划
  9. python做马尔科夫模型预测法_python实现隐马尔科夫模型HMM
  10. 关于excel中的超长数字显示方法