c 语言 动态顺序表

#ifndef __SEQLIST_D__//头文件
#define __SEQLIST_D__
#define CAPICITY 4

typedef int DataType;

typedef struct SeqList_D
{
	DataType* _Array;
	size_t    _size;
	size_t    _capicity;
}SeqL,*pSeqL;

void InitSeqList(pSeqL seq);
void PrintfSeqList(pSeqL seq);
void PushBack(pSeqL seq,DataType x);
void PopBack(pSeqL seq);
void BubbleSort(pSeqL seq);
void SelectSort(pSeqL seq);
int BinarySearch(pSeqL seq, DataType x);
void AddCapicity(pSeqL* seq);

#endif

#include<stdio.h>//函数文件
#include<assert.h>
#include"SeqList_D.h"
#include<malloc.h>

void InitSeqList(pSeqL seq)
{
	assert(seq);
	seq->_Array = (DataType*)malloc(sizeof(DataType)*CAPICITY);
	seq->_size = 0;
	seq->_capicity = CAPICITY;
}

void PrintfSeqList(pSeqL seq)
{
	size_t index = 0;
	assert(seq);
	if (seq->_size == 0)
		printf("顺序表已空!\n");
	for (; index < seq->_size; ++index)
	{
		printf("%d ",seq->_Array[index]);
	}
	printf("\n");
}
//尾插
void PushBack(pSeqL seq, DataType x)
{
	assert(seq);
	AddCapicity(&seq);
	seq->_Array[(seq->_size)++] = x;
}
//尾删
void PopBack(pSeqL seq)
{
	assert(seq);
	if (seq->_size == 0)
		printf("顺序表为空!\n");
	else
		--seq->_size;
}
//冒泡排序__升序
void BubbleSort(pSeqL seq)
{
	size_t i=0,j=0;//循环变量
	assert(seq);
	for (; i < seq->_size; ++i)
	{
		int count = 0;//计数器
		for (j=0; j < seq->_size - 1 - i; ++j)
		{
			if (seq->_Array[j]>seq->_Array[j + 1])
			{
				DataType tmp = seq->_Array[j];
				seq->_Array[j] = seq->_Array[j + 1];
				seq->_Array[j + 1] = tmp;
				++count;
			}
		}
		if (count <= 1)
			return;
	}
}

//选择排序__降序
void SelectSort(pSeqL seq)
{
	size_t i = 0, j = 0,min=0,max=seq->_size-1;//循环变量
	for (; i < seq->_size - 1; ++i)
	{
		for (j = i + 1; j < seq->_size-i; ++j)
		{
			if (seq->_Array[min] < seq->_Array[max])//交换头 尾
			{
				DataType tmp = seq->_Array[min];
				seq->_Array[min] = seq->_Array[max];
				seq->_Array[max] = tmp;
			}
			if (seq->_Array[min] < seq->_Array[j])//交换头 中
			{
				DataType tmp = seq->_Array[min];
				seq->_Array[min] = seq->_Array[j];
				seq->_Array[j] = tmp;
			}
			if (seq->_Array[j] < seq->_Array[max])//交换中 尾
			{
				DataType tmp = seq->_Array[max];
				seq->_Array[max] = seq->_Array[j];
				seq->_Array[j] = tmp;
			}
			PrintfSeqList(seq);
		}
		max--;
		min++;
		if (max <= min)
			break;
	}
}

//二分查找
int BinarySearch(pSeqL seq, DataType x)
{
	size_t lift = 0, right = seq->_size - 1;
	while (lift < right)
	{
		if (seq->_Array[(lift + right) / 2] > x)
			lift= (lift + right) / 2+1;
		if (seq->_Array[(lift + right) / 2] < x)
			right = (lift + right) / 2;
		if (seq->_Array[(lift + right) / 2] == x)
			return (lift + right) / 2;
	}
	return -1;
}

//增容
void AddCapicity(pSeqL* seq)
{
	assert(seq);
	assert(*seq);
	if ((*seq)->_capicity == (*seq)->_size)
	{
		(*seq)->_Array =realloc((*seq)->_Array,sizeof(DataType)*((*seq)->_capicity)*2);//用realloc函数增加容量
		(*seq)->_capicity *= 2;
		size_t index = 0;
	}
}

#include<stdio.h>//主函数 测试函数
#include"SeqList_D.h"

void test1()
{
	SeqL seq ;
	InitSeqList(&seq);
	PushBack(&seq, 1);
	PushBack( &seq,  4);
	PushBack( &seq,  3);
	PushBack( &seq,  2);
	PrintfSeqList(&seq);
	PushBack( &seq,  5);
	PrintfSeqList(&seq);
	PopBack( &seq);
	PopBack( &seq);
	PopBack( &seq);
	PopBack( &seq);
	PopBack(&seq);
	PopBack( &seq);
	PrintfSeqList(&seq);

}

void test2()
{
	SeqL seq;
	InitSeqList(&seq);
	PushBack(&seq, 1);
	PushBack(&seq, 4);
	PushBack(&seq, 3);
	PushBack(&seq, 2);
	PushBack(&seq, 9);
	PushBack(&seq, 6);
	PushBack(&seq, 7);
	PushBack(&seq, 5);
	PrintfSeqList(&seq);
	PrintfSeqList(&seq);
    BubbleSort(&seq);
	PrintfSeqList(&seq);
	SelectSort(&seq);
	PrintfSeqList(&seq);
	printf("%d\n",BinarySearch(&seq, 2));
}

int  main()
{
	test2();
	return 0;
}
时间: 2024-10-09 22:13:23

c 语言 动态顺序表的相关文章

C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack

#include<stdio.h> #include<stdlib.h> #include<assert.h> #include<string.h> #include<malloc.h> typedef int DateType; typedef struct SeqList {     DateType *arr;     size_t capacility;     size_t size; }SeqList; //创建空间 void Che

【C语言】静态顺序表和动态顺序表的实现

静态顺序表 定义一张顺序表也就是在内存中开辟一段连续的存储空间,并给它一个名字进行标识.只有定义了一个顺序表,才能利用该顺序表存放数据元素,也才能对该顺序表进行各种操作. 有两种定义顺序表的方法:一是静态地定义一张顺序表:二是动态地生成一张顺序表. 静态地定义一张顺序表的方法与定义一个数组的方法类似.可以描述如下: #define MAX_SIZE 100 typedef int DataType; typedef struct SeqList { DataType array[MAX_SIZE

C++实现动态顺序表

顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构.这样的存储方式使得线性表逻辑上相邻的元素,其在物理存储单元中也是相邻的.只要知道了第一个元素的存储地址,就可以知道线性表中任何一个元素的存储地址.本文利用C++语言,在Windows平台 Visual Studio 2015开发环境下实现.功能:应用C++语言实现顺序表的各项操作.基本的成员函数:构造函数.拷贝构造函数.赋值运算符的重载.析构函数. // 顺序表构造成功之后,里面存放了n个元素

c实现的动态顺序表

第一篇文章中用c实现了静态顺序表,但是使用静态顺序表还有不足的地方.当我们需要存储的数据很少时,如果静态顺序表的数组容量较大就会造成空间的浪费:当我们需要存储的数据很多时,如果静态顺序表的数组容量较小可能就会造成数据丢失.所以一般情况我们应该尽量把顺序表实现成动态的.需要多大容量就开辟多大容量. 静态顺序表和动态顺序表只有以下函数不同: 1.定义结构体时,多定义一个capacity,并对capacity进行初始化和增加大小的设置: #define INIT_CAPACITY 3 #define 

动态顺序表 与 双向链表的模板类

//////////////////////////////////////////////////////////////////////// /////////////////////泛型编程之动态顺序表的模板///////////////////////// //////////////////////////////////////////////////////////////////////// #include<iostream> #include<string> u

静态顺序表和动态顺序表

实现一个静态顺序表,首先,要定义一个保存数据的数组,保存在结构体中,用size来存储数组中的元素个数, typedef struct SeqList { DataType array[MAX_SIZE]; size_t size; }SeqList; 首先来实现一下静态顺序表的初始化函数,可以借用系统的memset函数来实现,开辟一块空间全部初始化为0,没有存入数据所以size也为0 void InitSeqList(SeqList *pSeq) { assert(pSeq); memset(p

动态顺序表(可分配内存空间)

<strong style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">前几天写了一个静态顺序表,但是觉得一开始开辟很大一部分空间却不一定可以完全用得上,会造成很大的内存浪费,于是写了一个可以自动开辟内存空间的动态顺序表作为改进.</strong> "DynamicSeqllist.h" #pragma once #def

C语言实现顺序表的增删查改以及排序

顺序表是线性表中的一种重要的数据结构,也是最基础的数据结构,今天我用C语言实现下线性表的基本操作,以及冒泡排序与选择排序在线性表中的算法实践,代码如下: seqlist.h: #ifndef __SEQLIST__ #define __SEQLIST__ #define MAX 5 #include <stdlib.h> typedef int DataType; typedef struct SeqList { DataType array[MAX]; size_t size; }SeqLi

利用C语言实现顺序表

利用C语言实现静态顺序表 //---------- 头文件#include "SeqList.h" -------------------- #pragma once #include<stdio.h>#include<stdlib.h>#include<string.h> #define MAX 100 //------------------ 定义数据类型 ----------------------------typedef int DataT