"SeqList.h"
<strong><span style="font-size:18px;">#ifndef __SEQLIST_H__//防止重定义
#define __SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define MAX 5
typedef int DataType;//typedef语句后面要有一个分号;
typedef struct SeqList
{
DataType Data[MAX];
int size;
}SeqList,*pSeqList;
//初始化
void InitSeqList(pSeqList pSeq);
//打印
void PrintSeqList(pSeqList pSeq);
//尾插法
void PushBack(pSeqList pSeq,DataType x);
//尾删法
void PopBack(pSeqList pSeq);
//头插法
void PushFront(pSeqList pSeq,DataType x);
//头删法
void PopFront(pSeqList pSeq);
//查找某个数据在顺序表中的位置
int Find(pSeqList pSeq,DataType x);
//在某个下标中插入一个数据
void Insert(pSeqList pSeq,int pos,DataType x);
//删除x的数据
void Remove(pSeqList pSeq,DataType x);
//删除所有x的数据
void RemoveAll(pSeqList pSeq,DataType x);
//升序排序顺序表
void Sort(pSeqList pSeq);
//二分查找
int BinarySearch(pSeqList pSeq,DataType x);
//删除下标为pos的数据
void Erase(pSeqList pSeq,size_t pos);
//选择排序
void SelectSort(pSeqList pSeq);
#endif //__SEQLIST_H__</span></strong>
"SeqList.c"
<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void InitSeqList(pSeqList pSeq)
{
pSeq->size = 0;
//memset(pSeq->Data,0,sizeof(DataType)*MAX); //初始化结构体中Data的值
memset(pSeq, 0, sizeof(pSeq)*MAX); //初始化整个结构体
}
// 1、参数合法性检测
// 边界条件
// 实现逻辑
void PrintSeqList(pSeqList pSeq)
{
int i = 0;
for (i = 0; i < pSeq->size;i++)
{
printf("%d ",pSeq->Data[i]);
}
printf("\n");
}
void PushBack(pSeqList pSeq,DataType x)//尾插法
{
assert(pSeq);
if (pSeq->size >= MAX)
{
printf("SeqList is full\n");
return;
}
pSeq->Data[pSeq->size] = x;
pSeq->size++;
}
void PopBack(pSeqList pSeq)//尾删法
{
assert(pSeq);
if (pSeq->size == 0)
{
printf("SeqList is empty\n");
return;
}
pSeq->size--;
}
void PushFront(pSeqList pSeq,DataType x)
{
int i = 0;
assert(pSeq);
if (pSeq->size >= MAX)
{
printf("SeqList is full\n");
return;
}
else if(pSeq->size == 0)
{
pSeq->Data[0] = x;
pSeq->size++;
}
else
{
//for (i = 0;i<pSeq->size;i++) //这是一个严重的错误,会把原来的值覆盖掉
//{
// pSeq->Data[i+1] = pSeq->Data[i];
//}
//搬移元素
for (i = pSeq->size;i>=0;i--)
{
pSeq->Data[i] = pSeq->Data[i - 1];
}
pSeq->Data[0] = x;
pSeq->size++;
}
}
void PopFront(pSeqList pSeq)
{
int i = 0;
assert(pSeq);
if (pSeq->size == 0)
{
printf("SeqList is empty\n");
}
for (i = 0;i < pSeq->size;i++)
{
pSeq->Data[i] = pSeq->Data[i+1];
}
pSeq->size--;
}
int Find(pSeqList pSeq,DataType x)
{
int i = 0;
assert(pSeq);
if (pSeq->size == 0)
{
printf("SeqList is empty\n");
return;
}
for (i = 0;i < pSeq->size; i++)
{
if (x == pSeq->Data[i])
{
return i;//如果找得到x,则返回x所在下标的值
}
}
return -1;//如果没有找到x,则返回一个负数
}
void Insert(pSeqList pSeq,int pos,DataType x)
{
int i = 0;
assert(pSeq);
if (pSeq->size >= MAX)
{
printf("SeqList is full\n");
return;
}
if (pos <= pSeq->size)
{
for (i = pSeq->size;i>pos;i--)
{
pSeq->Data[i] = pSeq->Data[i - 1];
}
pSeq->Data[pos] = x;
pSeq->size++;
}
else
{
printf("pos is error\n");
}
}
void Erase(pSeqList pSeq,size_t pos)
{
int i = 0;
if (pSeq->size == 0 || pos > pSeq->size - 1)
{
return;
}
for (i = pos;i<pSeq->size;i++)
{
pSeq->Data[i] = pSeq->Data[i + 1];
}
pSeq->size--;
}
void Remove(pSeqList pSeq,DataType x)
{
//调用函数方法
int pos = 0;
assert(pSeq);
if (pSeq->size == 0)
{
printf("Seqlist is empty\n");
return;
}
pos = Find(pSeq,x);
if (pos <0)
{
printf("no find x\n");
return;
}
else
{
Erase(pSeq,pos);
}
//非函数调用方法
//int i = 0;
//assert(pSeq);
//if (pSeq->size == 0)
//{
// printf("SeqList is empty\n");
//}
//for (i = 0;i < pSeq->size;i++)
//{
// if (pSeq->Data[i] == x)
// {
// for (;i<pSeq->size;i++)
// {
// pSeq->Data[i] = pSeq->Data[i+1];
// }
// pSeq->size--;
// return;
// }
//}
//if (i == pSeq->size)
//{
// printf("no find x\n");
// return;
//}
}
void RemoveAll(pSeqList pSeq,DataType x)
{
int i = 0;
//int j = 0;
int count = 0;
assert(pSeq);
if (pSeq->size == 0)
{
printf("SeqList is empty\n");
}
//方法一
//do
//{
// j = i;
// if (pSeq->Data[j] == x)
// {
// for (;j<pSeq->size;j++)
// {
// pSeq->Data[j] = pSeq->Data[j+1];
// }
// pSeq->size--;
// }
// else
// {
// i++;
// }
//} while (i<pSeq->size);
//方法二
for (i = 0;i < pSeq->size;i++)
{
if (x == pSeq->Data[i])
{
count++;
}
else
{
pSeq->Data[i-count] = pSeq->Data[i];
}
}
pSeq->size -= count; //有效size随着count的增加而减少
}
void SelectSort(pSeqList pSeq) //选择排序
{
int i = 0, j = 0;
int iMaxPos = 0;
int iMinPos = 0;
DataType temp;
for (; i < pSeq->size/2; ++i)
{
iMaxPos = i;
iMinPos = i;
for (j = 1; j < pSeq->size - i; j++)
{
if (pSeq->Data[iMaxPos] < pSeq->Data[j])
{
iMaxPos = j;
}
if (pSeq->Data[iMinPos] > pSeq->Data[j])
{
iMinPos = j;
}
}
if (iMaxPos != i)
{
temp = pSeq->Data[iMaxPos];
pSeq->Data[iMaxPos] = pSeq->Data[pSeq->size - i - 1];
pSeq->Data[pSeq->size - i - 1] = temp;
}
if (iMinPos != i)
{
temp = pSeq->Data[iMinPos];
pSeq->Data[iMinPos] = pSeq->Data[i];
pSeq->Data[i] = temp;
}
}
}
void Sort(pSeqList pSeq)
{
int tmp = 0;
int i = 0;
int j = 0;
assert(pSeq);
for (i = 0;i < pSeq->size-1;i++)//做n-1趟排序
{
for (j = 0;j < pSeq->size - i -1;j++)//每次比较的个数越来越少
{
if (pSeq->Data[j]>pSeq->Data[j+1])
{
tmp = pSeq->Data[j];
pSeq->Data[j] = pSeq->Data[j+1];
pSeq->Data[j+1] = tmp;
}
}
}
}
int BinarySearch(pSeqList pSeq,DataType x) //二分查找
{
int left = 0;
int right = 0;
int mid = 0;
assert(pSeq);
Sort(pSeq);
left = 0;
right = pSeq->size-1;
while(left <= right)
{
//mid = (left+right)>>1; //求中间值,用这两种方法写出来的代码会比较高端一些
mid = left + (right - left)/2; //如果mid=(left+right)/2的话,有些情况下会溢出
if (pSeq->Data[mid] < x)
{
left = mid + 1;
}
else if (pSeq->Data[mid] > x)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}</span></strong>
"test.c"
<strong><span style="font-size:18px;">#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void Test1()//PushBack
{
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,3);
PushBack(&seq,4);
PushBack(&seq,5);
PushBack(&seq,8);
PrintSeqList(&seq);
}
void Test2()//PopBack
{
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,3);
PushBack(&seq,4);
PushBack(&seq,5);
PrintSeqList(&seq);
PopBack(&seq);
PopBack(&seq);
PopBack(&seq);
//PopBack(&seq);
//PopBack(&seq);
//PopBack(&seq);
PrintSeqList(&seq);
}
void Test3()//PushFront
{
SeqList seq;
InitSeqList(&seq);
PushFront(&seq,1);
PushFront(&seq,2);
PushFront(&seq,3);
//PushFront(&seq,4);
//PushFront(&seq,5);
//PushFront(&seq,8);
PrintSeqList(&seq);
}
void Test4()//PopFront
{
SeqList seq;
InitSeqList(&seq);
PushFront(&seq,1);
PushFront(&seq,2);
PushFront(&seq,3);
PushFront(&seq,4);
//PushFront(&seq,5);
//PushFront(&seq,5);
PrintSeqList(&seq);
PopFront(&seq);
PopFront(&seq);
PopFront(&seq);
PopFront(&seq);
PopFront(&seq);
//PopFront(&seq);
PrintSeqList(&seq);
}
void Test5()//Insert
{
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,3);
PrintSeqList(&seq);
Insert(&seq,2,5);
PrintSeqList(&seq);
}
void Test6()//Remove
{
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,2);
PushBack(&seq,4);
PrintSeqList(&seq);
Remove(&seq,2);
PrintSeqList(&seq);
}
void Test7()//RemoveAll
{
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,3);
PushBack(&seq,2);
PushBack(&seq,4);
PrintSeqList(&seq);
RemoveAll(&seq,2);
PrintSeqList(&seq);
}
void Test8()//Sort
{
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,5);
PushBack(&seq,3);
PushBack(&seq,4);
PushBack(&seq,2);
PrintSeqList(&seq);
Sort(&seq);
PrintSeqList(&seq);
}
void Test9()//BinarySearch
{
int ret = 0;
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,5);
PushBack(&seq,3);
PushBack(&seq,4);
PushBack(&seq,2);
PrintSeqList(&seq);
ret = BinarySearch(&seq,2);
PrintSeqList(&seq);
if (ret < 0)
{
printf("sorry, no find x\n");
}
else
{
printf("%d\n",ret);
}
}
void Test10()//Find
{
int ret = 0;
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,3);
PushBack(&seq,4);
PushBack(&seq,5);
PrintSeqList(&seq);
ret = Find(&seq,4);
if (ret < 0)
{
printf("no find x\n");
return;
}
else
{
printf("find x\n");
printf("%d\n",ret);
}
}
void Test11()//Erase
{
SeqList seq;
InitSeqList(&seq);
PushBack(&seq,1);
PushBack(&seq,2);
PushBack(&seq,3);
PushBack(&seq,4);
PrintSeqList(&seq);
Erase(&seq,2);
PrintSeqList(&seq);
}
int main()
{
//Test1();
//Test2();
//Test3();
//Test4();
//Test5();
//Test6();
//Test7();
//Test8();
//Test9();
//Test10();
//Test11();
system("pause");
return 0;
}</span></strong>