SeqList.h
#ifndef __SEQLIST_H__
#define __SEQLIST_H__
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<memory.h>
typedef int DataType; //顺序表的元素类型
#define N 100 //顺序表的数组大小
typedef struct SeqList
{
DataType data[N];
size_t _size;
}SeqList;
void SeqListInit(SeqList* pSeq);//初始化
void SeqListPrint(SeqList* pSeq);//打印顺序表
void SeqListPushBack(SeqList* pSeq, DataType x);//尾插
void SeqListPopBack(SeqList* pSeq);//尾删
void SeqListPushFront(SeqList* pSeq, DataType x);//头插
void SeqListPopFront(SeqList* pSeq);//头删
void SeqListInsert(SeqList* pSeq, size_t pos, DataType x);//任意pos位置的插入
void SeqListErase(SeqList* pSeq, size_t pos);//任意位置的删除
int SeqListFind(SeqList* pSeq, DataType x);//查找
void SeqListModify(SeqList* pSeq, size_t pos, DataType x);//修改pos位置的元素
void SeqListRemove(SeqList* pSeq, DataType x);//删除x FIND+ERASE
void SeqListRemoveAll(SeqList* pSeq, DataType x);//将所有的x删掉
void Swap(DataType* left, DataType* right);//交换
void SeqListBubbleSort(SeqList* pSeq);//冒泡排序
int SeqListBinarySearch(SeqList* pSeq, DataType x);//二分查找
#endif //__SEQLIST_H__
SeqList.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
//初始化
void SeqListInit(SeqList* pSeq)
{
assert(pSeq);
memset(pSeq->data, 0, sizeof(DataType)*N);
pSeq->_size = 0;
}
//打印顺序表
void SeqListPrint(SeqList* pSeq)
{
int i = 0;
for (; i < pSeq->_size; i++)
{
printf("%d", pSeq->data[i]);
}
printf("\n");
}
//尾插
void SeqListPushBack(SeqList* pSeq, DataType x)
{
assert(pSeq);
if (pSeq->_size >= N)
{
printf("SeqList is full\n");
return;
}
else
{
pSeq->data[pSeq->_size] = x;
pSeq->_size++;
}
}
//尾删
void SeqListPopBack(SeqList* pSeq)
{
assert(pSeq);
if (pSeq->_size == 0)
{
printf("SeqList is empty\n");
return;
}
else
{
pSeq->_size--;
}
}
//头插
void SeqListPushFront(SeqList* pSeq, DataType x)
{
assert(pSeq);
if (pSeq->_size >= N)
{
printf("SeqList is full\n");
return;
}
else
{
int end = pSeq->_size - 1;
while (end >= 0)
{
pSeq->data[end + 1] = pSeq->data[end];
end--;
}
//int i = 0;
//for (i = pSeq->_size; i > 0; i--)
//{
// pSeq->data[i] = pSeq->data[i - 1];
//}
pSeq->data[0] = x;
pSeq->_size++;
}
}
//头删
void SeqListPopFront(SeqList* pSeq)
{
assert(pSeq);
if (pSeq->_size == 0)
{
printf("SeqList is empty\n");
return;
}
else
{
int i = 0;
for (; i < pSeq->_size; i++)
{
pSeq->data[i] = pSeq->data[i + 1];
}
pSeq->_size--;
}
}
//在pos位置插入元素x
void SeqListInsert(SeqList* pSeq, size_t pos, DataType x)
{
assert(pSeq);
if (pSeq->_size >= N)
{
printf("SeqList is full\n");
return;
}
else
{
int end = pSeq->_size - 1;
for (; end >= pos; end--)
{
pSeq->data[end + 1] = pSeq->data[end];
}
pSeq->data[pos] = x;
pSeq->_size++;
}
}
//删除pos位置的元素
void SeqListErase(SeqList* pSeq, size_t pos)
{
assert(pSeq && pos < pSeq->_size);
if (pSeq->_size == 0)
{
printf("SeqList is empty\n");
return;
}
else
{
int i = pos;
while (i < pSeq->_size)
{
pSeq->data[i] = pSeq->data[i + 1];
i++;
}
pSeq->_size--;
}
}
//查找元素x
int SeqListFind(SeqList* pSeq, DataType x)
{
assert(pSeq);
int i = 0;
for (; i < pSeq->_size; i++)
{
if (pSeq->data[i] == x)
{
return i;
}
}
return - 1;
}
//将pos位置的元素改为元素x
void SeqListModify(SeqList* pSeq, size_t pos, DataType x)
{
assert(pSeq && pos < pSeq->_size);
pSeq->data[pos] = x;
}
//删除第一次出现的x
void SeqListRemove(SeqList* pSeq, DataType x)
{
assert(pSeq);
int ret = 0;
if (pSeq->_size == 0)
{
printf("SeqList is empty\n");
return;
}
else
{
ret = SeqListFind(pSeq, x);
SeqListErase(pSeq, ret);
}
}
//删除所有的x
void SeqListRemoveAll(SeqList* pSeq, DataType x)
{
assert(pSeq);
//int ret = 0;
//while ((ret = SeqListFind(pSeq, x)) != -1)
//{
// SeqListRemove(pSeq, x);
//}
int index = 0;
int count = 0;
int i = 0;
for (; i < pSeq->_size; i++)
{
if (pSeq->data[i] != x)
{
pSeq->data[index] = pSeq->data[i];
index++;
}
else
{
count++;
}
}
pSeq->_size -= count;
}
//交换
void Swap(DataType* left, DataType* right)
{
DataType tmp = *left;
*left = *right;
*right = tmp;
}
//冒泡排序
void SeqListBubbleSort(SeqList* pSeq)
{
assert(pSeq);
int i = 0;
int j = 0;
int flags = 0;
for (; i < pSeq->_size; i++)
{
int flags = 1;
for (; j < pSeq->_size - i - 1; j++)
{
if (pSeq->data[j]>pSeq->data[j + 1])
{
Swap(&pSeq->data[j], &pSeq->data[j + 1]);
flags = 0;
}
}
if (flags)
{
break;
}
}
}
//二分查找
int SeqListBinarySearch(SeqList* pSeq, DataType x)
{
assert(pSeq);
int left = 0;
int right = pSeq->_size - 1;
int mid = left + (right - left) >> 1;
while (left < right)
{
if (pSeq->data[mid] < x)
{
left = mid + 1;
}
else if (pSeq->data[mid]>x)
{
right = mid - 1;
}
else
{
return mid;
}
}
return -1;
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
void test1()
{
SeqList s;
SeqListInit(&s);
SeqListPushBack(&s, 1);
SeqListPushBack(&s, 2);
SeqListPushBack(&s, 3);
SeqListPushBack(&s, 4);
SeqListPushBack(&s, 5);
//SeqListPushBack(&s, 2);
SeqListPrint(&s);
//SeqListPopBack(&s);
//SeqListModify(&s, 3, 6);
//SeqListRemove(&s, 2);
//SeqListRemoveAll(&s, 2);
//SeqListBubbleSort(&s);
int ret = 0;
ret = SeqListBinarySearch(&s, 3);
printf("%d\n", ret);
//SeqListPrint(&s);
}
void test2()
{
SeqList s;
int ret = 0;
SeqListInit(&s);
SeqListPushFront(&s, 1);
SeqListPushFront(&s, 2);
SeqListPushFront(&s, 3);
SeqListPushFront(&s, 4);
SeqListPushFront(&s, 5);
SeqListPrint(&s);
SeqListPopFront(&s);
//SeqListInsert(&s, 3, 6);
SeqListPrint(&s);
//SeqListErase(&s, 3);
//SeqListPrint(&s);
//ret = SeqListFind(&s, 2);
//printf("%d\n", ret);
}
int main()
{
test1();
system("pause");
}