动态顺序表

一、动态顺序表:

       动态顺序表也是顺序表,不过它是动态的,也就是说它的容量是可以改变的,这就克服了静态顺序表容量不能改变的缺点。当顺序表的容量存满以后,我们可以对它进行扩容,概念就简单介绍到这里了。

二、动态顺序表的数据结构:

<span style="font-size:18px;">typedef struct SeqList_D
{
	DataType* array;          //指向数据块的指针
	size_t size;              //当前数据数
	size_t capacity;          //总容量
}SeqList_D;</span>


      与静态顺序表不同,因为它的大小要发生改变,所以我们不能用数组,而要使用指针,然后动态开辟内存空间。我们同时需要记住当前存储的数据个数和动态顺序表的总容量。下面解释一下当前存储的数据个数size与顺序表总容量capacity的区别吧,如下图:

       我们开辟了一个10个元素大小的空间,但是空间里面只存储了5个数据,这时的存储数据个数size=5,总容量capacity = 10,为什么要记录他们两个呢?因为我们在操作动态顺序表的时候会用到呀,就比如插入元素的时候你应该把它放在前面那个元素的后面,所以你要知道你已经存了多少个数据,你才能知道你要把这个数据存放的位置,怎么判断你的空间存满呢,你也得知道你的容量呀,是吧。所以,以上三个成员都需要。

三、代码实现:(环境:vs2010       语言:c语言 )

      讲完了思想,就要来看看代码了,下面基本实现了动态顺序表的一部分内容。

1.声明文件SeqList_D.h

#ifndef __SEQLIST_D_H__
#define __SEQLIST_D_H__

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

typedef int DataType;

typedef struct SeqList_D
{
	DataType* data;    //存储数据
	size_t size;       //已存数据个数
	size_t capacity;   //容量
}Seq, *pSeq;

void InitSeqList(pSeq pseq);
void Destroy(pSeq pseq);
void PrintSeqList(const pSeq pseq);
void PushBack(pSeq pseq, DataType x);
void PopBack(pSeq pseq);
void PushFront(pSeq pseq, DataType x);
void PopFront(pSeq pseq);
void Remove(pSeq pseq, DataType x);
void RemoveAll(pSeq pseq, DataType x);
void BubbleSort(pSeq pseq);
void InsertSort(pSeq pseq);
void SelectSort(pSeq pseq);

#endif


 

2.功能实现SeqList_D.c

#include "SeqList_D.h"
#define INIT_VALUE 3

void InitSeqList(pSeq pseq)                  //动态顺序表的初始化                                                                  {
	assert(pseq);
	pseq->data = (DataType *)malloc(INIT_VALUE * sizeof(DataType));
	pseq->size = 0;
	pseq->capacity = INIT_VALUE;
}

void Destroy(pSeq pseq)
{
	assert(pseq);
	if(pseq->data != NULL)
	{
		free(pseq->data);
		pseq->data = NULL;
	}
	pseq->size = 0;
	pseq->capacity = 0;
}

void PrintSeqList(const pSeq pseq)
{
	size_t i = 0;
	assert(pseq);
	for(i = 0; i < pseq->size; i++)
	{
		printf("%d ",pseq->data[i]);
	}
	printf("\n");
}
void CheckCapacity(pSeq pseq)
{
	assert(pseq);
	if(pseq->size == pseq->capacity)
	{
		DataType *tmp = (DataType* )realloc(pseq->data,
						(pseq->capacity*2+1)*sizeof(DataType));
		if(tmp == NULL)
		{
			printf("out of memeory\n");
			exit(0);
		}
		pseq->data = tmp;
		pseq->capacity = pseq->capacity*2+1;
	}
	
}
void PushBack(pSeq pseq, DataType x)
{
	assert(pseq);
	CheckCapacity(pseq);
	pseq->data[pseq->size] = x;
	pseq->size++;
}
void PopBack(pSeq pseq)
{
	assert(pseq);
	if(pseq->size == 0)
	{
		printf("SeqList is Empty\n");
		return;
	}
	pseq->size--;
}
void PushFront(pSeq pseq, DataType x)
{
	int i;
	assert(pseq);
	CheckCapacity(pseq);
	for(i = pseq->size-1; i >= 0; i--)
	{
		pseq->data[i+1] = pseq->data[i];
	}
	pseq->data[0] = x;
	pseq->size++;
}
void PopFront(pSeq pseq)
{
	int i = 0;
	assert(pseq);
	if(pseq->size == 0)
	{
		printf("SeqList is Empty");
		return;
	}
	for(i = 0; i < pseq->size-1; i++)
	{
		pseq->data[i] = pseq->data[i+1];
	}
	pseq->size--;
}
void Remove(pSeq pseq, DataType x)
{
	int i = 0;
	assert(pseq);
	for(i = 0; i < pseq->size; i++)
	{
		if(pseq->data[i] == x)
		{
			break;
		}
	}
	if(i == pseq->size)
	{
		printf("no find\n");
		return;
	}
	for( ;i < pseq->size-1; i++)
	{
		pseq->data[i] = pseq->data[i+1];
	}
	pseq->size--;

}
void RemoveAll(pSeq pseq, DataType x)
{
	int count = 0;
	int i = 0;
	for(i = 0; i<pseq->size; i++)
	{
		if(pseq->data[i] == x)
		{
			count++;
			continue;
		}
		if(count != 0)
		{
			pseq->data[i-count] = pseq->data[i];
		}
	}
	if(count == 0)
	{
		printf("no find \n");
		return;
	}
	pseq->size -= count;
}

void BubbleSort(pSeq pseq)
{
	int i = 0;
	int j = 0;
	int flag1 = 0;
	int k = pseq->size-1;
	assert(pseq);
	for(i = 0; i < pseq->size-1; i++)
	{
		int flag2 = 0;
		flag1 = 0;
		for(j = 0; j < k; j++)
		{
			if(pseq->data [j] > pseq->data[j+1])
			{
				DataType tmp = pseq->data[j];
				pseq->data[j] = pseq->data[j+1];
				pseq->data[j+1] = tmp;
				flag1 = 1;
				flag2 = j;
			}
		}
		k = flag2;
		if(flag1 == 0)
		{
			return;
		}
	}
}

void InsertSort(pSeq pseq)
{
	int i = 0;
	assert(pseq);
	for(i = 1; i < pseq->size; i++)
	{
		if(pseq->data[i-1] > pseq->data[i])
		{
			int j = 0;
			int tmp = pseq->data[i];
			for(j = i-1; (j>=0)&&(tmp<pseq->data[j]); j--)
			{
				pseq->data[j+1] = pseq->data[j];
			}
			pseq->data[j+1] = tmp;
		}
	}
}

void SelectSort(pSeq pseq)
{
	int i = 0;
	int min = 0;
	assert(pseq);
	for(i = 0; i < pseq->size-1; i++)
	{
		int j = 0;
		DataType tmp;
		min = i;
		for(j = i+1; j < pseq->size; j++)
		{
			if(pseq->data[j] < pseq->data[min])
				min = j;
		}
	    tmp = pseq->data[i];
		pseq->data[i] = pseq->data[min];
		pseq->data[min] = tmp;
	}
}


3.测试文件:

#include "SeqList_D.h"

void Test1()
{
	Seq seq;
	InitSeqList(&seq);
	PushBack(&seq, 1);
	PushBack(&seq, 2);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);

	PopBack(&seq);
	PopBack(&seq);

	PrintSeqList(&seq);
}
void Test2()
{
	Seq seq;
	InitSeqList(&seq);
	PushFront(&seq, 1);
	PushFront(&seq, 2);
	PushFront(&seq, 3);
	PushFront(&seq, 4);
	PushFront(&seq, 5);

	PopFront(&seq);
	PopFront(&seq);
	PopFront(&seq);
	PopFront(&seq);
//	PopFront(&seq);
//	PopFront(&seq);

	PrintSeqList(&seq);
}

void Test3()
{
	Seq seq;
	InitSeqList(&seq);
	PushBack(&seq, 1);
	PushBack(&seq, 5);
	PushBack(&seq, 2);
	PushBack(&seq, 5);
	PushBack(&seq, 3);
	PushBack(&seq, 4);
	PushBack(&seq, 5);
    
//	Remove(&seq, 5);
//	Remove(&seq, 6);
//	RemoveAll(&seq, 5);
	RemoveAll(&seq, 6);
	PrintSeqList(&seq);
}

void Test4()
{
	Seq seq;
	InitSeqList(&seq);
	PushBack(&seq, 10);
	PushBack(&seq, 5);
	PushBack(&seq, 2);
	PushBack(&seq, 5);
	PushBack(&seq, 3);
	PushBack(&seq, 10);
	PushBack(&seq, 5);
	PushBack(&seq, 6);
	PushBack(&seq, 8);
	PushBack(&seq, 7);
	PushBack(&seq, 9);
	PushBack(&seq, 1);

	PrintSeqList(&seq);
//	BubbleSort(&seq);
	InsertSort(&seq);
//	SelectSort(&seq);
	PrintSeqList(&seq);

}
int main()
{
	//Test1();
	//Test2();
	//Test3();
	Test4();
	system("pause");
	return 0;
}


 

好啦,代码也写完啦,动态顺序表的讲解到这里就结束了,谢谢阅读,文章属本人编写,若有错误,欢迎指出哦!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值