seqlist.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<assert.h>
#include <string.h>
#define MAX_SIZE 10
typedef int DataType;
typedef struct Seqlist
{
DataType data[MAX_SIZE];//数据
int sz;//个数
}Seqlist,*pSeqlist;
//初始化
void InitSeqList(pSeqlist pSeq);
//打印
void PrintSeqList(pSeqlist pSeq);
//尾部插入元素
void PushBack(pSeqlist pSeq,DataType d);
//尾部删除元素
void PopBack(pSeqlist pSeq);
//头部插入
void PushFrount(pSeqlist pSeq,DataType d);
// 头部删除
void PopFrount(pSeqlist pSeq);
//查找元素
int Find(pSeqlist pSeq, DataType d);
//指定位置插入
void Insert(pSeqlist pSeq, int pos, DataType d);
//删除指定位置元素
void Erase(pSeqlist pSeq, int pos);
//删除指定元素
void Remove(pSeqlist pSeq, DataType d);
//删除所有的指定元素
void RemoveAll(pSeqlist pSeq, DataType d);
//返回顺序表的大小
int Size(pSeqlist pSeq);
//判断顺序表是否为空
int Empty(pSeqlist pSeq);
//冒泡排序
void BubbleSort(pSeqlist pSeq);
//选择排序
void SelectSort(pSeqlist pSeq);
//选择排序的优化
void SelectSortOP(pSeqlist pSeq);
//二分查找
int BinarySearch(pSeqlist pSeq, DataType d);
//二分查找递归写法
int BinarySearch_R(pSeqlist pSeq, int left, int right, DataType d);
#endif //__SEQLIST_H__
seqlist.c
#include "seqlist.h"
void InitSeqList(pSeqlist pSeq)
{
assert(pSeq != NULL);
pSeq->sz=0;
memset(pSeq->data,0,sizeof(pSeq->data));
}
void PushBack(pSeqlist pSeq,DataType d)
{
assert(pSeq != NULL);
if(pSeq->sz==MAX_SIZE)
{
printf("已满/n");
return;
}
pSeq->data[pSeq->sz]=d;
pSeq->sz++;
}
void PopBack(pSeqlist pSeq)
{
assert(pSeq !=NULL);
if(pSeq->sz==0)
{
printf("为空不可删除\n");
return;
}
pSeq->data[pSeq->sz-1]=0;
pSeq->sz--;
}
void PrintSeqList(pSeqlist pSeq)
{
int i=0;
assert(pSeq!=NULL);
for(i=0;i<pSeq->sz;i++)
{
printf("%d ",pSeq->data[i]);
}
printf("\n");
}
void PushFrount(pSeqlist pSeq,DataType d)
{
int i=0;
assert(pSeq!=NULL);
if(pSeq->sz==MAX_SIZE)
{
printf("已满\n");
return;
}
for(i=pSeq->sz;i>0;i--)
{
pSeq->data[i]=pSeq->data[i-1];
}
pSeq->data[0]=d;
pSeq->sz++;
}
void PopFrount(pSeqlist pSeq)
{
int i=0;
assert(pSeq!=NULL);
if(pSeq->sz==0)
{
printf("为空不可删除\n");
return;
}
for(i=0;i<pSeq->sz-1;i++)
{
pSeq->data[i]=pSeq->data[i+1];
}
pSeq->sz--;
}
int Find(pSeqlist pSeq, DataType d)
{
int i=0;
assert(pSeq!=NULL);
for(i=0;i<pSeq->sz;i++)
{
if(pSeq->data[i]==d)
{
printf("找到了\n");
return 1;
}
else
{
printf("没找到\n");
return 0;
}
}
}
void Insert(pSeqlist pSeq, int pos, DataType d)
{
int i=0;
assert(pSeq!=NULL);
if(pos< (pSeq->sz))
{
for( i=pSeq->sz;i>pos;i--)
{
pSeq->data[i]=pSeq->data[i-1];
}
pSeq->data[pos]=d;
}
pSeq->sz++;
}
void Erase(pSeqlist pSeq, int pos)
{
int i=0;
assert(pSeq!=NULL&&pos>=0&&pos<pSeq->sz);
if(pSeq->sz==0)
{
printf("为空不可删\n");
return;
}
for(i=pos;i<pSeq->sz-1;i++)
{
pSeq->data[i]=pSeq->data[i+1];
}
pSeq->sz--;
}
void Remove(pSeqlist pSeq, DataType d)
{
int j=0;
assert(pSeq!=NULL);
for(j=0;j<pSeq->sz-1;j++)
{
if(pSeq->data[j]==d)
Erase(pSeq, j);
}
}
void RemoveAll(pSeqlist pSeq, DataType d)
{
int i=0;
int j=0;
assert(pSeq!=NULL);
while(i<pSeq->sz)
{
for(j=0;j<pSeq->sz-1;j++)
{
if(pSeq->data[j]==d)
Erase(pSeq, j);
}
i++;
}
}
int Size(pSeqlist pSeq)
{
assert(pSeq!=NULL);
printf("%d",pSeq->sz);
return pSeq->sz;
}
int Empty(pSeqlist pSeq)
{
if(pSeq->sz==0)
{
printf("为空表");
return 0;
}
else
{
printf("不为空表");
return 1;
}
}
void sort(DataType*a,DataType*b)
{
DataType tmp=*a;
*a=*b;
*b=tmp;
}
void BubbleSort(pSeqlist pSeq)
{
int i=0;
int j=0;
int tmp=0;
assert(pSeq!=NULL);
for(i=0;i<pSeq->sz;i++)
{
for( j=0;j<pSeq->sz-1-i;j++)
{
if(pSeq->data[j]>pSeq->data[j+1])
{
sort(pSeq->data+j,pSeq->data+j+1);
}
}
}
}
void SelectSort(pSeqlist pSeq)
{
int i=0;
int j=0;
assert(pSeq!=NULL);
for(i=0;i<pSeq->sz-1;i++)
{
int tmp=0;
for(j=1;j<pSeq->sz-i;j++)
{
if(pSeq->data[j]>pSeq->data[tmp])
{
tmp=j;
}
}
if(tmp!=pSeq->sz-1-i)
{
sort(pSeq->data+tmp,pSeq->data+pSeq->sz-i-1);
}
}
}
int BinarySearch(pSeqlist pSeq, DataType d)
{
int left =0;
int right=pSeq->sz-1;
assert(pSeq!=NULL);
while(left<right)
{
int mid =left+(right-left)/2;
if(pSeq->data[mid]<d)
{
left=mid+1;
}
else
{
if(pSeq->data[mid]>d)
{
right=mid-1;
}
else
{
printf("找到了%d\n",mid);
return mid;
}
}
}
}
int BinarySearch_R(pSeqlist pSeq, int left, int right, DataType d)
{
int mid =left+(right-left)/2;
assert(pSeq!=NULL);
if(pSeq->data[mid]<d)
{
left=mid+1;
BinarySearch_R(pSeq, left, right, d);
}
else
{
if(pSeq->data[mid]>d)
{
right=mid-1;
BinarySearch_R( pSeq, left, right, d);
}
else
printf("找到了,下标为%d\n",mid);
}
}
test.c
#include<stdio.h>
#include "seqlist.h"
void test()
{
Seqlist seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,3);
PushBack(&seq,1);
PushBack(&seq,4);
// PopBack(&seq);
// PrintSeqList(&seq);
// PushFrount(&seq,3);
// PrintSeqList(&seq);
//PopFrount(&seq);
//PrintSeqList(&seq);
// Find(&seq,2);
//Insert(&seq,2,8);
//PrintSeqList(&seq);
//rase(&seq,0);
//PrintSeqList(&seq);
// Remove(&seq,2);
// PrintSeqList(&seq);
// RemoveAll(&seq,1);
//PrintSeqList(&seq);
// Size(&seq);
// Empty(&seq);
BubbleSort(&seq);
PrintSeqList(&seq);
SelectSort(&seq);
// PrintSeqList(&seq);
// BinarySearch(&seq,3);
// BinarySearch_R(&seq,0,4,2);
PrintSeqList(&seq);
}
int main()
{
test();
system("pause");
return 0;
}
自己实现的,可能有些地方有问题或有待优化,欢迎大家帮忙指出啊