顺序表的实现

------------------------------------头文件 SeqList.h---------------------------------------------------------------------------

#pragma once
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<assert.h>
#include<string.h>

#define N 10
typedef int DataType;

typedef struct SeqList
{
	DataType _a[N];
	int size;
}SeqList,*pSeqList;

void SeqListInit(pSeqList pSeq);//初始化
void SeqListPushBack(pSeqList pSeq, DataType x);//尾插
void SeqListPrint(pSeqList pSeq);//打印
void SeqListPopBack(pSeqList pSeq);//尾删
void SeqListPushFront(pSeqList pSeq, DataType x);//头插
void SeqListPopFront(pSeqList pSeq);//头删
int Find(pSeqList pSeq, DataType x);//查找指定元素(返回下标)
void SeqListInsert(pSeqList pSeq, int pos,DataType x);//指定位置插入
void SeqListErase(pSeqList pSeq, int pos);//删除指定位置元素
void SeqListRemove(pSeqList pSeq, DataType x);//删除指定元素										
void RemoveAll(pSeqList pSeq, DataType x);//删除所有的指定元素 
int Size(pSeqList pSeq);//返回顺序表的大小 
int Empty(pSeqList pSeq);//判断顺序表是否为空 
void BubbleSort(pSeqList pSeq);//冒泡排序 
int BinarySearch(pSeqList pSeq, DataType x);//二分查找 
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType x);//二分查找的递归实现

---------------------------------------------源文件 SeqList.c------------------------------------------------------------------

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void SeqListInit(pSeqList pSeq)//初始化
{
	assert(pSeq != NULL);
	pSeq->size = 0;
	memset(pSeq->_a, 0, sizeof(pSeq->_a));
}
void SeqListPushBack(pSeqList pSeq, DataType x)//尾插
{
	assert(pSeq != NULL);
	if (pSeq->size >= N)
	{
		printf("顺序表已满,无法插入\n");
		return;
	}
	pSeq->_a[pSeq->size] = x;
	pSeq->size++;
}
void SeqListPrint(pSeqList pSeq)//打印
{
	int i = 0;
	if (pSeq->size == 0)
	{
		printf("顺序表已空\n");
		return;
	}
	for (; i < pSeq->size; i++)
	{
		printf("%d ", pSeq->_a[i]);
	}
	printf("\n");
}
void SeqListPushFront(pSeqList pSeq, DataType x)//头插
{
	assert(pSeq != NULL);
	if (pSeq->size >= N)
	{
		printf("顺序表已满,无法插入\n");
		return;
	}
	int i = 0;
	for (i = pSeq->size-1;i>=0; i--)
	{
		pSeq->_a[i + 1] = pSeq->_a[i];
	}
	pSeq->_a[0] = x;
	pSeq->size++;
}
void SeqListPopFront(pSeqList pSeq)//头删
{
	assert(pSeq != NULL);
	if (pSeq->size == 0)
	{
		printf("顺序表已空\n");
		return;
	}
	int i = 0;
	for (; i < pSeq->size - 1; i++)
	{
		pSeq->_a[i] = pSeq->_a[i+1];
	}
	pSeq->size--;
}
int Find(pSeqList pSeq, DataType x)//查找指定元素(返回的是下标)
{
	assert(pSeq != NULL);
	int i = 0;
	for (; i < pSeq->size; i++)
	{
		if (pSeq->_a[i] == x)
		{
			return i;
		}
	}
	return -1;
}
void SeqListInsert(pSeqList pSeq, int pos, DataType x)//指定位置插入(输入的是下标)
{
	assert(pSeq != NULL);
	assert(pos <= pSeq->size);
	if (pSeq->size >= N)
	{
		printf("顺序表已满,无法插入\n");
		return;
	}
	int i = 0;
	for (i = pSeq->size - 1; i >= pos; i--)
	{
		pSeq->_a[i + 1] = pSeq->_a[i];
	}
	pSeq->_a[pos] = x;
	pSeq->size++;
}
void SeqListErase(pSeqList pSeq, int pos)//删除指定位置元素(输入的是下标)
{
	assert(pSeq != NULL);
	assert(pos <= pSeq->size);
	if (pSeq->size == 0)
	{
		printf("顺序表已空\n");
		return;
	}
	int i = 0;
	for (i = pos; i <pSeq->size - 1; i++)
	{
		pSeq->_a[i] = pSeq->_a[i+1];
	}
	pSeq->size--;
}
void SeqListRemove(pSeqList pSeq, DataType x)//删除指定元素	
{
	assert(pSeq != NULL);
	int i = 0;
	for (; i < pSeq->size; i++)
	{
		if (pSeq->_a[i] == x)
		{
			break;
		}
	}
	if (i == pSeq->size)
	{
		printf("顺序表中无此元素\n");
		return;
	}
	for (; i < pSeq->size - 1; i++)
	{
		pSeq->_a[i] = pSeq->_a[i + 1];
	}
	pSeq->size--;

}
void RemoveAll(pSeqList pSeq, DataType x)//删除所有的指定元素 
{
	assert(pSeq != NULL);
	DataType i = 0;
	int count = 0;
	for (; i < pSeq->size; i++)
	{
		if (pSeq->_a[i] != x)
		{
			pSeq->_a[count] = pSeq->_a[i];
			count++;
		}
	}
	pSeq->size = count;
}
int Size(pSeqList pSeq)//返回顺序表的大小 
{
	assert(pSeq != NULL);
	return pSeq->size;
}
int Empty(pSeqList pSeq)//判断顺序表是否为空 
{
	return pSeq->size == 0;
}
void Swap(DataType *p, DataType *q)
{
	DataType *tmp = 0;
	tmp = *p;
	*p = *q;
	*q = tmp;
}
void BubbleSort(pSeqList pSeq)//冒泡排序
{
	assert(pSeq != NULL);
	DataType i = 0, j = 0, flag = 0;
	for (; i < pSeq->size - 1; i++)
	{
		flag = 0;
		for (; j < pSeq->size - 1 - i; j++)
		{
			if (pSeq->_a[j] > pSeq->_a[j+1])
			{
				Swap(pSeq->_a+j, pSeq->_a+j+1);
				flag = 1;
			}
		}
		if (flag == 0)
			break;
	}
}
int BinarySearch(pSeqList pSeq, DataType x)//二分查找(返回下标)
{
	assert(pSeq != NULL);
	int left = 0;
	int right = pSeq->size - 1;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (pSeq->_a[mid] > x)
		{
			right = mid - 1;
		}
		else if (pSeq->_a[mid] < x)
		{
			left = mid + 1;
		}
		else
			return mid;
	}
	return -1;
}
int BinarySearch_R(pSeqList pSeq, int left, int right, DataType x)//二分查找的递归实现
{
	assert(pSeq != NULL);
	int mid = left + (right - left) / 2;
	if (left > right)
	{
		return -1;
	}
	if (pSeq->_a[mid] > x)
	{
		return BinarySearch_R(pSeq, left, mid - 1, x);
	}
	if (pSeq->_a[mid] < x)
	{
		return BinarySearch_R(pSeq, mid + 1,right, x);

	}
}

---------------------------------------------测试文件 test.c--------------------------------------------------------------------

#define _CRT_SECURE_NO_WARNINGS 1

#include "SeqList.h"
void Test()
{
	int ret = 0;
	int rett = 0;
	int rettt = 0;
	SeqList seq;
	SeqListInit(&seq);
	SeqListPushBack(&seq, 1);
	SeqListPushBack(&seq, 2);
	SeqListPushBack(&seq, 1);
	SeqListPushBack(&seq, 4);
	SeqListPrint(&seq);
	/*SeqListPushFront(&seq, 2);
	SeqListPrint(&seq);
	SeqListPopFront(&seq);
	SeqListPrint(&seq);
	ret = Find(&seq, 4);
	printf("%d\n",ret);
	SeqListInsert(&seq, 3,5);
	SeqListPrint(&seq);
	SeqListErase(&seq, 3);
	SeqListPrint(&seq);
	SeqListRemove(&seq, 0);
	SeqListPrint(&seq);*/
	//RemoveAll(&seq, 1);
	//SeqListPrint(&seq);
	//BubbleSort(&seq);
	//SeqListPrint(&seq);
	/*rett = BinarySearch(&seq, 4);
	printf("%d\n", rett);*/
	rettt = BinarySearch_R(&seq, 0,seq.size - 1, 2);
	printf("%d\n", rettt);
	SeqListPrint(&seq);
}
int main()
{
	Test();
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值