不定长顺序表

数据结构集合:

1.线性结构

2.树形结构

3.集合

4.图

5.排序                                     

线性表:

                1.顺序表(顺序结构存储):逻辑相邻,物理也相邻 

                2.链表(链式结构存储):逻辑相邻,物理不一定相邻

不定长的顺序表:

          不定长的顺序表就是顺序表的长度不确定,从而使用动态内存的创建使得顺序表扩大容量

      

代码:

头文件 dseqlist.h

#pragma once
//不定长顺序表
typedef struct 
{
	int *elem;//指向动态内存的指针
	int length;//有效数据个数
	int listsize;//总单元个数
}DSeqList,*PDSeqList;

#define INITSIZE 10   //初始化大小

void InitDSeqList(PDSeqList ps);

//将val插入在ps表中的pos位置
bool Insert(PDSeqList ps,int val,int pos);

bool Insert_begin(PDSeqList ps,int val);

bool Insert_end(PDSeqList ps,int val);

//查找ps中第一个key的下标
int Search(PDSeqList ps,int key);

//删除ps中的第一个key
bool Delete(PDSeqList ps,int key);

//删除ps中第pos位置的数据
bool DeletePos(PDSeqList ps,int pos);

bool IsEmpty(PDSeqList ps);

//清空数据
void Clear(PDSeqList ps);

//销毁整个结构
void Destroy(PDSeqList ps);

int GetLength(PDSeqList ps);

void Show(PDSeqList ps);

源文件 dseqlist.cpp

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

//初始化顺序表
void InitDSeqList(PDSeqList ps);
{
    assert(ps!=NULL);
    ps->elem=(int*)malloc(INITSIZE*sizeof(int));
    ps->length=0;
    ps->listsize=INITSIZE; 
}
    
//内部函数判满
static bool IsFull(PDSeqList ps)
{
	return ps->length == ps->listsize;
}

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

//将val插入在ps表中的pos位置
bool Insert(PDSeqList ps,int val,int pos);//O(n)
{
    if(pos<0||pos>ps->length)
    {
        return false;
    }
    if(IsFull(ps))
    {
        Inc(ps);
    }
    for(int i=ps->length-1;i>=pos;i--)
    {
        ps->elem[i+1]=ps->elem[i];
    }
    ps->elem[pos]=val;
    ps->length++;
}

//头插
bool Insert_begin(PDSeqList ps,int val);
{
    Insert(ps,val,0);
}

//尾插
bool Insert_end(PDSeqList ps,int val);
{
    Insert(ps,val,ps->length);
}

//查找ps中第一个key的下标
int Search(PDSeqList ps,int key);
{
    for(int i=0;i<ps->length;i++)
    {
        if(ps->elem[i]==key)
        return i;
    }
    return -1;
}

//删除ps中的第一个key
bool Delete(PDSeqList ps,int key);
{
    int index=Search(ps,key);
    return DeletePos(ps,index);
}

//删除ps中第pos位置的数据
bool DeletePos(PDSeqList ps,int pos);
{
    if(pos<0||pos>=ps->length)
    {
        return false;
    } 
    for(int i=0;i<ps->length-1;i++)
    {
        ps->elem[i]=ps->elem[i+1];
    }
    ps->length--;
    return true;
}
      
//判断是否为空
bool IsEmpty(PDSeqList ps);
{
    return ps->length==0;
}

//清空数据
void Clear(PDSeqList ps);
{
    ps->length=0;//ps->length == (*ps).length
}

//销毁整个结构
void Destroy(PDSeqList ps);
{
    free(ps->elem);
    ps->elem=NULL;
    ps->length=0;
    ps->listsize=0;
}

//返回有效数据个数
int GetLength(PDSeqList ps);
{
    return ps->length;
}

//显示数据
void Show(PDSeqList ps);
{
    for(int i=0;i<ps->length;i++)
    {
        printf("%d",ps->elem[i];
    }
    printf("\n");
}

主函数 test.cpp

#include "dseqlist.h"
#include <vld.h>
int main()
{
	DSeqList ds;
	InitDSeqList(&ds);

	for(int i=0;i<15;i++)
	{
		Insert(&ds,i,i);
	}

	Delete(&ds,10);
	Show(&ds);
	Clear(&ds);
	Show(&ds);
	Destroy(&ds);

	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值