注意:

  虽然是用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线性表的顺序表示和实现的更多相关文章

  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. HTTP04--CDN知识

    一.CDN用途及概念 目的: CDN是内容分布网路(Content Delivery Network)的简称,目的是将网站内容发布到最接近用户的边缘,使用户就近获取内容,提高相应速度. 使用机制: 目 ...

  2. Linux进程间通信之信号量

    春节过去了,真的过去一年了.在公司待了快一年了.2016希望自己变得越来越好. ps:上面那句话是年前写的,中间隔了那么久,自己也变懒了. 一.信号量 1,信号量本质是一个计数器,控制访问共享资源的最 ...

  3. windows部署React-Native的开发环境实践(技术细节)

    前情摘要 众所周知,有人说.net可以用Xamrian,呵呵,不习惯收费的好么?搞.Net的人设置一次java的环境变量,可能都觉得实在太麻烦了,可能是因为这些年微软确实把我们给带坏了,所有东西一键安 ...

  4. morris的用法

    參數選項說明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 ...

  5. applicationContext.xml和dispatcher-servlet.xml的区别

    在SpringMVC项目中我们一般会引入applicationContext.xml和dispatcher-servlet.xml两个配置文件,这两个配置文件具体的区别是什么呢? Spring 官方文 ...

  6. Java微信公众号开发-外网映射工具配置

    一.开发环境准备 1.一个微信公众号 2.外网映射工具(开发调试)如花生壳.ngrok工具 注:与微信对接的URL要具备以下条件a:在公网上能够访问 b:端口只支持80端口 这里使用ngrok.cc: ...

  7. C语言创始人

    丹尼斯·麦卡利斯泰尔·里奇(英语:Dennis MacAlistair Ritchie,1941年9月9日-2011年10月12日[3]),生于美国纽约州布朗克斯维尔(Bronxville),著名的美 ...

  8. [转]VirtualBox – Error In supR3HardenedWinReSpawn 问题解决办法

    原文地址:http://chenpeng.info/html/3510 Genymotion 模拟器安装好虚拟机后,启动时报错: —————————VirtualBox – Error In supR ...

  9. [转]servlet中的service, doGet, doPost方法的区别和联系

    原文地址:http://m.blog.csdn.net/blog/ghyg525/22928567 大家都知道在javax.servlet.Servlet接口中只有init, service, des ...

  10. [转]响应式WEB设计学习(3)—如何改善移动设备网页的性能

    原文地址:http://www.jb51.net/web/70362.html 前言 移动设备由于受到带宽.处理器运算速度的限制,因而对网页的性能有更高的要求.究竟是网页中的何种元素拉低了网页在移动设 ...