注意:

  虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明)。

  g++版本:

  

  一.简述

  本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习。

  二.头文件

  1. //head.h
  2. /**
  3. My Code
  4. */
  5. #include <cstdio>
  6. #include <cstdlib>
  7. /**
  8. page 10
  9. */
  10. #define TRUE 1
  11. #define FALSE 0
  12. #define OK 1
  13. #define ERROR 0
  14. #define INFEASIBLE -1//不可行的
  15. #define OVERFLOW -2
  16. //Status是函数的类型,其值是函数结果状态代码
  17. typedef int Status;//注意分号不能少

  三.CPP文件

  1. //2_2.cpp
  2. /**
  3. author:zhaoyu
  4. email:zhaoyu1995.com@gmail.com
  5. date:2016-6-4
  6. note:realize my textbook <<数据结构(C语言版)>>
  7. */
  8.  
  9. #include "head.h"
  10. //----线性表的动态分配顺序存储结构----
  11. #define LIST_INIT_SIZE 100//线性表存储空间的初始分配量
  12. #define LISTINCREMENT 10//线性表存储空间的分配增量
  13. /**
  14. My Code
  15. to make the paragram run correctlly
  16. */
  17. #define ElemType int
  18.  
  19. typedef struct {
  20. ElemType *elem;//存储空间基址
  21. int length;//当前长度
  22. int listsize;//当前分配的存容量(以sizeof(ElemType)位单位)
  23. }SqList;
  24. int compare(ElemType a, ElemType b)
  25. {
  26. return a==b?:;
  27. }
  28. /**
  29. algorithm 2.3
  30. page 23
  31. */
  32. Status InitList_Sq(SqList &L)
  33. {
  34. //构造一个空的线性表
  35. L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
  36. if (!L.elem)
  37. {
  38. exit(OVERFLOW);
  39. }
  40. L.length = ;
  41. L.listsize = LIST_INIT_SIZE;
  42. return OK;
  43. }//InitList_Sq
  44.  
  45. /**
  46. algorithm 2.4
  47. */
  48. Status ListInsert_Sq(SqList &L, int i, ElemType e)
  49. {
  50. //在顺序线性表L中第i个位置之前插入新的元素e
  51. //i的合法为[1, ListLength_Sq(L)+1]
  52. if (i < || i > L.length + )
  53. {
  54. return ERROR;//i值不合法
  55. }
  56. if (L.length >= L.listsize)
  57. {//当前存储空间已满,增加分配
  58. ElemType *newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(ElemType));
  59. if (!newbase)
  60. {
  61. exit(OVERFLOW);//存储分配失败
  62. }
  63. L.elem = newbase;//新基址
  64. L.listsize += LISTINCREMENT;//增加存储容量
  65. }
  66. ElemType *q = &(L.elem[i-]);//q为插入位置
  67. for (ElemType *p = &L.elem[L.length-]; p >= q; p--)
  68. {
  69. *(p+) = *p;//插入位置及之后的元素右移
  70. }
  71. *q = e;
  72. ++L.length;
  73. return OK;
  74. }//ListInsert_Sq
  75. /**
  76. algorithm 2.5
  77. */
  78. Status ListDelete_Sq(SqList &L, int i, ElemType &e)
  79. {
  80. //在顺序线性表中删除第i个元素,并用e返回其值
  81. //i的合法值为[1, ListLength_Sq(L)]
  82. if ((i < ) || (i > L.length))
  83. {
  84. return ERROR;//i为不合法值
  85. }
  86. ElemType *p = &(L.elem[i-]);//p为被删除元素的位置
  87. e = *p;//被删除的元素赋值给e
  88. ElemType *q = L.elem + L.length - ;//表位元素的位置
  89. for (++p; p <= q; ++p)
  90. {
  91. *(p-) = *p;//被删除元素之后的元素左移
  92. }
  93. --L.length;//表长减 1
  94. return OK;
  95. }//ListDelete_Sq
  96. /**
  97. algorithm 2.6
  98. */
  99. int LocateElem_Sq(SqList L, ElemType e, Status(* compare)(ElemType, ElemType))
  100. {
  101. //在顺序线性表L中查找第1个值与e满足compare()的元素位序
  102. //若找到返回其在L中的位序,否则返回0
  103. int i = ;//i的初值为第一个元素的位序
  104. ElemType *p = L.elem;//p为第一个元素的存储位置
  105. while (i <= L.length && !(*compare)(*p++, e))
  106. {
  107. ++i;
  108. }
  109. if (i <= L.length)
  110. {
  111. return i;
  112. }
  113. else
  114. {
  115. return ;
  116. }
  117. }//LocateElem_Sq
  118. /**
  119. algorithm 2.7
  120. */
  121. void MergeList_Sq(SqList La, SqList Lb, SqList &Lc)
  122. {
  123. //已知顺序线性表La和Lb的元素按值非递减排列
  124. //归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
  125. ElemType *pa = La.elem;
  126. ElemType *pb = Lb.elem;
  127. Lc.listsize = Lc.length = La.length + Lb.length;
  128. ElemType *pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
  129. if (!Lc.elem)
  130. {
  131. exit(OVERFLOW);
  132. }
  133. ElemType *pa_last = La.elem + La.length - ;
  134. ElemType *pb_last = Lb.elem + Lb.length - ;
  135. while (pa <= pa_last && pb <= pb_last)
  136. {
  137. if (*pa <= *pb)
  138. {
  139. *pc++ = *pa++;
  140. }
  141. else
  142. {
  143. *pc++ = *pb++;
  144. }
  145. }
  146. while (pa <= pa_last)
  147. {
  148. *pc++ = *pa++;
  149. }
  150. while (pb <= pb_last)
  151. {
  152. *pc++ = *pb++;
  153. }
  154. }//MergeList_Sq
  155. /**
  156. My code
  157. */
  158. void PrintList(SqList L)
  159. {
  160. for (int i = ; i <= L.length; i++)
  161. {
  162. printf("%d\t", L.elem[i-]);
  163. }
  164. printf("\n");
  165. }
  166. /**
  167. My Test
  168. */
  169. int main(int argc, char const *argv[])
  170. {
  171. SqList La, Lb, Lc;
  172. InitList_Sq(La);
  173. InitList_Sq(Lb);
  174. InitList_Sq(Lc);
  175. //创建一个1 2 3 4的线性表
  176. ListInsert_Sq(La, , );
  177. ListInsert_Sq(La, , );
  178. ListInsert_Sq(La, , );
  179. ListInsert_Sq(La, , );
  180. PrintList(La);
  181. //在位序4(即值为5的位置)插 4
  182. ListInsert_Sq(La, , );
  183. PrintList(La);
  184. //创建线性表Lb;10, 20, 5, 30
  185. ListInsert_Sq(Lb, , );
  186. ListInsert_Sq(Lb, , );
  187. ListInsert_Sq(Lb, , );
  188. ListInsert_Sq(Lb, , );
  189. PrintList(Lb);
  190. int temp;
  191. //删除位置3的元素,并返回给 temp
  192. ListDelete_Sq(Lb, , temp);
  193. PrintList(Lb);
  194. printf("%d\n", temp);
  195. //查找 30 在 Lb 的位置
  196. printf("%d\n", LocateElem_Sq(Lb, , compare));
  197. printf("%d\n", LocateElem_Sq(Lb, , compare));
  198. //合并La, Lb 到 Lc,注意前提是有序的
  199. MergeList_Sq(La, Lb, Lc);
  200. PrintList(Lc);
  201. return ;
  202. }

  四.测试

数据结构算法C语言实现(一)---2.2线性表的顺序表示和实现的更多相关文章

  1. 【数据结构(C语言版)系列一】 线性表

    最近开始看数据结构,该系列笔记简单记录总结下所学的知识,更详细的推荐博主StrayedKing的数据结构系列,笔记部分也摘抄了博主总结的比较好的内容. 一些基本概念和术语 数据是对客观事物的符号表示, ...

  2. javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现

    线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...

  3. [C++]数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  4. 已知长度为n的线性表采用顺序结构,写一算法删除该线性表中所有值为item的元素

    /** * @author:(LiberHome) * @date:Created in 2019/2/27 23:34 * @description: * @version:$ */ /*已知长度为 ...

  5. 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

  6. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  7. 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作

    一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

  8. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  9. 数据结构算法C语言实现(二十七)--- 7.2图的遍历

    一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...

随机推荐

  1. Matlab画图,坐标轴范围设置和间隔设置

    在Matlab画图的时候,系统默认的坐标轴范围以及间隔有时候并不是很合适,如何根据自己的要求来显示呢,Set语句就可以帮忙咯!! 1. set(gca,'xtick',0:100:2500)      ...

  2. 完美演绎DevExpress XtraPrinting Library 的打印功能

    完美演绎DevExpress XtraPrinting Library 的打印功能 2010-05-14 17:40:49|  分类: 默认分类|字号 订阅     设计报告不仅费时间,而且还乏味!但 ...

  3. 关于开发中 hosts 文件的修改

    这篇文章只是给自己做个笔记吧. 最近的工作经常要改 hosts 文件(C:\Windows\System32\drivers\etc\hosts),并且改完后不立即生效.小胡子哥 提到: 因为服务器设 ...

  4. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  5. [C#解惑] #1 在构造函数内调用虚方法

    谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...

  6. SQLite剖析之体系结构

    1.通过官方的SQLite架构文档,理清大体的系统层次:Architecture of SQLite 2.阅读SQLite Documentation中Technical/Design Documen ...

  7. JavaScript学习笔记-商品管理新增/删除/修改功能

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  8. Linux中TFTP使用详解

    FTP协议简介TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现. linux服务器端tftp-server的配置1.安装tftp服务器需要安装xinetd(守护tftp).tftp和 ...

  9. 如何设置unobtrusive的语言包

    场景:网站是用的validate.unotrusive.js验证的,网站的语言已经切换到繁体了,但是提示语言还是英文. 环境:asp.net mvc4,jquery.validate.unotrusi ...

  10. Visual Studio 2013启用AnkSVN

    1. 官网下载AnkSVN  https://ankhsvn.open.collab.net/ 2. 安装 3. 启用 When you enable AnkhSVN as a VS.NET sour ...