头文件Seqlist.h中:
#pragma once
#include <assert.h>
#include <malloc.h>
typedef int DataType;
typedef struct SeqList
{
DataType * _array; //数据块指针
size_t _size; //当前的有效数据个数
size_t _capacity; //容量
}Seqlist;
//打印顺序表
void PrintSeqlist(Seqlist * pSeq)
{
int i=0;
assert(pSeq);
for(;i<pSeq->_size;i++)
{
printf( "%d ",pSeq->_array[i]);
}
printf("\n");
}
//增大容量
void CheckCapacity(Seqlist * pSeq)
{
if(pSeq->_size>=pSeq->_capacity)
{
DataType * tmp;
pSeq->_capacity*=2; //将空间扩大两倍
tmp=(DataType *)malloc( sizeof(DataType)*(pSeq->_capacity)); //先暂时开辟一块扩大后的空间
memcpy(tmp,pSeq->_array, sizeof(DataType)*(pSeq->_size)); //把原来的数据拷到tmp中
free(pSeq->_array); //释放之前的空间
pSeq->_array=tmp;
}
}
//初始化
void InitSeqlist(Seqlist * pSeq)
{
assert(pSeq);
pSeq->_capacity=3; //先给3个大的容量
pSeq->_array=(DataType *)malloc( sizeof(DataType)*(pSeq->_capacity)); //给其进行动态开辟空间
pSeq->_size=0; //刚开始没有有效的数据
}
//尾插入
void PushBack(Seqlist * pSeq,DataType x)
{
assert(pSeq);
CheckCapacity(pSeq);
pSeq->_array[pSeq->_size]=x;
pSeq->_size++;
}
//尾删除
void PopBack(Seqlist * pSeq)
{
assert(pSeq);
if(pSeq->_size==0)
{
printf("顺序表已空,无法再进行删除\n" );
return;
}
pSeq->_size--;
}
//头插入
void PushFront(Seqlist * pSeq,DataType x)
{
int i=( int)pSeq->_size;
assert(pSeq);
CheckCapacity(pSeq);
for(;i>0;i--)
{
pSeq->_array[i]=pSeq->_array[i-1];
}
pSeq->_array[0]=x;
pSeq->_size++;
}
//头删除
void PopFront(Seqlist * pSeq)
{
int i=1;
assert(pSeq);
if(pSeq->_size==0)
{
printf( "顺序表已空,无法再进行删除\n" );
return;
}
for(;i<( int)pSeq->_size;i++)
{
pSeq->_array[i-1]=pSeq->_array[i];
}
pSeq->_size--;
}
//中间任意位置插入
void Insert(Seqlist * pSeq,size_t pos,DataType x)
{
int i=( int)pSeq->_size-1;
assert(pSeq);
assert(pos<=pSeq->_size); //确保是在中间位置插入
CheckCapacity(pSeq);
for(;i>=( int)pos;i--) //注意此处 int i(有符号数)与size_t pos(无符号数)之间的关系
{
pSeq->_array[i+1]=pSeq->_array[i];
}
pSeq->_array[pos]=x;
pSeq->_size++;
}
//删除某个位置上的数
void Erase(Seqlist * pSeq,size_t pos)
{
int i=(int )pos+1;
assert(pSeq);
assert(pos<=pSeq->_size);
if(pSeq->_size==0)
{
printf( "顺序表已空,无法再进行删除\n" );
return;
}
for(;i<( int)pSeq->_size;i++)
{
pSeq->_array[i-1]=pSeq->_array[i];
}
pSeq->_size--;
}
//删除其中第一次出现的某个数
void Remove(Seqlist * pSeq, DataType x)
{
int i=0;
assert(pSeq);
for(;i<pSeq->_size;i++) //从 i=0 这个位置开始找
{
if(pSeq->_array[i]==x)
{
int begin=i;
for(;begin<(int )pSeq->_size-1;begin++)
{
pSeq->_array[begin]=pSeq->_array[begin+1];
}
pSeq->_size--;
return;
}
}
}
//删除其中出现的所有的 某个数
void RemoveAll(Seqlist *pSeq, DataType x)
{
int count=0;
size_t firstIndex = 0,secondIndex = 0;
assert(pSeq);
while(secondIndex<pSeq->_size)
{
if(pSeq->_array[secondIndex]==x)
{
count++; //找到后,对它进行计数,secondIndex后移一位
}
else //没找到,则将pSeq->_arry[secondIndex]的值赋给pSeq->_array[firstIndex],同时firstIndex后移一位,secondIndex后移一位
{
pSeq->_array[firstIndex]=pSeq->_array[secondIndex];
firstIndex++;
}
secondIndex++;
}
pSeq->_size-=count; //减去其中 出现的所有的某个数后 的长度
}
//查找其中的某个数,如果找到了,就返回其下标,没有找到就返回-1
int Find(Seqlist * pSeq, DataType x)
{
int i=0;
assert(pSeq);
for(;i<pSeq->_size;i++)
{
if(pSeq->_array[i]==x)
return i;
}
if(i>=pSeq->_size)
{
printf( "没有找到这个数\n" );
return -1;
}
}
//修改某个下标的数
void Modify(Seqlist * pSeq,size_t pos,DataType x)
{
int i=0;
assert(pSeq);
assert(pos<=pSeq->_size);
for(;i<pSeq->_size;i++)
{
if(i==pos)
{
pSeq->_array[i]=x;
}
}
}
源文件(.c文件)中:
#include <stdio.h>
#include "Seqlist.h"
//尾插入测试
void test1()
{
Seqlist s;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,3);
PushBack(&s,4);
PushBack(&s,5);
PrintSeqlist(&s);
}
//尾删除测试
void test2()
{
Seqlist s;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,3);
PushBack(&s,4);
PushBack(&s,5);
PrintSeqlist(&s);
PopBack(&s); //尾删除一个
PopBack(&s); //再尾删除一个
PrintSeqlist(&s);
}
//头插入测试
void test3()
{
Seqlist s;
InitSeqlist(&s);
PushFront(&s,1);
PushFront(&s,2);
PushFront(&s,3);
PrintSeqlist(&s);
}
//头删除测试
void test4()
{
Seqlist s;
InitSeqlist(&s);
PushFront(&s,1);
PushFront(&s,2);
PushFront(&s,3);
PushFront(&s,4);
PrintSeqlist(&s);
PopFront(&s); //头删除一次
//PopFront(&s); //再头删除一次
PrintSeqlist(&s);
}
//中间任意位置插入测试
void test5()
{
Seqlist s;
InitSeqlist(&s);
PushFront(&s,1);
PushFront(&s,2);
PushFront(&s,3);
PushFront(&s,4);
PrintSeqlist(&s); // 4 3 2 1
Insert(&s,2,5);
Insert(&s,2,6);
Insert(&s,2,7);
PrintSeqlist(&s); // 4 3 7 6 5 2 1
}
//删除某个位置上的数
void test6()
{
Seqlist s;
InitSeqlist(&s);
PushFront(&s,1);
PushFront(&s,2);
PushFront(&s,3);
PushFront(&s,4);
PrintSeqlist(&s); // 4 3 2 1
Erase(&s,2); //删除下标为2的这个数
Erase(&s,1); //删除下标为1的这个数
PrintSeqlist(&s);
}
//删除其中第一次出现的某个数测试
void test7()
{
Seqlist s;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,3);
PushBack(&s,2);
PushBack(&s,2);
PushBack(&s,4);
PrintSeqlist(&s);
Remove(&s,2);
PrintSeqlist(&s);
}
//删除其中出现的所有的 某个数测试
void test8()
{
Seqlist s;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,3);
PushBack(&s,2);
PushBack(&s,2);
PushBack(&s,4);
PrintSeqlist(&s);
RemoveAll(&s,2);
PrintSeqlist(&s);
}
//查找其中的某个数,如果找到了,就返回其下标,没有找到就返回-1
void test9()
{
int ret=0;
Seqlist s;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,3);
PushBack(&s,2);
PushBack(&s,2);
PushBack(&s,4);
PrintSeqlist(&s); // 1 2 3 2 2 4
ret=Find(&s,2);
printf("%d\n",ret);
}
//修改某个下标的数
void test10()
{
Seqlist s;
InitSeqlist(&s);
PushBack(&s,1);
PushBack(&s,2);
PushBack(&s,3);
PushBack(&s,2);
PushBack(&s,2);
PushBack(&s,4);
PrintSeqlist(&s); // 1 2 3 2 2 4
Modify(&s,3,5); //把下标为3的数(2)改成5
PrintSeqlist(&s); // 1 2 3 5 2 4
}
int main()
{
//test1();
//test2();
//test3();
//test4();
//test5();
//test6();
//test7();
//test8();
//test9();
test10();
system( "pause");
return 0;
}
本文出自 “追寻内心的声音” 博客,转载请与作者联系!