------------------------------------头文件 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;
}