动态顺序表

1.头文件

#include"stdio.h"

#include "windows.h"
#include"assert.h"
#include "malloc.h"




#ifndef _SEQLISTD_H__
#define _SEQLISTD_H__




typedef int DataType;
struct seqlistd
{
DataType* pdata;
int size; // 顺序表中有效元素的个数 
int capacity; // 顺序表中可容纳元素的最大值 
};
typedef struct seqlistd seqlistd;
typedef struct seqlistd* pseqlistd;//指向seqlistd类型的指针








// 顺序表的初始化 
void SeqListdInit(struct seqlistd* pseq);


//顺序表的打印
void SeqListdPrint(pseqlistd pseq);


// 尾插 
void SeqListDPushBack(pseqlistd pseq, DataType data);
// 尾删 
void SeqListDPopBack(pseqlistd pseq);


// 判断顺序表是否为空,为空返回true,否则返回false 
int SeqListDEmpty(pseqlistd pseq);


// 获取顺序表中有效元素的个数 
int SeqListDSize(pseqlistd pseq);


//获取顺序表的容量 
int SeqListDCapacity(pseqlistd pseq);


// 清空顺序表中的所有元素 
void SeqListDClear(pseqlistd pseq);


// 动态增容 
int CheckCapacity(pseqlistd pseq);


// 销毁顺序表 
void SeqListDDestroy(pseqlistd pseq);


// 顺序表任意位置插入元素 
void SeqListDInsert(pseqlistd pseq, size_t pos, DataType data);


// 顺序表任意位置删除元素 

void SeqListDErase(pseqlistd pseq, size_t pos);



2.操作函数


#include "seqlistd.h"



// 顺序表的初始化 
void SeqListdInit(struct seqlistd* pseq)
{
pseq->size = 0;
pseq->capacity = 9;
pseq->pdata = (DataType *)malloc(pseq->capacity * sizeof(DataType));
if (NULL == pseq->pdata)
{
printf("初始化顺序表失败");
}
}



//顺序表的打印
void SeqListdPrint(pseqlistd pseq)
{
assert(pseq);
for (int i = 0; i < pseq->size; i++)
{
printf("%d->", pseq->pdata[i]);
}
printf("\n");
}


// 尾插 
void SeqListDPushBack(pseqlistd pseq, DataType data)
{
assert(pseq);
int last = pseq->size;
CheckCapacity(&pseq);
pseq->pdata[last++] = data;
pseq->size++;
}
// 尾删 
void SeqListDPopBack(pseqlistd pseq)
{
assert(pseq);
if (SeqListDEmpty(&pseq))
{
printf("顺序表已空");
}
else
pseq->size--;
}




// 判断顺序表是否为空,为空返回true,否则返回false 
int SeqListDEmpty(pseqlistd pseq)
{
assert(pseq);
if (pseq->size == 0)
return 1;
else
return 0;


}


// 获取顺序表中有效元素的个数 
int SeqListDSize(pseqlistd pseq)
{
assert(pseq);
return pseq->size;


}


//获取顺序表的容量 
int SeqListDCapacity(pseqlistd pseq)
{
assert(pseq);
return pseq->capacity;
}




// 清空顺序表中的所有元素 
void SeqListDClear(pseqlistd pseq)
{
assert(pseq);
if (pseq->size == 0)
{
printf("顺序表已空");
}
else
pseq->size = 0;
}


// 动态增容 
int CheckCapacity(pseqlistd pseq)
{
assert(pseq);
DataType *ptemp = pseq->pdata;//ptemp指向扩容之前的空间
if (pseq->capacity <=pseq->size)//需要增容
{
DataType newcapacity = pseq->capacity *2;//新的空间为以前的两倍
//增容
  ptemp= (DataType *)realloc(pseq->pdata, newcapacity * sizeof(DataType));


if (NULL == ptemp)
{
pseq->pdata = ptemp;    
printf("扩容失败");
return 0;    
}
else
{
pseq->capacity = newcapacity;
return 1;
}
}
}


// 销毁顺序表 
void SeqListDDestroy(pseqlistd pseq)
{
assert(pseq);
pseq->capacity = 0;
pseq->size = 0;
free(pseq->pdata );
}


// 顺序表任意位置插入元素 
void SeqListDInsert(pseqlistd pseq, size_t pos, DataType data)
{
assert(pseq);
if (pseq->size >= pseq->capacity)
{
printf("顺序表已满");
}
if (pos<0 || pos> pseq->size)
{
printf("插入位置不合法");
return;
}
int temp = CheckCapacity(&pseq);
if (temp)
{
for (int i = pseq->size - 1; i > pos; --i)
{
pseq->pdata[i + 1] = pseq->pdata[i];//整体后移
pseq->size++;


}
pseq->pdata[pos] =data;
}
}


// 顺序表任意位置删除元素 
void SeqListDErase(pseqlistd pseq, size_t pos)
{
assert(pseq);
if (SeqListDEmpty(&pseq))
{
printf("顺序表已空");
}
if (pos<0 || pos> pseq->size)
{
printf("删除位置不合法");
return;
}
for (int i = pos; i <pseq->size-1; i++)
    {
pseq->pdata[i] = pseq->pdata[i+1];//整体后移
pseq->size--;


     }
}


3.测试函数


#include "seqlistd.h"



int main()
{
seqlistd s;
SeqListdInit(&s);

SeqListDPushBack(&s, 1);
SeqListDPushBack(&s, 2);
SeqListDPushBack(&s, 3);
SeqListDPushBack(&s, 4);
SeqListDPushBack(&s, 5);
    SeqListdPrint(&s);


SeqListDPopBack(&s);
SeqListdPrint(&s);


SeqListDEmpty(&s);


SeqListDSize(&s);


SeqListDCapacity(&s);


SeqListDClear(&s);


CheckCapacity(&s);//增容




SeqListDDestroy(&s);
SeqListdPrint(&s);


SeqListDInsert(&s, 3, 0);
SeqListdPrint(&s);


SeqListDErase(&s, 5);
SeqListdPrint(&s);
system("pause");
return 0;
}
















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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值