动态顺序表与静态顺序表有许多共同点;
关于静态顺序表之前已有介绍
而动态顺序表与静态顺序表的不同之处也正是动态顺序表的核心:
动态开辟空间;
我们可以通过一副图片详解动态开辟空间的过程
这正是动态开辟空间的核心过程
也是代码中 ExpandIfRequired()函数的图解
以下代码在中头文件中
扫描二维码关注公众号,回复:
3865504 查看本文章
文件名:SeqListD.h
此代码为前期创建动态顺序表的必要过程:
//////////////////动态顺序表/////////////////////////
#pragma once //只编译1次
#ifndef _SEQLISTD_H_
#define _SEQLISTD_H_
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<windows.h>
typedef int DataType;
typedef struct SeqListDynamic
{
DataType *array;//定义为指针,用于给其分配空间
int capacity; //顺序表当前空间大小
int size;
}SeqListD;
#define CAPACITY (2);
对动态顺序表所执行的操作总览:
这些操作与静态顺序表的操作有许多相似之处,所有我们只写出一部分的操作
void SeqListDInit(SeqListD *pSLD);//动态顺序表的初始化
void SeqListDDstroy(SeqListD *pSLD);//销毁
void ExpandIfRequired(SeqListD *pSLD);//判断扩充(如果有必要的话)
void SeqListDPushBack(SeqListD *pSLD, DataType data);//尾插
void SeqListDPushFront(SeqListD *pSLD, DataType data);//头插
void SeqListDPushInsert(SeqListD *pSLD, int pos, DataType data);//根据下标插
void SeqListDPrint(SeqListD*pSLD);//打印
对动态顺序表所执行的操作详解:
代码中的 判断扩充函数 为动态顺序表的核心操作,图解可参照前面图片
//动态顺序表的初始化
void SeqListDInit(SeqListD *pSLD)
{
assert(pSLD != NULL);
pSLD->capacity = CAPACITY;
pSLD->size = 0;
pSLD->array = (DataType*)malloc(pSLD->capacity * sizeof(DataType));
//动态开辟一个大小为 (pSLD->capacity * sizeof(DataType)) 的空间
}
//销毁
void SeqListDDstroy(SeqListD *pSLD)
{
assert(pSLD != NULL);
pSLD->size = 0;
free(pSLD->array);
pSLD->capacity = 0;
}
//判断扩充(如果有必要的话)
void ExpandIfRequired(SeqListD *pSLD)
{
if (pSLD->size < pSLD->capacity) //元素个数少于存储容量
{
return;
}
//空间不够
//1,扩容
//2,开个新容量的空间
//3,把老数据迁移到新空间
//4,把老空间释放
//5,把新空间挂起来
//1.
pSLD->capacity *= 2;//会扩容为原来空间的2倍(利用*=表达式)
//2.利用malloc函数开辟 pSLD->capacity 个 单个大小为 sizeof(DataType) 的空间
DataType*newArray = (DataType*)malloc( pSLD->capacity*sizeof(DataType));
assert(newArray != NULL);
//3.
int i;
for (i = 0; i < pSLD->size; i++)//使用for循环搬移
{
newArray[i] = pSLD->array[i];
}
进行数据搬移
//4.
free(pSLD->array);
//5.
pSLD->array = newArray;//将指针指向新空间的起始位置
}
//尾插
void SeqListDPushBack(SeqListD *pSLD , DataType data)
{
assert(pSLD != NULL);
//函数自己判断,有必要就扩容
ExpandIfRequired(pSLD);
pSLD->array[pSLD->size++] = data;//插入元素
}
//头插
void SeqListDPushFront(SeqListD *pSLD, DataType data)
{
assert(pSLD != NULL);
ExpandIfRequired(pSLD);
int pos;
for (pos = pSLD->size - 1; pos >= 0; pos--)//整体往后搬移一格
{
pSLD->array[pos + 1] = pSLD->array[pos];
}
pSLD->array[0] = data;
pSLD->size++;
}
//根据下标插
void SeqListDPushInsert(SeqListD *pSLD, int pos, DataType data)
{
assert(pSLD != NULL);
ExpandIfRequired(pSLD);
int space;
for (space = pSLD->size; space > pos; space--)//把pos和pos以后位置的元素整体往后搬移一格
{
pSLD->array[space] = pSLD->array[space - 1];
}
pSLD->array[pos] = data;
pSLD->size++;
}
//打印
void SeqListDPrint(SeqListD*pSLD)
{
int i;
for (i = 0; i <= pSLD->size; i++)
{
printf("%-2d ", pSLD->array[i]);
}
printf("\n");
}
#endif
在主函数中调用这些操作:
主函数定义再原文件中;
文件名:SeqListD.c
#include"SeqListD.h"
int main()
{
SeqListD sld;
SeqListDInit(&sld);
SeqListDPrint(&sld);
SeqListDPushBack(&sld, 1);
SeqListDPrint(&sld);
SeqListDPushBack(&sld, 3);
SeqListDPrint(&sld);
SeqListDPushBack(&sld, 8);
SeqListDPrint(&sld);
SeqListDPushBack(&sld, 6);
SeqListDPushBack(&sld, 2);
SeqListDPrint(&sld);
SeqListDPushFront(&sld, 5);
SeqListDPrint(&sld);
SeqListDPushInsert(&sld, 6, 77);
SeqListDPrint(&sld);
SeqListDDstroy(&sld);
return 0;
}
输出结果
1
1 3
1 3 8
1 3 8 6 2
5 1 3 8 6 2
5 1 3 8 6 2 77
请按任意键继续. . .