数据结构之实现顺序表的简单操作函数

简单实现静态顺序表的基本操作:初始化,销毁,增删改查等操作。

SeqList.h

#ifndef _SEQLIST_H_
#define _SEQLIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

#define MAX_SIZE 100
typedef int DataType;
typedef struct SeqList
{
    DataType array[MAX_SIZE];//存数据的空间
    int size;//1.顺序表中有效元素的个数 2.当前可用的数组下标
}SeqList;


void SeqListInit(SeqList *pSL);//初始化
void SeqlistDestroy(SeqList *pSL);//销毁
//插入
void SeqListPushBack(SeqList *pSL,DataType data);//尾插
void SeqListPushFront(SeqList *pSL,DataType data);//头插
void SeqListInsert(SeqList *pSL,int pos,DataType data);//根据下标插入
//删除
void SeqListPopBack(SeqList *pSL);//尾删
void SeqListPopFront(SeqList *pSL);//头删
void SeqListErase(SeqList *pSL, int pos);//根据下标删除
void SeqListRemove(SeqList *pSL,DataType data);//根据数据删除,删除遇到的第一个
void SeqListRemoveAll(SeqList *pSL,DataType data);//根据数据删除,删除所有指定数据
//修改
void SeqListUpdate(SeqList *pSL,int pos,DataType data);//根据下标更新数据
//查询
int SeqListFind(SeqList *pSL,DataType data);//返回遇到的第一个下标,若没有遇到,就返回-1

SeqList.c

#include "Seqlist.h"
void SeqListPrint(SeqList *pSL)
{
    int i ;
    for (i = 0; i < pSL->size; i++)
    {
        printf("%d ", pSL->array[i]);
    }
    printf("\n");
}

void SeqListInit(SeqList *pSL)//初始化
{
    assert(pSL != NULL);
    memset(pSL->array, 0, MAX_SIZE*sizeof(DataType));
    pSL->size = 0;

}
void SeqlistDestroy(SeqList *pSL)//销毁
{
    assert(pSL != NULL);
    pSL->size = 0;

}
void SeqListPushBack(SeqList *pSL, DataType data)//尾插
{
    assert(pSL != NULL);
    assert(pSL->size < MAX_SIZE);
    pSL->array[pSL->size] = data;
    pSL->size++;
}
void SeqListPushFront(SeqList *pSL, DataType data)//头插
{
    assert(pSL != NULL);
    assert(pSL->size < MAX_SIZE);
    //将已知数据往后移
    //1.以条件写循环
#if 0
    int pos;//以搬移的数做循环指示
    for (pos = pSL->size - 1; pos >= 0; pos--)
    {
        pSL->array[pos + 1] = pSL->array[pos];
    }
#endif
#if 0
    int space;//以搬到的位置做循环指示
    for(space = pSL->size; space > 0; space--)
    {
        pSL->array[space] = pSL->array[space - 1];
    }
#endif
#if 2
    //2.以循环次数做循环指示
    int i;
    for (i = 0; i < pSL->size; i++)
    {
        pSL->array[pSL->size - i] = pSL->array[pSL->size - i - 1];
    }
#endif
    pSL->array[0] = data;
    pSL->size++;
}
void SeqListInsert(SeqList *pSL, int pos, DataType data)//根据下标插入
{
    assert(pSL != NULL);
    assert(pSL->size < MAX_SIZE);
    int space;
    for (space = pSL->size; space>pos; space--)
    {
        pSL->array[space] = pSL->array[space - 1];
    }
    pSL->array[pos] = data;
    pSL->size++;
}

void SeqListPopBack(SeqList *pSL)//尾删
{
    assert(pSL != NULL);
    assert(pSL->size > 0);
    pSL->size--;
}
void SeqListPopFront(SeqList *pSL)//头删
{
    assert(pSL != NULL);
    int pos;
    for (pos = 1; pos < pSL->size; pos++)
    {
        pSL->array[pos - 1] = pSL->array[pos];
    }
    pSL->size--;
}
void SeqListErase(SeqList *pSL, int pos)//根据下标删除
{
    assert(pSL != NULL);
    assert(pSL->size>0);
    int i;
    for (i = pos; pos < pSL->size - 1; pos++)
    {
        pSL->array[pos] = pSL->array[pos + 1];
    }
    pSL->size--;
}

void SeqListRemove(SeqList *pSL, DataType data)//根据数据删除,删除遇到的第一个
{
    int pos = SeqListFind(pSL, data);
    if (pos != -1)
    {
        SeqListErase(pSL, pos);
    }
}
void SeqListRemoveAll(SeqList *pSL, DataType data)//根据数据删除,删除所有指定数据
{
#if 0
    for (i = 0, j = 0; i < pSL->size; i++)
    {
        if (pSL->array[i] != data)
        {
            pSL->array[j] = pSL->array[i];
            j++;
        }
    }
    pSL->size = j;
#endif
#if 1
    int i = 0;
    int count = 0;
    for (i = 0; i < pSL->size; i++)
    {
        if (pSL->array[i] == data)
        {
            count++;
        }
        else
        {
            pSL->array[i - count] = pSL->array[i];
        }
        pSL->size -= count;
    }

#endif
}
void SeqListUpdate(SeqList *pSL, int pos, DataType data)//根据下标更新数据
{
    assert(pSL != NULL);
    assert(pos >= 0 && pos < pSL->size);
    pSL->array[pos] = data;
}
int SeqListFind(SeqList *pSL, DataType data)//返回遇到的第一个下标,若没有遇到,就返回-1
{
    assert(pSL != NULL);
    int i;
    for (i = 0; i < pSL->size; i++)
    {
        if (pSL->array[i] == data)
        {
            return i;
        }
    }
    return -1;
}

测试代码:

int main()
{
    SeqList S;
    SeqListInit(&S);
    SeqListPrint(&S);
    //尾插
    SeqListPushBack(&S,1);
    SeqListPushBack(&S,3);
    SeqListPushBack(&S,4);
    SeqListPushBack(&S,3);
    SeqListPushBack(&S,5);
    SeqListPushBack(&S,7);
    SeqListPushBack(&S, 8);
    SeqListPushBack(&S, 0);
    SeqListPushBack(&S, 9);
    SeqListPushBack(&S, 3);
    SeqListPrint(&S);
    //头插
    SeqListPushFront(&S, 4);
    SeqListPushFront(&S, 7);
    SeqListPushFront(&S, 0);
    SeqListPrint(&S);
    //根据下标插入
    SeqListInsert(&S, 2,6);
    SeqListInsert(&S, 4,5);
    SeqListPrint(&S);
    //尾删
    SeqListPopBack(&S);
    SeqListPrint(&S);
    //头删
    SeqListPopFront(&S);
    SeqListPopFront(&S);
    SeqListPrint(&S);
    //根据下标删除
    SeqListErase(&S, 4);
    SeqListErase(&S, 7);
    SeqListPrint(&S);
    //根据数据删除,删除遇到的第一个
    SeqListRemove(&S, 5);
    SeqListPrint(&S);
    //根据数据删除,删除所有指定数据
    SeqListRemoveAll(&S, 5);
    SeqListPrint(&S);
    //根据下标更新数据
    SeqListUpdate(&S,1,8);
    SeqListUpdate(&S,3,0);
    SeqListPrint(&S);
    //查询
    printf("%d\n", SeqListFind(&S, 3));
    //销毁顺序表
    SeqlistDestroy(&S);
    system("pause");
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用c++实现顺序表:多文件编程,层次清晰,函数有注释 SeqList();//构造函数,存储的元素个数设为0 bool setLength(size_t length);//设置已经存储的元素个数 bool addElement(ElemType element);//把某个元素添加到顺序表末尾 bool addElement(ElemType element , size_t n);//插入一个元素,使其成为第n个元素,其余元素后移 bool delElement();//删除所有的元素 bool delElement(size_t n);//删除第n个元素 bool delElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,把这个元素删除 bool replaceElement(ElemType element , size_t n);//使用一个元素,替换掉第n个元素 bool swapElement(size_t n1 , size_t n2);//把第n1个元素和第n2个元素交换 ElemType* getElement();//得到数组头的指针 ElemType* getElement(size_t n);//得到第n个元素的指针 size_t getLength();//得到存储的元素个数 size_t getMaxSize();//得到顺序表容量 bool showElementDetail();//输出所有的元素细节 bool showElementDetail(size_t n);//输出第n个元素的细节 bool showElementDetail(string elementDetailType,string elementDetail);//通过某个元素细节找到元素,输出元素所有细节 size_t findElement(string elementDetailType,string elementDetail);//通过某个元素细节找到元素位置 static int inputAInt(int min = 0,int max = 9,int defaultValue = -1);//从键盘读取,限制为一个min到max间的整数,非法情况返回defaultValue void startControlLoop();//打开控制界面 ~SeqList();//析构函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值