实现动态顺序表

来源:互联网 发布:弹性矩阵和刚度矩阵 编辑:程序博客网 时间:2024/05/29 16:54
头文件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;   //减去其中 出现的所有的某个数后 的长度}//查找其中的某个数,如果找到了,就返回其下标,没有找到就返回-1int 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);}//查找其中的某个数,如果找到了,就返回其下标,没有找到就返回-1void 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;}


本文出自 “追寻内心的声音” 博客,转载请与作者联系!

0 0