SeqList.h
#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#define MAX 100
typedef int DataType;
typedef struct SeqList
{
DataType Data[MAX];
int sz;
}SeqList, *pSeqList;
void InitSeqList(pSeqList ps);//初始化
void PushBack(pSeqList ps, DataType d);//尾部插入
void PopBack(pSeqList ps);//尾部删除
void PushFront(pSeqList ps, DataType d);//头部插入
void PopFront(pSeqList ps);//头部删除
void Insert(pSeqList ps, int pos, DataType d);//指定位置插入
int Find(pSeqList ps, DataType d);//查找
void Remove(pSeqList ps, DataType d);//删除最先出现的指定元素
void SortSeqList(pSeqList ps);//冒泡排序
void ReverseSeqList(pSeqList ps);//逆序
void BinarySearch(pSeqList ps, DataType d);//二分查找
void PrintSeqList(const pSeqList ps);//打印
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void InitSeqList(pSeqList ps)//初始化
{
memset(ps, 0, sizeof(ps->Data));
ps->sz = 0;
}
void PushBack(pSeqList ps, DataType d)//尾部插入
{
if(ps->sz == MAX)
{
printf("顺序表已满\n");
return;
}
ps->Data[ps->sz] = d;
ps->sz++;
}
void PopBack(pSeqList ps)//尾部删除
{
if(ps->sz == 0)
{
printf("顺序表为空,无法删除\n");
return;
}
ps->sz--;
}
void PushFront(pSeqList ps, DataType d)//头部插入
{
int i = 0;
if(ps->sz == MAX)
{
printf("顺序表已满\n");
return;
}
for(i=ps->sz; i>0; i--)
{
ps->Data[i] = ps->Data[i-1];
}
ps->Data[0] = d;
ps->sz++;
}
void PopFront(pSeqList ps)//头部删除
{
int i = 0;
for(i=0; i<ps->sz-1; i++)
{
ps->Data[i] = ps->Data[i+1];
}
ps->sz--;
}
void Insert(pSeqList ps, int pos, DataType d)//指定位置插入
{
int i = 0;
if(ps->sz == MAX)
{
printf("顺序表已满\n");
return;
}
for(i=ps->sz; i>pos; i--)
{
ps->Data[i] = ps->Data[i-1];
}
ps->Data[pos] = d;
ps->sz++;
}
int Find(pSeqList ps, DataType d)//查找
{
int i = 0;
for(i=0; i<ps->sz; i++)
{
if(ps->Data[i] == d)
{
printf("Data[%d] = %d\n", i, d);
return i;
}
}
return -1;
}
void Remove(pSeqList ps, DataType d)//删除最先出现的指定元素
{
int ret = Find(ps, d);
if(ret != -1)
{
int i = 0;
for(i=ret; i<ps->sz-1; i++)
{
ps->Data[i] = ps->Data[i+1];
}
ps->sz--;
}
else
{
printf("无此元素\n");
}
}
void SortSeqList(pSeqList ps)//冒泡排序
{
int i = 0;
for(i=0; i<ps->sz; i++)
{
int j = 0;
DataType tmp = 0;
for(j=0; j<ps->sz-i-1; j++)
{
if(ps->Data[j] > ps->Data[j+1])
{
tmp = ps->Data[j];
ps->Data[j] = ps->Data[j+1];
ps->Data[j+1] = tmp;
}
}
}
}
void ReverseSeqList(pSeqList ps)//逆序
{
int left = 0;
int right = ps->sz-1;
DataType tmp = 0;
while(left<right)
{
tmp = ps->Data[left];
ps->Data[left] = ps->Data[right];
ps->Data[right] = tmp;
left++;
right--;
}
}
void BinarySearch(pSeqList ps, DataType d)//二分查找
{
int left = 0;
int right = ps->sz-1;
while(left <= right)
{
int mid = left + (right-left)/2;
if(d > ps->Data[mid])
{
left = mid + 1;
}
else if(d < ps->Data[mid])
{
right = mid -1;
}
else
{
printf("Data[%d] = %d\n", mid, d);
return;
}
}
if(left > right)
{
printf("没找到\n");
}
}
void PrintSeqList(const pSeqList ps)//打印
{
int i = 0;
assert(ps);
for(i=0; i<ps->sz; i++)
{
printf("%d ", ps->Data[i]);
}
printf("\n");
}
test.c
#include "SeqList.h"
void test()
{
SeqList seqlist;
InitSeqList(&seqlist);
PushBack(&seqlist, 1);
PushBack(&seqlist, 2);
PushBack(&seqlist, 3);
PopBack(&seqlist);
PrintSeqList(&seqlist);
PushFront(&seqlist, 0);
PushFront(&seqlist, -1);
PushFront(&seqlist, -2);
PopFront(&seqlist);
PrintSeqList(&seqlist);
Insert(&seqlist, 2, 10);
PrintSeqList(&seqlist);
Find(&seqlist, 2);
Remove(&seqlist, 10);
PrintSeqList(&seqlist);
ReverseSeqList(&seqlist);
PrintSeqList(&seqlist);
SortSeqList(&seqlist);
PrintSeqList(&seqlist);
BinarySearch(&seqlist, 2);
PrintSeqList(&seqlist);
}
int main()
{
test();//测试代码
return 0;
}