数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现
注意:
虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明)。
g++版本:
一.简述
本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习。
二.头文件
- //head.h
- /**
- My Code
- */
- #include <cstdio>
- #include <cstdlib>
- /**
- page 10
- */
- #define TRUE 1
- #define FALSE 0
- #define OK 1
- #define ERROR 0
- #define INFEASIBLE -1//不可行的
- #define OVERFLOW -2
- //Status是函数的类型,其值是函数结果状态代码
- typedef int Status;//注意分号不能少
三.CPP文件
- //2_2.cpp
- /**
- author:zhaoyu
- email:zhaoyu1995.com@gmail.com
- date:2016-6-4
- note:realize my textbook <<数据结构(C语言版)>>
- */
- #include "head.h"
- //----线性表的动态分配顺序存储结构----
- #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
- #define LISTINCREMENT 10//线性表存储空间的分配增量
- /**
- My Code
- to make the paragram run correctlly
- */
- #define ElemType int
- typedef struct {
- ElemType *elem;//存储空间基址
- int length;//当前长度
- int listsize;//当前分配的存容量(以sizeof(ElemType)位单位)
- }SqList;
- int compare(ElemType a, ElemType b)
- {
- return a==b?:;
- }
- /**
- algorithm 2.3
- page 23
- */
- Status InitList_Sq(SqList &L)
- {
- //构造一个空的线性表
- L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
- if (!L.elem)
- {
- exit(OVERFLOW);
- }
- L.length = ;
- L.listsize = LIST_INIT_SIZE;
- return OK;
- }//InitList_Sq
- /**
- algorithm 2.4
- */
- Status ListInsert_Sq(SqList &L, int i, ElemType e)
- {
- //在顺序线性表L中第i个位置之前插入新的元素e
- //i的合法为[1, ListLength_Sq(L)+1]
- if (i < || i > L.length + )
- {
- return ERROR;//i值不合法
- }
- if (L.length >= L.listsize)
- {//当前存储空间已满,增加分配
- ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));
- if (!newbase)
- {
- exit(OVERFLOW);//存储分配失败
- }
- L.elem = newbase;//新基址
- L.listsize += LISTINCREMENT;//增加存储容量
- }
- ElemType *q = &(L.elem[i-]);//q为插入位置
- for (ElemType *p = &L.elem[L.length-]; p >= q; p--)
- {
- *(p+) = *p;//插入位置及之后的元素右移
- }
- *q = e;
- ++L.length;
- return OK;
- }//ListInsert_Sq
- /**
- algorithm 2.5
- */
- Status ListDelete_Sq(SqList &L, int i, ElemType &e)
- {
- //在顺序线性表中删除第i个元素,并用e返回其值
- //i的合法值为[1, ListLength_Sq(L)]
- if ((i < ) || (i > L.length))
- {
- return ERROR;//i为不合法值
- }
- ElemType *p = &(L.elem[i-]);//p为被删除元素的位置
- e = *p;//被删除的元素赋值给e
- ElemType *q = L.elem + L.length - ;//表位元素的位置
- for (++p; p <= q; ++p)
- {
- *(p-) = *p;//被删除元素之后的元素左移
- }
- --L.length;//表长减 1
- return OK;
- }//ListDelete_Sq
- /**
- algorithm 2.6
- */
- int LocateElem_Sq(SqList L, ElemType e, Status(* compare)(ElemType, ElemType))
- {
- //在顺序线性表L中查找第1个值与e满足compare()的元素位序
- //若找到返回其在L中的位序,否则返回0
- int i = ;//i的初值为第一个元素的位序
- ElemType *p = L.elem;//p为第一个元素的存储位置
- while (i <= L.length && !(*compare)(*p++, e))
- {
- ++i;
- }
- if (i <= L.length)
- {
- return i;
- }
- else
- {
- return ;
- }
- }//LocateElem_Sq
- /**
- algorithm 2.7
- */
- void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)
- {
- //已知顺序线性表La和Lb的元素按值非递减排列
- //归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
- ElemType *pa = La.elem;
- ElemType *pb = Lb.elem;
- Lc.listsize = Lc.length = La.length + Lb.length;
- ElemType *pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
- if (!Lc.elem)
- {
- exit(OVERFLOW);
- }
- ElemType *pa_last = La.elem + La.length - ;
- ElemType *pb_last = Lb.elem + Lb.length - ;
- 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++;
- }
- }//MergeList_Sq
- /**
- My code
- */
- void PrintList(SqList L)
- {
- for (int i = ; i <= L.length; i++)
- {
- printf("%d\t", L.elem[i-]);
- }
- printf("\n");
- }
- /**
- My Test
- */
- int main(int argc, char const *argv[])
- {
- SqList La, Lb, Lc;
- InitList_Sq(La);
- InitList_Sq(Lb);
- InitList_Sq(Lc);
- //创建一个1 2 3 4的线性表
- ListInsert_Sq(La, , );
- ListInsert_Sq(La, , );
- ListInsert_Sq(La, , );
- ListInsert_Sq(La, , );
- PrintList(La);
- //在位序4(即值为5的位置)插 4
- ListInsert_Sq(La, , );
- PrintList(La);
- //创建线性表Lb;10, 20, 5, 30
- ListInsert_Sq(Lb, , );
- ListInsert_Sq(Lb, , );
- ListInsert_Sq(Lb, , );
- ListInsert_Sq(Lb, , );
- PrintList(Lb);
- int temp;
- //删除位置3的元素,并返回给 temp
- ListDelete_Sq(Lb, , temp);
- PrintList(Lb);
- printf("%d\n", temp);
- //查找 30 在 Lb 的位置
- printf("%d\n", LocateElem_Sq(Lb, , compare));
- printf("%d\n", LocateElem_Sq(Lb, , compare));
- //合并La, Lb 到 Lc,注意前提是有序的
- MergeList_Sq(La, Lb, Lc);
- PrintList(Lc);
- return ;
- }
四.测试
数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现的更多相关文章
- 【数据结构(C语言版)系列一】 线性表
最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...
- javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现
线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...
- [C++]数据结构:线性表之顺序表
1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...
- 已知长度为n的线性表采用顺序结构,写一算法删除该线性表中所有值为item的元素
/** * @author:(LiberHome) * @date:Created in 2019/2/27 23:34 * @description: * @version:$ */ /*已知长度为 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
- 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作
一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...
- 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表
一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...
- 数据结构算法C语言实现(二十七)--- 7.2图的遍历
一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...
随机推荐
- Matlab画图,坐标轴范围设置和间隔设置
在Matlab画图的时候,系统默认的坐标轴范围以及间隔有时候并不是很合适,如何根据自己的要求来显示呢,Set语句就可以帮忙咯!! 1. set(gca,'xtick',0:100:2500) ...
- 完美演绎DevExpress XtraPrinting Library 的打印功能
完美演绎DevExpress XtraPrinting Library 的打印功能 2010-05-14 17:40:49| 分类: 默认分类|字号 订阅 设计报告不仅费时间,而且还乏味!但 ...
- 关于开发中 hosts 文件的修改
这篇文章只是给自己做个笔记吧. 最近的工作经常要改 hosts 文件(C:\Windows\System32\drivers\etc\hosts),并且改完后不立即生效.小胡子哥 提到: 因为服务器设 ...
- 《深入理解Spark:核心思想与源码分析》(前言及第1章)
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- [C#解惑] #1 在构造函数内调用虚方法
谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...
- SQLite剖析之体系结构
1.通过官方的SQLite架构文档,理清大体的系统层次:Architecture of SQLite 2.阅读SQLite Documentation中Technical/Design Documen ...
- JavaScript学习笔记-商品管理新增/删除/修改功能
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- Linux中TFTP使用详解
FTP协议简介TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现. linux服务器端tftp-server的配置1.安装tftp服务器需要安装xinetd(守护tftp).tftp和 ...
- 如何设置unobtrusive的语言包
场景:网站是用的validate.unotrusive.js验证的,网站的语言已经切换到繁体了,但是提示语言还是英文. 环境:asp.net mvc4,jquery.validate.unotrusi ...
- Visual Studio 2013启用AnkSVN
1. 官网下载AnkSVN https://ankhsvn.open.collab.net/ 2. 安装 3. 启用 When you enable AnkhSVN as a VS.NET sour ...