顺序表(静态)

**seqlit.h**
#pragma once
#define  _SEQ_LIST_
#ifdef  _SEQ_LIST_
#include<stdio.h>
#include<assert.h>
#include<string.h>

#define MAX_LEN  100
typedef int DataType;

typedef struct SeqList
{
    DataType arr[MAX_LEN];
    size_t size;

}SeqList;
typedef enum TAG
{
    TURE,  //真
    FALSE,  //假
}TAG;
typedef struct Findret
{
    TAG Isfind;  //是否找到下标
    size_t index;  //找到数据的下标
}Findret;

void InitSeqList(SeqList* pSeq); //初始化链表
void PrintSeqList(SeqList* pSeq);//输出链表
void PushBack(SeqList* pSeq, DataType x);//在链表后面添加数据
void PopBack(SeqList* pSeq); //删除链表最后一个元素
void PushFront(SeqList* pSeq, DataType x);//在链表开头插入一个元素,其他元素依次向后移
void PopFront(SeqList* pSeq); //删除第一个元素
void Insert(SeqList* pSeq, size_t index, DataType x);//在ndex位置插入x
void Modified(SeqList* pSeq, size_t index, DataType x);//将index位置的元素修改为x
void removed(SeqList* pSeq, size_t index); //移除index位置的元素
Findret  Find(SeqList* pSeq, DataType x, size_t index);//查找数据x,并返回下标
TAG Erase(SeqList* pSeq, DataType x, TAG all); //all等于TURE表示删除所有x
                                                                     //all等于FALSE表示删除第一个x

#endif //_SEQ_LIST_

**seqlist.c**

#include"seqlist.h"

void InitSeqList(SeqList* pSeq)
{
    assert(pSeq);
    memset(pSeq->arr, 0, MAX_LEN * sizeof(DataType));
    pSeq->size = 0;
}
void PrintSeqList(SeqList* pSeq)
{
    int i = 0;
    assert(pSeq);
    for (; i < pSeq->size; i++)
    {
        printf("%d ", pSeq->arr[i]);
    }

    printf("\n");
}
void PushBack(SeqList* pSeq, DataType x)
{
    assert(pSeq);
    if ((pSeq->size) > MAX_LEN -1) //判断链表是否已满
    {
        printf("SeqList is full\n");
        return;
    }
    pSeq->arr[(pSeq->size)++] = x;
}

void PopBack(SeqList* pSeq)
{
    assert(pSeq);
    if (pSeq->size == 0)
    {
        printf("SeqList is empty\n");
        return;
    }
    pSeq->arr[--(pSeq->size)] = 0; //或者 --(pSeq->size);
}
void PushFront(SeqList* pSeq, DataType x)
{
    int i = 0;
    assert(pSeq);
    if ((pSeq->size) > MAX_LEN - 1) //判断链表是否已满
    {
        printf("SeqList is full\n");
        return;
    }
    for (i = pSeq->size; i > 0; i--)
    {
        pSeq->arr[i] = pSeq->arr[i - 1];
    }
    pSeq->arr[0] = x;
    ++(pSeq->size);
}
void PopFront(SeqList* pSeq)
{
    int i = 0;
    assert(pSeq);
    if (pSeq->size == 0)
    {
        printf("SeqList is empty\n");
        return;
    }
    for (; i < pSeq->size; i++)
    {
        pSeq->arr[i] = pSeq->arr[i + 1];

    }
    (pSeq->size)--;
}
void Insert(SeqList* pSeq, size_t index, DataType x)
{
    int i = 0;
    assert(pSeq);
    assert(index <=pSeq->size);
    if ((pSeq->size) > MAX_LEN - 1) //判断链表是否已满
    {
        printf("SeqList is full\n");
        return;
    }
    for (i = pSeq->size; i > index; i--)
    {
        pSeq->arr[i] = pSeq->arr[i - 1];
    }
    pSeq->arr[index] = x;
    (pSeq->size)++;
}
void Modified(SeqList* pSeq, size_t index, DataType x)
{
    assert(pSeq);
    assert(index <= pSeq->size);
    pSeq->arr[index] = x;
}
void removed(SeqList* pSeq, size_t index)
{
    int i = 0;
    assert(pSeq);
    assert(index <= pSeq->size);
    for (i = index; i < pSeq->size; i++)
    {
        pSeq->arr[i] = pSeq->arr[i + 1];

    }
    (pSeq->size)--;
}

Findret Find(SeqList* pSeq, DataType x, size_t index)
{
    Findret ret;
    assert(pSeq);
    for (; index < pSeq->size; index ++)
    {
        if (pSeq->arr[index] == x)  //找到x
        {
            ret.Isfind = TURE;
            ret.index = index;
            return ret;
        }
    }
    ret.Isfind = FALSE;
    return ret;
}
TAG Erase(SeqList* pSeq, DataType x, TAG all)
{
    TAG success = FALSE;
    Findret ret;
    assert(pSeq);
    ret = Find(pSeq, x, 0);
    while (ret.Isfind == TURE)
    {
        success = TURE;
        removed(pSeq, ret.index);
        if (all == FALSE)
        {
            break;
        }
        ret = Find(pSeq, x, ret.index);
    }
    return success;
}

**main.c**
#include"seqlist.h"

void test()
{
    SeqList s;
    InitSeqList(&s);
    PushBack(&s, 1);
    PushBack(&s, 2);
    PushBack(&s, 3);
    PushBack(&s, 4);
    PopBack(&s);
    PushFront(&s, 10);
    PopFront(&s);
    Insert(&s, 2, 10);
    Modified(&s, 3, 11);
    removed(&s, 1);
    PrintSeqList(&s);
}

void test2()
{
        SeqList s;
        InitSeqList(&s);
        Insert(&s, 0, 0);
        Insert(&s, 1, 1);
        Insert(&s, 2, 2);
        Insert(&s, 3, 2);
        Insert(&s, 4, 3);
        Insert(&s, 5, 2);
        PrintSeqList(&s);

        Erase(&s, 2, FALSE);
        PrintSeqList(&s);

        Erase(&s, 2, TURE);
        PrintSeqList(&s);
}

int main()
{
    test();
    test2();
    getchar();
    return 0;
}
时间: 2024-11-05 09:11:02

顺序表(静态)的相关文章

顺序表及其多种实现方式 --- C/C++

所谓顺序表,即线性表的顺序存储结构.下面给出的是数据结构---线性表的定义. ADT List{ 数据对象: 线性表的数据对象的集合为{a1,a2,a3,...,an},每个元素的类型为ElemType. 数据关系: 除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每个元素有且仅有一个直接后继元素. 数据元素之间的关系是一对一的关系. 基础操作: InitList(&L);  //构造一个空的线性表 DestroyList(&L); //销毁线性表 Clea

【C++】模版类实现普通类静态顺序表

在C或C++里,我们已经学会了如何实现一个静态顺序表了,那为何还要引入模版类来实现静态顺序表呢?首先,我们看,在未引入模版前,我们在C++里是这样定义一个静态顺序表的: typedef int DataType;    //此时我定义的是int型 class SeqList {     DataType* _array;     size_t _size;     size_t _capacity; } 我们若要定义char型或者其他类型的,可以采用typedef了,这就是使用typedef的优

c语言:【顺序表】静态顺序表的头插、头删

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #define MAXSIZE 1000 typedef int DateType; typedef struct SeqList {     DateType arr[MAXSIZE];     size_t size; }SeqList;

算法学习之查找算法:静态查找表(1)顺序表查找

引言: 对查找表一般的操作有:1.查询某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素. 静态查找表的操作只包括两种:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性: 静态查找表又有四种表现形式:顺序表的查找.有序表的查找.静态树的查找.索引顺序表的查找. 静态查找涉及的关键字类型和数据元素类型

静态顺序表和动态顺序表

实现一个静态顺序表,首先,要定义一个保存数据的数组,保存在结构体中,用size来存储数组中的元素个数, typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; 首先来实现一下静态顺序表的初始化函数,可以借用系统的memset函数来实现,开辟一块空间全部初始化为0,没有存入数据所以size也为0 void InitSeqList(SeqList *pSeq) { assert(pSeq); memset(p

C实现静态顺序表

#include <stdio.h> #include <assert.h> #include <string.h> //顺序表的静态存储 #define MAXSIZE 5 typedef int DataType; typedef struct SeqList {  DataType array[MAXSIZE]; //数组大小  size_t size;             //有效元素个数 }SeqList; void InitSeqList(SeqList

基于静态分配的数组的顺序表(兼具Boost单元测试)

首先,我们来搞明白几个概念吧(参考自网站数据结构及百度百科). 线性表 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法. 顺序表 用顺序存储方法存储的线性表简称为顺序表(Sequential List).顺序表的存储方法是把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元

C++实现静态顺序表的增删查改以及初始化

C++实现静态顺序表的增删查改 顺序表:用一段地址连续的存储单元依s次存储数据元素的线性结构,是线性表的一种. //SeqList.h #pragma once #include <assert.h> #include <string.h> #define MAX_SIZE 5 typedef int DataType; //定义顺序表结构体 typedef struct SeqList { DataType array[MAX_SIZE];  //数据块数组 size_t siz

【C语言】静态顺序表和动态顺序表的实现

静态顺序表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 有两种定义顺序表的方法:一是静态地定义一张顺序表:二是动态地生成一张顺序表. 静态地定义一张顺序表的方法与定义一个数组的方法类似.可以描述如下: #define MAX_SIZE 100 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE

《线性表的总结---线性顺序表(静态,动态)---线性链表(动态)》

[静态顺序表的练习] /* 需求:创建一个静态的顺序表存放整数,大小为10,完成以下操作 1,输入6个整数,打印出顺序表中的内容,并显示表中剩余的空间个数. 2,在顺序表中的第3个位置插入元素0,打印输出顺序表中的内容,并显示表中剩余的空间个数. 3,再试图插入表中第11个位置整数0,程序提示超出范围. 4,删除表中第6个元素,打印出顺序表中的内容,并显示表中剩余的空间个数. */ /* #include<stdio.h> #define MaxSize 10 //想顺序表中插入元素 void