对与线性表中的顺序表,有静态顺序表,和动态顺序表。关于静态顺序表的实现以及一些操作,在本
博客内有相关内容,那么就不过多介绍,动态顺序表基本与静态顺序表的一些操作一样,比如,
查找,删除等,不一样的就是增加,销毁,最重要的静态顺序表是建立在栈上的,而动态顺序表是建立在堆上。
那么我们就在静态的基础上与动态结合加以练习,主要体现在增加,销毁,和结构体建立上不同。
那么我们来看代码。
先是头文件及其声明:
#pragma once
#include<stdio.h>
#include<malloc.h>
//#ifndef __D_SEQLIST_H__
//#define __D_SEQLIST_H__
//#endif
typedef char CHAR;
typedef struct seqlist
{
CHAR *elem;
size_t size;
size_t capacity;
}seqlist;
seqlist seq;
//打印顺序表
void seqlist_print(seqlist *seq);
//对动态顺序表的初始化
void seqlist_init(seqlist *seq);
//进行顺序表的尾插
void seqlist_push_back(seqlist *seq,CHAR value);
//对容器的扩容
void seqlist_expand_capacity(seqlist *seq);
//对顺序表的销毁
void seqlist_destroy(seqlist *seq);
对与相应函数的实现:
#include "D_seqlist.h"
//打印顺序表
void seqlist_print(seqlist *seq)
{
size_t i = 0;
if(seq == NULL)
{
return ;
}
for(i=0; i< seq->size; i++)
{
printf("%c",seq->elem[i]);
}
return ;
}
//对动态顺序表的初始化
void seqlist_init(seqlist *seq)
{
if(seq == NULL)
{
return ;
}
seq->size = 0;
seq->capacity = 1;
seq->elem = (CHAR *)malloc(sizeof(CHAR) * seq->capacity);
}
//容器的空间的扩充,ralloc
void seqlist_expand_capacity(seqlist *seq)
{
size_t i = 0;
CHAR *new_data = NULL;//使用char类型
seq->capacity = 2 * seq->capacity + 1;
new_data = (CHAR *)malloc(seq->capacity * sizeof(CHAR));
for(i=0; i < seq->size; i++)
{
new_data[i] = seq->elem[i];
}
free(seq->elem);
seq->elem = new_data;
}
//对动态顺序表进行尾插
void seqlist_push_back(seqlist *seq,CHAR value)
{
if(seq == NULL)
{
return ;
}
if (seq->size >= seq->capacity)
{
seqlist_expand_capacity(seq);
}
seq->elem[seq->size] = value;
seq->size++;
}
//对顺序表的销毁
void seqlist_destroy(seqlist *seq)
{
if(seq == NULL)
{
return ;
}
seq->size = 0;
seq->capacity = 0;
free(seq->elem);
}
int main()
{
seqlist_init(&seq);
seqlist_push_back(&seq,'a');
seqlist_push_back(&seq,'b');
seqlist_push_back(&seq,'c');
seqlist_push_back(&seq,'d');
//seqlist_destroy(&seq);
seqlist_print(&seq);
return 0;
}
主要与静态顺序表不同是就在内存开辟,静态是一开始就已经开辟好的,而动态是在用的时候在开辟。
一个节省了时间而有可能会造成内存浪费或者内存不足,动态与齐相反,是有可能花费时间来减少空间的浪费
也不存在内存分配不足问题。