C语言------动态顺序表

动态顺序表与静态顺序表有许多共同点;

关于静态顺序表之前已有介绍

而动态顺序表与静态顺序表的不同之处也正是动态顺序表的核心:

动态开辟空间;

我们可以通过一副图片详解动态开辟空间的过程

 这正是动态开辟空间的核心过程

也是代码中 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  
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/mowen_mowen/article/details/82824097