动态顺序表

#ifndef _DSQLIST_H
#define INIT_SIZE 10
typedef struct DSqlist
{
int *elem;
int usedsize;
int size;
}DSqlist;


void InitDSqlist(DSqlist *plist);


static bool IsFull(DSqlist *plist);


static void Inc(DSqlist *plist);


void Destroy(DSqlist *plist);


bool Insert(DSqlist *plist,int pos,int val);


int GetSize(DSqlist *plist);


int GetUsedSize(DSqlist *plist);


void Show(DSqlist *plist);

#endif

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


void InitDSqlist(DSqlist *plist)
{
assert(plist!=NULL);
plist->elem=(int *)malloc(sizeof(int)*INIT_SIZE);
assert(plist->elem!=NULL);
plist->size=INIT_SIZE;
plist->usedsize=0;


}


static bool IsFull(DSqlist *plist)
{
return plist->size==plist->usedsize;
}


static void Inc(DSqlist *plist)
{
int *p=plist->elem;
plist->elem=(int *)malloc(sizeof(int)*plist->size*2);
for(int i=0;i<plist->size;i++)
{
plist->elem[i]=p[i];
}
assert(plist->elem!=NULL);
plist->usedsize=plist->size;
plist->size*=2;
}


void Destroy(DSqlist *plist)
{
plist->elem=NULL;
free(plist->elem);
plist->size=0;
plist->usedsize=0;
}


bool Insert(DSqlist *plist,int pos,int val)
{
if(pos<0 || pos>plist->usedsize)
{
return false;
}
if(IsFull(plist))
{
Inc(plist);
}
for(int i=plist->usedsize-1;i>=pos;i--)
{
plist->elem[i+1]=plist->elem[i];
}
plist->elem[pos]=val;
plist->usedsize+=1;
return true;
}
int GetUsedSize(DSqlist *plist)
{
return plist->usedsize;
}


int GetSize(DSqlist *plist)
{
return plist->size;
}


void Show(DSqlist *plist)
{
for(int i=0;i<plist->usedsize;i++)
{
printf("%d ",plist->elem[i]);
}
printf("\n");

}

#include "dsqlist.h"
#include <stdio.h>


int main()
{
DSqlist plist;
InitDSqlist(&plist);

for(int i=0;i<plist.size;i++)
{
Insert(&plist,0,i);
}
Show(&plist);
printf("%d\n",GetUsedSize(&plist));
printf("%d\n",GetSize(&plist));
Insert(&plist,10,10);
Show(&plist);
printf("%d\n",GetUsedSize(&plist));
printf("%d\n",GetSize(&plist));



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值