今天开始学习数据结构,数据结构是计算机的核心课程之一,非常重要。
复杂度比较简单,我简单说一下。
看一个算法的好坏用的就是复杂度,而它又有两个时间复杂度和空间复杂度。
时间复杂度:这个不是算时间而是算次数。而在实际中,只需算出大概的次数,那么这里我们使用大O的渐进表示法。这就是取级数最高的即可。
空间复杂度:额外占用内存的大小,注意类似斐波那契数列这种,考虑深度,而不是一共调用多少次,这和二叉树的遍历相似,我们后面会说。
顺序表是比较简单的一种存储结构
void SeqListInit(SeqList* ps)
{
ps->a = (SLDateType*)malloc(sizeof(SLDateType)*4);
ps->size = 0;
ps->capacity = 4;
}
void SeqListDestroy(SeqList* ps)
{
ps->size = 0;
}
void CheckCapacity(SeqList* ps)
{
ps->a = (SLDateType*)realloc(ps->a,sizeof(SLDateType) * 2 * (ps->capacity));
if (ps->a == NULL)
exit(-1);
ps->capacity = ps->capacity * 2;
}
void SeqListPushBack(SeqList* ps, SLDateType x)
{
if (ps->size == ps->capacity)
CheckCapacity( ps);
ps->a[ps->size] = x;
ps->size++;
}
void SeqListPrint(SeqList* ps)
{
int i;
for (i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void SeqListPushFront(SeqList* ps, SLDateType x)
{
int i;
if (ps->size == ps->capacity)
CheckCapacity(ps);
for (i = ps->size; i > 0; i--)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[0] = x;
ps->size++;
}
void SeqListPopFront(SeqList* ps)
{
int i;
for (i = 1; i < ps->size; i++)
{
ps->a[i-1] = ps->a[i];
}
if(ps->size>0)
ps->size--;
else
printf("表空\n");
}
void SeqListPopBack(SeqList* ps)
{
if (ps->size > 0)
ps->size--;
else
printf("表空\n");
}
int SeqListFind(SeqList* ps, SLDateType x)
{
int i;
for (i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
return i + 1;
}
printf("不存在\n");
return 0;
}
void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
int i;
if (ps->size == ps->capacity)
CheckCapacity(ps);
for (i = ps->size; i > pos-1; i--)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[pos-1] = x;
ps->size++;
}
void SeqListErase(SeqList* ps, int pos)
{
int i;
for (i = pos; i < ps->size; i++)
{
ps->a[i-1] = ps->a[i];
}
ps->size--;
}
这是动态顺序表的所有操作,静态顺序表在这里我就不赘述了,动态顺序表的有点很明显,它不会表满,因为当它满的时候会动态开辟空间。