大概之后的数据结构博客就都使用多文件操作了。
一.顺序表功能实现以及数据定义
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
#define N 100
typedef int DataType;
typedef struct SeqList
{
DataType* array; //动态数组
size_t size;//数据量
size_t capacity;//容量
}SeqList,*PSeqList;
void InitSeqList(PSeqList pSeq)//初始化
{
pSeq->array = (DataType*)malloc(sizeof(DataType)*N);//动态申请大小为N的数组
if (NULL == pSeq->array)
exit(-1);
pSeq->capacity = N;
pSeq->size = 0;
}
void CheckCapacity(PSeqList pSeq)//检测容量
{
if (pSeq->size == pSeq->capacity)
{
DataType* tmp = (DataType*)realloc(pSeq->array, (pSeq->capacity*2) * sizeof(DataType));
if (NULL == tmp)
exit(-1);
pSeq->array = tmp;
pSeq->capacity *= 2;
}
}
void PushBack(PSeqList pSeq, DataType data)//尾插
{
CheckCapacity(pSeq);
pSeq->array[pSeq->size] = data;
pSeq->size++;
}
void PopBack(PSeqList pSeq)//尾删
{
if (pSeq->size > 0)
{
pSeq->size -= 1;
}
}
void PopFront(PSeqList pSeq)//头删
{
int i ;
for (i = 0 ; i < pSeq->size - 1; ++i)
{
pSeq->array[i] = pSeq->array[i + 1];
}
pSeq->size -= 1;
}
void PushFront(PSeqList pSeq, DataType data)//头插
{
int i ;
CheckCapacity(pSeq);
for (i = pSeq->size; i > 0; --i)
{
pSeq->array[i] = pSeq->array[i - 1];
}
pSeq->array[0] = data;
pSeq->size++;
}
void PrintSeqlist(PSeqList pSeq)//打印
{
int i ;
for (i = 0; i < pSeq->size; ++i)
{
printf("%d ", pSeq->array[i]);
}
printf("\n");
}
void Erase(PSeqList pSeq, size_t pos)
{
int i ;
for (i = pos; i < pSeq->size - 1; ++i)
{
pSeq->array[i] = pSeq->array[i + 1];
}
pSeq->size--;
}
int Find(PSeqList pSeq, DataType data)//查找值为data的元素
{
size_t i = 0;
for (; i < pSeq->size; ++i)
{
if (pSeq->array[i] == data)
return i;
}
return -1;
}
void RemoveAll(PSeqList pSeq, DataType data)//移除所有值为data的元素
{
size_t i = 0, count = 0;
for (; i < pSeq->size; ++i)
{
if (pSeq->array[i] == data)
{
++count;
}
else
{
pSeq->array[i - count] = pSeq->array[i];
}
}
pSeq->size -= count;
}
void Destroy(PSeqList pSeqList)//销毁
{
if (NULL != pSeqList)
{
free(pSeqList->array);
pSeqList->array = NULL;
pSeqList->capacity = 0;
pSeqList->size = 0;
}
}
void Insert(PSeqList pSeq, size_t pos, DataType data)//任意位置插入
{
int i ;
for (i = pSeq->size; i > pos; --i)
{
pSeq->array[i] = pSeq->array[i - 1];
}
pSeq->array[i] = data;
pSeq->size++;
}
void BubbleSort(PSeqList pSeq)//冒泡排序
{
int i, j, tmp,flag;
for (i = 0; i < pSeq->size - 1; ++i)
{
flag = 0;
for (j = pSeq->size - 1; j > i; --j)
{
if (pSeq->array[i] > pSeq->array[j])
{
tmp = pSeq->array[i];
pSeq->array[i] = pSeq->array[j];
pSeq->array[j] = tmp;
flag++;
}
}
if (flag == 0)
{
break;
}
}
}
void SelectSort(PSeqList pSeq)//选择排序
{
int min_num = 0;
int i, j, tmp;
for (i = 0; i < pSeq->size - 1; ++i)
{
min_num = i;
for (j = i + 1; j < pSeq->size; j++)
{
if (pSeq->array[j] < pSeq->array[min_num])
{
min_num = j;
}
}
if (min_num != i)
{
tmp = pSeq->array[i];
pSeq->array[i] = pSeq->array[min_num];
pSeq->array[min_num] = tmp;
}
}
}
int BinarySearch(PSeqList pSeq, DataType data)//二分搜索
{
int left = 0;
int right = pSeq->size - 1;
int mid = 0;
while (left <= right)
{
mid = left + ((right - left) >> 1);
if (pSeq->array[mid] == data)
{
return mid;
}
else if (pSeq->array[mid] > data)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return mid;
}
void InsertSearch(PSeqList pSeq)//插入排序
{
int target = 0;
size_t i, j;
for (i = 1; i < pSeq->size; ++i)
{
target = pSeq->array[i];//待插入
j = i;
while (j > 0 && pSeq->array[j - 1] > target)//后移
{
pSeq->array[j] = pSeq->array[j - 1];
j--;
}
pSeq->array[j] = target;//插入
}
}
#endif
二.测试程序
#include<stdio.h>
#include"head.h"
int main()
{
SeqList p;
InitSeqList(&p);
PushBack(&p, 1);
PushBack(&p, 2);
PushBack(&p, 3);
PushBack(&p, 4);
PrintSeqlist(&p);
PopBack(&p);
PrintSeqlist(&p);
PushFront(&p, 4);
PushFront(&p, 5);
PrintSeqlist(&p);
PopFront(&p);
PrintSeqlist(&p);
Insert(&p, 2, 6);
PrintSeqlist(&p);
Erase(&p, 2);
PrintSeqlist(&p);
BinarySearch(&p, 3);
system("pause");
return 0;
}