数据结构学习之 不定长顺序表

//不定长的顺序表
//.h
#pragma once
#include <stdbool.h>

#define INIT_SIZE 10

typedef struct DSeqList
{
    int *elem;  //指向保存数据的内存
    int length; //有效数据的个数
    int listsize; //总格子数量
}DSeqList;

typedef DSeqList *PDSeqList;

//初始化函数
void InitDSeqList(PDSeqList plist);

//往plist的pos位置插入数据val
bool Insert(PDSeqList plist, int pos, int val);

//打印
void Show(PDSeqList plist);

//判空
bool IsEmpty(PDSeqList plist);

//bool isfull

//查找,找到了就返回下标,找不到返回-1
int Search(PDSeqList, int key);

//删除
bool DeleteVal(PDSeqList plist, int key);

//删除位置值
//rtval:输出参数,保存删除成功的数据
bool DeletePos(PDSeqList plist, int pos, int *rtval);

//获取pos下标存储的数据
bool GetVal(PDSeqList plist, int pos, int *rtval);

//修改pos下标的数据
bool SetVal(PDSeqList plist, int pos, int newval);

//获取val的前趋值
bool GetPriVal(PDSeqList plist, int key, int *rtval);

//获取val的后继值
bool GetNextVal(PDSeqList plist, int key, int *rtval);

//长度
int GetLength(PDSeqList plist);

//清除所有的数据
void Clear(PDSeqList plist);

//销毁该树
void Destory(PDSeqList plist);

dseqlist.cpp

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "dseqlist.h"

//初始化函数
void InitDSeqList(PDSeqList plist)
{
    assert(plist != NULL);
    if(plist == NULL)
    {
	return;
    }

    plist->elem = (int *)malloc(INIT_SIZE*sizeof(int));
    plist->length = 0;
    plist->listsize = INIT_SIZE;
}

static bool IsFull(PDSeqList plist)
{
    return plist->length == plist->listsize;
}

//总容量扩大到原来的2倍
static void Inc(PDSeqList plist)
{
    plist->elem = (int *)realloc(plist->elem,2*plist->listsize*sizeof(int));
    plist->listsize *= 2;
}

//往plist的pos位置插入数据val
bool Insert(PDSeqList plist, int pos, int val)
{
    if(pos < 0 || pos > plist->length)
    {
	return false;
    }
    if(IsFull(plist))
    {
	Inc(plist); //扩容
    }

    //移动数据
    for(int i = 0; i < plist->length; i++)
    {
	plist->elem[i+1] = plist->elem[i];
    }

    plist->elem[pos] = val;
    //有效数据个数增加
    plist->length++;
}

//打印
void Show(PDSeqList plist)
{
    assert(plist != NULL);
    for(int i = 0; i < plist->length; i++)
    {
	printf("%d ", plist->elem[i]);
    }
    printf("\n");
}

//判空
bool IsEmpty(PDSeqList plist)
{
    return plist->length == 0;
}

//bool isfull

//查找,找到了就返回下标,找不到返回-1
int Search(PDSeqList plist, int key)
{
    for(int i = 0; i < plist->length; i++)
    {
	if(plist->elem[i] == key)
	{
	    return i;
	}
    }

    return -1;
}

//删除
bool DeleteVal(PDSeqList plist, int key)
{
    int i = Search(plist,key);
    if(i == -1)
    {
	return false;
    }
    return DeletePos(plist,i,NULL);
}

//删除位置值
//rtval:输出参数,保存删除成功的数据
bool DeletePos(PDSeqList plist, int pos, int *rtval)
{
    assert(plist != NULL);
    if(pos < 0 || pos >= plist->length)
    {
	return false;
    }

    if(rtval != NULL)
    {
	*rtval = plist->elem[pos];
    }

    //移动数据
    for( int i = 0; i < plist->length-1; i++)
    {
	plist->elem[i] = plist->elem[i+1];
    }
    //有效数据个数减少
    plist->length--;

    return true;
}

//获取pos下标存储的数据
bool GetVal(PDSeqList plist, int pos, int *rtval)
{
    assert(plist != NULL);
    if(pos < 0 || pos >= plist->length)
    {
	return false;
    }

    if(rtval != NULL)
    {
	*rtval = plist->elem[pos];
    }

    return true;
}


//修改pos下标的数据
bool SetVal(PDSeqList plist, int pos, int newval)
{
    assert(plist != NULL);
    if(pos < 0 || pos >= plist->length)
    {
	return false;
    }
    plist->elem[pos] = newval;

    return true;
}

//获取val的前趋值
bool GetPriVal(PDSeqList plist, int key, int *rtval)
{
    assert(plist != NULL);

    int i = Search(plist, key);
    if(i <= 0)
    {
	return false;
    }
    
    if(rtval != NULL)
    {
	*rtval = plist->elem[i-1];
    }

    return true;

}

//获取val的后继值
bool GetNextVal(PDSeqList plist, int key, int *rtval)
{
    assert(plist != NULL);
    int i = Search(plist, key);
    if(i >= plist->length)
    {
	return false;
    }

    if(rtval != NULL)
    {
	*rtval = plist->elem[i-1];
    }

    return true;
}

//长度
int GetLength(PDSeqList plist)
{
    assert(plist != NULL);
    return plist->length;
}

//清除所有的数据
void Clear(PDSeqList plist)
{
    plist->length = 0;
}

//销毁该树
void Destory(PDSeqList plist)
{
    Clear(plist);
}

 

main.c

#include <stdio.h>
#include "dseqlist.h"
#include <stdlib.h>

int mian()
{
    DSeqList seq;
    InitDSeqList(&seq);

    for(int i = 0; i < 20; i++)
    {
	Insert(&seq,i,i);
    }
    Show(&seq);

    DeleteVal(&seq,5);
    Show(&seq);

    Insert(&seq,3,30);
    Show(&seq);

    Clear(&seq);
    Show(&seq);


    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值