动态顺序表

#pragma once
#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<string.h>
typedef int DataType;
typedef struct SeqList
{
    DataType* _array;
	size_t _size;
	size_t _capacity;
}SeqList;
void IniSeqList(SeqList* pSeq)
{
   assert(pSeq);
   pSeq->_capacity =3;
   pSeq->_array =(DataType*)malloc(sizeof(DataType)*pSeq->_capacity );
   pSeq->_size =0;
}
void  PrintSeqList(SeqList* pSeq)//打印
{
    int i=0;
	assert(pSeq);
	for(;i<pSeq->_size ;i++)
	{
	    printf(" %d ",pSeq->_array [i]);
	}
	printf("\n");
}
void checkempty(SeqList* pSeq)//判断是否为空
{
	assert(pSeq);
	if(pSeq->_size ==0)
	{
	    printf("SeqList is empty\n");
		return;
	}
}
void CheckCap(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 );
		free(pSeq->_array );
		pSeq->_array =tmp;
	}
}
void PushBack(SeqList* pSeq,DataType x)//尾插
{
  assert(pSeq);  
  CheckCap(pSeq);
  pSeq->_array [pSeq->_size ++]=x;
}
void PopBack(SeqList* pSeq)//尾删
{
    assert(pSeq);
	--pSeq->_size ;
}
void PushFront(SeqList* pSeq,DataType x)//头插
{
   int i=pSeq->_size ;
   assert(pSeq);
   CheckCap(pSeq);
   for(;i>=0;i--)
   {
      pSeq->_array [i+1]=pSeq->_array [i];
   }
   pSeq->_array [0]=x;
   ++pSeq->_size ;
}
void PopFront(SeqList* pSeq)//头删
{
   int i=1;
   assert(pSeq);
   checkempty(pSeq);
   for(;i<=pSeq->_size ;i++)
   {
       pSeq->_array [i-1]=pSeq->_array [i];
   }
   pSeq->_size-- ;
}
void Insert(SeqList* pSeq,size_t pos,DataType x)//任意位置插入
{
	int i=pSeq->_size;
	assert(pSeq);
	CheckCap(pSeq);
	for(;i>=(int)pos;--i)
	{
	   pSeq->_array [i]=pSeq->_array [i-1];
	}
   pSeq->_array [pos]=x;
   pSeq->_size ++;
}
void Erase(SeqList* pSeq,size_t pos)//橡皮擦
{
	int i=pos ;
   assert(pSeq);
   checkempty(pSeq);
   for(;i<pSeq->_size ;i++)
   {
      pSeq->_array [i]=pSeq->_array [i+1];
   }
   pSeq->_size --;
}
void Remove(SeqList* pSeq,DataType x)//对应位置删除
{
  int i=0;
  int begin=0;
  assert(pSeq);
  checkempty(pSeq);
  for(;i<pSeq->_size ;i++)
  {
      if(pSeq->_array [i]==x)
	  {
		  begin=i;
		  for(;begin<pSeq->_size ;begin++)
		  {
		      pSeq->_array [begin]=pSeq->_array [begin+1];
		  }
	  }
  }
    --pSeq->_size;
}
void RemoveALL(SeqList* pSeq,DataType x)//删除所有x
{
	int count=0;
	size_t first=0;
	size_t second=0;
    assert(pSeq);
	checkempty(pSeq);
	while(second<pSeq->_size )
	{
	    if(pSeq->_array [second]==x)
		{
		   count++;
		}
		else
		{
		   pSeq->_array [first]=pSeq->_array [second];
		   first++;
		}
		second++;
	}
	pSeq->_size -=count;
}
#include"SeqList_D.h"
void Test1()
{
   SeqList s;
   IniSeqList(&s);
   PushBack(&s,1);//尾插
   PushBack(&s,2);
   PushBack(&s,3);
   PushBack(&s,4);
   PushBack(&s,5);
   PrintSeqList(&s);//打印
   PushFront(&s,2);//头插
   PrintSeqList(&s);//打印
   PopFront(&s);//头删
   PrintSeqList(&s);//打印
   
}
void Test2()
{
   SeqList s;
   IniSeqList(&s);
   PushBack(&s,1);//尾插
   PushBack(&s,2);
   PushBack(&s,3);
   PushBack(&s,4);
   PushBack(&s,6);
   PushBack(&s,2);
   PushBack(&s,2);
   PushBack(&s,5);
   PrintSeqList(&s);//打印
   //Erase(&s,2);//橡皮擦
   //PrintSeqList(&s);//打印
   //Remove(&s,2);//对应位置删除
   //PrintSeqList(&s);//打印
   RemoveALL(&s,2);//删除所有x
   PrintSeqList(&s);//打印
}
int main()
{
	Test2();
	system("pause");
    return 0;
}


你可能感兴趣的:(数据结构,动态,顺序表)