【数据结构】C语言实现动态顺序表

大概之后的数据结构博客就都使用多文件操作了。

一.顺序表功能实现以及数据定义

#ifndef  _SEQLIST_H_
#define _SEQLIST_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
#define N 100
typedef int DataType;
typedef struct SeqList
{
	DataType* array; //动态数组
	size_t size;//数据量
	size_t capacity;//容量
}SeqList,*PSeqList;

void InitSeqList(PSeqList pSeq)//初始化
{
	pSeq->array = (DataType*)malloc(sizeof(DataType)*N);//动态申请大小为N的数组
	if (NULL == pSeq->array)
		exit(-1);
	pSeq->capacity = N;
	pSeq->size = 0;
}
void CheckCapacity(PSeqList pSeq)//检测容量
{
	if (pSeq->size == pSeq->capacity)
	{
		DataType* tmp = (DataType*)realloc(pSeq->array, (pSeq->capacity*2) * sizeof(DataType));
		if (NULL == tmp)
			exit(-1);
		pSeq->array = tmp;
		pSeq->capacity *= 2;
	}
}
void PushBack(PSeqList pSeq, DataType data)//尾插
{
	CheckCapacity(pSeq);
	pSeq->array[pSeq->size] = data;
	pSeq->size++;
}
void PopBack(PSeqList pSeq)//尾删
{
	if (pSeq->size > 0)
	{
		pSeq->size -= 1;
	}
}
void PopFront(PSeqList pSeq)//头删
{
	int i ;
	for (i = 0 ; i < pSeq->size - 1; ++i)
	{
		pSeq->array[i] = pSeq->array[i + 1];
	}
	pSeq->size -= 1;
}
void PushFront(PSeqList pSeq, DataType data)//头插
{
	int i ;
	CheckCapacity(pSeq);
	for (i = pSeq->size; i > 0; --i)
	{
		pSeq->array[i] = pSeq->array[i - 1];
	}
	pSeq->array[0] = data;
	pSeq->size++;
}
void PrintSeqlist(PSeqList pSeq)//打印
{
	int i ;
	for (i = 0; i < pSeq->size; ++i)
	{
		printf("%d ", pSeq->array[i]);
	}
	printf("\n");
}

void Erase(PSeqList pSeq, size_t pos)
{
	int i ;
	for (i = pos; i < pSeq->size - 1; ++i)
	{
		pSeq->array[i] = pSeq->array[i + 1];
	}
	pSeq->size--;
}
int Find(PSeqList pSeq, DataType data)//查找值为data的元素
{
	size_t i = 0;
	for (; i < pSeq->size; ++i)
	{
		if (pSeq->array[i] == data)
			return i;
	}
	return -1;
}

void RemoveAll(PSeqList pSeq, DataType data)//移除所有值为data的元素
{
	size_t i = 0, count = 0;
	for (; i < pSeq->size; ++i)
	{
		if (pSeq->array[i] == data)
		{
			++count;
		}
		else
		{
			pSeq->array[i - count] = pSeq->array[i];
		}
	}
	pSeq->size -= count;
}
void Destroy(PSeqList pSeqList)//销毁
{
	if (NULL != pSeqList)
	{
		free(pSeqList->array);
		pSeqList->array = NULL;
		pSeqList->capacity = 0;
		pSeqList->size = 0;
	}
}
void Insert(PSeqList pSeq, size_t pos, DataType data)//任意位置插入
{
	int i ;
	for (i = pSeq->size; i > pos; --i)
	{
		pSeq->array[i] = pSeq->array[i - 1];
	}
	pSeq->array[i] = data;
	pSeq->size++;
}

void BubbleSort(PSeqList pSeq)//冒泡排序
{
	int i, j, tmp,flag;
	for (i = 0; i < pSeq->size - 1; ++i)
	{
		flag = 0;
		for (j = pSeq->size - 1; j > i; --j)
		{
			if (pSeq->array[i] > pSeq->array[j])
			{
				tmp = pSeq->array[i];
				pSeq->array[i] = pSeq->array[j];
				pSeq->array[j] = tmp;
				flag++;
			}
		}
		if (flag == 0)
		{
			break;
		}
	}
}
void SelectSort(PSeqList pSeq)//选择排序
{
	int min_num = 0;
	int i, j, tmp;
	for (i = 0; i < pSeq->size - 1; ++i)
	{
		min_num = i;
		for (j = i + 1; j < pSeq->size; j++)
		{
			if (pSeq->array[j] < pSeq->array[min_num])
			{
				min_num = j;
			}
		}
		if (min_num != i)
		{
			tmp = pSeq->array[i];
			pSeq->array[i] = pSeq->array[min_num];
			pSeq->array[min_num] = tmp;
		}
	}
}
int BinarySearch(PSeqList pSeq, DataType data)//二分搜索
{
	int left = 0;
	int right = pSeq->size - 1;
	int mid = 0;
	while (left <= right)
	{
		mid = left + ((right - left) >> 1);
		if (pSeq->array[mid] == data)
		{
			return mid;
		}
		else if (pSeq->array[mid] > data)
		{
			right = mid - 1;
		}
		else
		{
			left = mid + 1;
		}
	}
	return mid;
}

void InsertSearch(PSeqList pSeq)//插入排序
{
	
	int target = 0;
	size_t i, j;
	for (i = 1; i < pSeq->size; ++i)
	{
		target = pSeq->array[i];//待插入
		j = i;
		while (j > 0 && pSeq->array[j - 1] > target)//后移
		{
			pSeq->array[j] = pSeq->array[j - 1];
			j--;
		}
		pSeq->array[j] = target;//插入
	}
}
#endif

二.测试程序

#include<stdio.h>
#include"head.h"
int main()
{
	SeqList p;
	InitSeqList(&p);

	PushBack(&p, 1);
	PushBack(&p, 2);
	PushBack(&p, 3);
	PushBack(&p, 4);
	PrintSeqlist(&p);

	PopBack(&p);
	PrintSeqlist(&p);

	PushFront(&p, 4);
	PushFront(&p, 5);
	PrintSeqlist(&p);

	PopFront(&p);
	PrintSeqlist(&p);

	Insert(&p, 2, 6);
	PrintSeqlist(&p);

	Erase(&p, 2);
	PrintSeqlist(&p);

	BinarySearch(&p, 3);
	system("pause");
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值