实现一个顺序表的增删查找、排序(冒泡、快速排序)功能
编程思想:
TDD,模块化实现
- 顺序表的声明(SeqList.h)
#pragma once //防止头文件的多次引用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define N 10
typedef int DataType;
typedef struct SeqList
{
DataType arr[N];
size_t size;
}SeqList,* pSeqList;
void Test();
void SeqListInit(pSeqList s);//初始化
void SeqListPushFront(pSeqList s, DataType x);//头插
void SeqListPushBack(pSeqList s, DataType x);//尾插
void SeqListPopFront(pSeqList s);//头删
void SeqListPopBack(pSeqList s);//尾删
void SeqListInsert(pSeqList s,size_t pos, DataType x);//任意位置插
void SeqListEarse(pSeqList s,size_t pos);//任意位置删
int SeqListFind(pSeqList s, DataType x);//查找
void SeqListModify(pSeqList s, size_t pos,DataType x);//修改
int SeqListEmpty(pSeqList s);// 判断是否为空,1 表示空, 0 表示不空
int SeqListSize(pSeqList s);// 返回数量
void SeqListClear(pSeqList s);// 清空
void SeqListRemove(pSeqList s, DataType x);//删除第一个x
void SeqListRemoveAll(pSeqList s, DataType x);//删除所有x
void SeqListBubbleSort(pSeqList s);//冒泡排序
void SeqListSelectSort(pSeqList s);//选择排序
int SeqListBinarary(pSeqList s, DataType x);//二分查找
void SeqLisPrint(pSeqList s);// 打印
- 顺序表的功能实现(SeqList.c)
#include "SeqList.h"
void SeqListInit(pSeqList s)//初始化
{
assert(s);
memset(s->arr, 0, sizeof(DataType)*N);
s->size = 0;
}
void SeqListPushFront(pSeqList s, DataType x)//头插
{
assert(s->size<N);
SeqListInsert(s, 0, x);//任意插的特殊情况
}
void SeqListPushBack(pSeqList s, DataType x)//尾插
{
SeqListInsert(s, s->size, x);//任意插的特殊情况
}
void SeqListPopFront(pSeqList s)//头删
{
assert(s);
if (s->size == 0)
{
printf("顺序表为空\n");
return;
}
else
{
size_t end = 0;
while (end < s->size - 1)
{
s->arr[end] = s->arr[end + 1];
end++;
}
s->size--;
}
}
void SeqListPopBack(pSeqList s)//尾删
{
assert(s);
if (s->size == 0)
{
printf("顺序表为空\n");
return;
}
else
s->size--;
}
void SeqListInsert(pSeqList s, size_t pos, DataType x)//任意位置插
{
assert(s);
assert(0 <= pos && pos <= s->size);
if (s->size >= N)
{
printf("顺序表已满\n");
return;
}
else
{
DataType end = s->size;
while (end >(DataType)pos)
{
s->arr[end] = s->arr[end - 1];
end--;
}
s->arr[pos] = x;
s->size++;
}
}
void SeqListEarse(pSeqList s, size_t pos)//任意位置删
{
assert(s);
size_t end = pos;
if (s->size == 0)
{
printf("顺序表为空\n");
return;
}
while (end < s->size-1)
{
s->arr[end] = s->arr[end + 1];
end++;
}
s->size--;
}
int SeqListFind(pSeqList s,DataType x)//查找
{
assert(s);
size_t i = 0;
for (i = 0; i < s->size; i++)
{
if (s->arr[i] == x)
return i;
}
return -1;
}
int SeqListEmpty(pSeqList s)// 判断是否为空,1 表示空, 0 表示不空
{
return s->size ? 1 : 0;
}
void SeqListModify(pSeqList s, size_t pos,DataType x)//修改
{
assert(s);
s->arr[pos] = x;
}
int SeqListSize(pSeqList s)// 返回数量
{
return s->size;
}
void SeqListClear(pSeqList s)// 清空
{
SeqListInit(s);
}
void SeqListRemove(pSeqList s, DataType x)//删除第一个x
{
size_t pos = SeqListFind(s, x);
SeqListEarse(s, pos);
}
void SeqListRemoveAll(pSeqList s, DataType x)//删除所有x
{
size_t index = 0, dest = 0;
size_t count = 0;
assert(s);
while (index < s->size)
{
if (s->arr[index] != x)
{
s->arr[dest] = s->arr[index];
dest++;
}
else
count++;
index++;
}
s->size -= count;
}
void Swap(DataType *left, DataType *right)
{
DataType tmp = *left;
*left = *right;
*right = tmp;
}
void SeqListBubbleSort(pSeqList s)//冒泡排序
{
DataType end = (DataType)s->size - 1;
assert(s);
while (end >= 0)
{
size_t exchange = 0;
DataType i = 0;
for (; i < end; i++)
{
if (s->arr[i]>s->arr[i + 1])
Swap(&s->arr[i] , &s->arr[i + 1]);
exchange = 1;
}
if (exchange = 0)
break;
end--;
}
}
void SeqListSelectSort(pSeqList s)//选择排序
{
DataType left = 0;
DataType right = s->size - 1;
assert(s);
while (left < right)
{
DataType min = left, max = right, i = left;
while (i <= right)
{
if (s->arr[min] > s->arr[i])
min = i;
if (s->arr[max] < s->arr[i])
max = i;
i++;
}
Swap(&s->arr[left], &s->arr[min]);
if (max == left)
max = min;
Swap(&s->arr[right], &s->arr[max]);
left++;
right--;
}
}
int SeqListBinarary(pSeqList s,DataType x)//二分查找
{
DataType left = 0;
DataType right = s->size - 1;
assert(s);
SeqListBubbleSort(s);
while (left <= right)
{
DataType mid = left + (right - left) / 2;
if (s->arr[mid] < x)
left++;
else if (s->arr[mid] > x)
right--;
else
return mid;
}
return -1;
}
void SeqListPrint(pSeqList s)// 打印
{
size_t i = 0;
for (i = 0; i < s->size; i++)
{
printf("%d ", s->arr[i]);
}
printf("\n");
}
- 测试代码
void Test()//调用
{
SeqListInit(&s);//初始化
SeqListPushFront(&s, 1);//头插
SeqListPushFront(&s, 2);//头插
SeqListPushFront(&s, 1);//头插
SeqListPushFront(&s, 4);//头插
SeqListPrint(&s);// 打印
SeqListPushBack(&s, 1);//尾插
SeqListPushBack(&s, 5);//尾插
SeqListPushBack(&s, 3);//尾插
SeqListPushBack(&s, 1);//尾插
SeqListPrint(&s);// 打印
SeqListPopFront(&s);//头删
SeqListPrint(&s);// 打印
SeqListPopBack(&s);//尾删
SeqListPrint(&s);// 打印
SeqListInsert(&s, 2, 9);//任意位置插
SeqListPrint(&s);// 打印
SeqListEarse(&s, 3);//任意位置删
SeqListPrint(&s);// 打印
SeqListModify(&s, 2, 3);//修改
SeqListPrint(&s);// 打印
int num = SeqListFind(&s, 3);//查找
if (num != -1)
printf("找到了,下标%d\n", num);
else
printf("该数不存在\n");
int n = SeqListEmpty(&s);// 判断是否为空,1 表示空, 0 表示不空
if (n == 1)
printf("为空\n");
else
printf("不为空\n");
int count = SeqListSize(&s);// 返回数量
printf("顺序表个数为%d\n", count);
SeqListRemove(&s, 3);//删除第一个x
SeqListPrint(&s);// 打印
SeqListRemoveAll(&s, 1);//删除所有x
SeqListPrint(&s);// 打印
SeqListClear(&s);// 清空
SeqListPrint(&s);// 打印
SeqListPushFront(&s, 1);//头插
SeqListPushFront(&s, 4);//头插
SeqListPushFront(&s, 9);//头插
SeqListPushFront(&s, 6);//头插
SeqListPrint(&s);// 打印
SeqListBubbleSort(&s);//冒泡排序
SeqListPrint(&s);// 打印
SeqListPushFront(&s, 2);//头插
SeqListPushFront(&s, 0);//头插
SeqListPushFront(&s, 7);//头插
SeqListPushFront(&s, 5);//头插
SeqListPrint(&s);// 打印
SeqListSelectSort(&s);//快速排序
SeqListPrint(&s);// 打印
int ret = SeqListBinarary(&s, 0);//二分查找
if (ret != -1)
printf("找到了,下标为%d\n", ret);
else
printf("没找到\n");
}
- 顺序表的主函数(mian.c)
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
int main()
{
Test();
system("pause");
return 0;
}