c语言顺序线性表的实现
结构体的定义
//顺序线性表的结构体
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 );
}
运行结果
![](/assets/blank.gif)
合并顺序表演示
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);
}
![](/assets/blank.gif)
c语言顺序线性表的实现相关推荐
- c语言建立线性表(顺序储存,链式储存,循环,双向)全
c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...
- 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...
1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...
- c语言visit_数据结构(c语言)——入门数据结构的世界:顺序线性表(一)
前面说的话 提到数据结构,最出名的恐怕还是四大基本结构,分别是集合,线性结构,树形结构和图形结构. 本人只是一名普普通通的本科学生,学的东西比较基础,甚至有可能比较落伍,但作为所有国内高等学府相关专业 ...
- 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码
数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...
- C语言实现数据结构顺序线性表
大家好,我是胡阳阳 数据结构一直以来都是一门很难的学科 学数据结构时老师总讲的思想和伪代码 对于初学者来说很难写出对应的程序 下面我们来讲解如何才能自己写出顺序线性表的代码 首先顺序线性表是由数组来实 ...
- c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解
<数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...
- C语言丨线性表(二):线性链表(单链表)
线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...
- 数据结构(C语言)——线性表(定义,基本操作)
数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...
- 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表
文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...
最新文章
- Silverlight中多个Xaml之间的切换/调用/弹出/传参数(转)
- perm函数c语言_理解C语言(三) 字符串处理函数
- c++心得之struct和class(结构体和类)
- 重提URL Rewrite(3):在URL Rewrite后保持PostBack地址(转老赵blog)
- php怎么解决雪崩或穿透,Redis之缓存击穿、穿透、雪崩、预热,以及如何解决?...
- linux安装nodejs一键脚本,ubuntu16.04部署nodejs+vue框架脚本
- 过滤access日志前5条数据
- 再测Golang JSON类库
- mysql 增加一列 伦理名_MySQL错误提示mysql Statement violates GTID consistency
- GoC编程(C++画图) 视频和资料集 -- 2022.07.26
- SSM面试题,2021最新Java面试题及答案
- 面试官问如何优化慢 SQL ?(附两万字SQL面试题)
- 关于msn 微软关闭MSN聊天信息超级链接功能
- CountDownTimer 倒计时器
- php跳转到qq界面,PHP实现QQ登录的开原理和实现过程
- UVA 1603 Square Destroyer
- 仿UC视频播放(iOS源代码)
- 喝液氮是一种什么样的体验
- 天猫平台基础规则(一)
- Android数据传输之Parcelable