数据结构算法C语言实现(一)---2.3线性表的顺序表示和实现

  注意:

  虽然是用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文件

//2_2.cpp
/**
author:zhaoyu
email:[email protected]
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?1:0;
}
/**
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 = 0;
    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 < 1 || i > L.length + 1)
    {
        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-1]);//q为插入位置
    for (ElemType *p = &L.elem[L.length-1]; p >= q; p--)
    {
        *(p+1) = *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 < 1) || (i > L.length))
    {
        return ERROR;//i为不合法值
    }
    ElemType *p = &(L.elem[i-1]);//p为被删除元素的位置
    e = *p;//被删除的元素赋值给e
    ElemType *q = L.elem + L.length - 1;//表位元素的位置
    for (++p; p <= q; ++p)
    {
        *(p-1) = *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 = 1;//i的初值为第一个元素的位序
    ElemType *p = L.elem;//p为第一个元素的存储位置
    while (i <= L.length && !(*compare)(*p++, e))
    {
        ++i;
    }
    if (i <= L.length)
    {
        return i;
    }
    else
    {
        return 0;
    }
}//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 - 1;
    ElemType *pb_last = Lb.elem + Lb.length - 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++;
    }
}//MergeList_Sq
/**
My code
*/
void PrintList(SqList L)
{
    for (int i = 1; i <= L.length; i++)
    {
        printf("%d\t", L.elem[i-1]);
    }
    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, 1, 10);
    ListInsert_Sq(La, 2, 20);
    ListInsert_Sq(La, 3, 30);
    ListInsert_Sq(La, 4, 50);
    PrintList(La);
    //在位序4(即值为5的位置)插 4
    ListInsert_Sq(La, 4, 40);
    PrintList(La);
    //创建线性表Lb;10, 20, 5, 30
    ListInsert_Sq(Lb, 1, 15);
    ListInsert_Sq(Lb, 2, 25);
    ListInsert_Sq(Lb, 3, 5);
    ListInsert_Sq(Lb, 4, 35);
    PrintList(Lb);
    int temp;
    //删除位置3的元素,并返回给 temp
    ListDelete_Sq(Lb, 3, temp);
    PrintList(Lb);
    printf("%d\n", temp);
    //查找 30 在 Lb 的位置
    printf("%d\n", LocateElem_Sq(Lb, 30, compare));
    printf("%d\n", LocateElem_Sq(Lb, 35, compare));
    //合并La, Lb 到 Lc,注意前提是有序的
    MergeList_Sq(La, Lb, Lc);
    PrintList(Lc);
    return 0;
}

  四.测试

时间: 2024-08-04 05:32:30

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

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

一.简述 [暂无] 二.头文件 1 #ifndef _2_3_part1_H_ 2 #define _2_3_part1_H_ 3 //2_3_part1.h 4 /** 5 author:zhaoyu 6 email:[email protected] 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to mak

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几

算法系列15天速成——第八天 线性表【下】

原文:算法系列15天速成--第八天 线性表[下] 一:线性表的简单回顾 上一篇跟大家聊过“线性表"顺序存储,通过实验,大家也知道,如果我每次向 顺序表的头部插入元素,都会引起痉挛,效率比较低下,第二点我们用顺序存储时,容 易受到长度的限制,反之就会造成空间资源的浪费. 二:链表 对于顺序表存在的若干问题,链表都给出了相应的解决方案. 1. 概念:其实链表的“每个节点”都包含一个”数据域“和”指针域“. ”数据域“中包含当前的数据. ”指针域“中包含下一个节点的指针. ”头指针”也就是head,指

[C++] 数据结构(C):线性表之顺序表

1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + Status GetElement(SeqList L, int i, ElementType &e) (按位)取值  + int LocateElement(SeqList L, ElementType e) (按值)查找  + Status ListInsert(SeqList &L, int i, ElementType e) (按位)插入  + Status ListDelet

数据结构——线性表(顺序实现)

好好学习基础知识,出人头地就靠它了,内外兼修.(好吧,我现在内外都不行)写这篇文章的目的就是为了,巩固刚学完的线性表,个人能力有限,若有不当之处,望指出. 线性表 好了,扯完了,说正事: 1.定义 线性表是一种及其常用的并且最简单的一种数据结构.简单来说,线性表就是集合里的元素的有限排列.(在这里我把集合定义为具有相同属性的元素,会有些狭义) 在线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部.比

数据结构-线性表_顺序表

进入大学一年了,今日终于有勇气写写随笔并展示出来了. 如有不足之处,请大家指正. 今日我想写的就是我对数据结构-线性表_顺序表的理解. 不BB了,进入正题!!!!! 数据结构中的逻辑结构分为线性结构和非线性结构,而线性表就属于线性结构. 线性结构是 n 个数据元素的有序(次序)集合,它有下列几个特征: 集合中必存在唯一的一个 "第一个元素": 集合中必存在唯一的一个 "最后的元素": 除最后元素之外,其它数据元素均有唯一的 "后继": 除第一元素

线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一个元素有前驱元素,单无后继元素. 可以抽象为如下表述: 元素1 元素2 元素3 元素4 元素5 元素6 然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)                  2.在内存中离散存储的线性表-----链表(如单链表,双链

【数据结构】线性表的顺序表示及实现

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 假设线性表的每个元素需要占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储地址.则线性表中第i+1个元素元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足关系: LOC(ai+1)=LOC(ai)+l 一般来说,线性表第i个数据元素ai的存储位置为: LOC(ai)=LOC(a1)+(i-1)*l 式中LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称做线性表的起始位

数据结构(三)——基于顺序存储结构的线性表

数据结构(三)--基于顺序存储结构的线性表 一.基于顺序存储结构的线性表实现 1.顺序存储的定义 线性表的顺序存储结构是用一段地址连续的存储单元依次存储线性表中的数据元素. 2.顺序存储结构的操作 使用一维数组实现顺序存储结构. template <typename T> class SeqList:public List<T> { protected: T* m_array;//顺序存储空间 int m_length;//当前线性表的长度 }; 一维顺序存储结构可以是原生数组或是