对顺序表的动态开辟空间实现,并对顺序表进行操作,实现增删查改排序等一系列操作。
代码实现:
头文件SeqList.h:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> typedef int DataType; #define MAX_SIZE 3 //初始顺序表大小 #define INC_SZ 3 //每次增容大小 typedef struct SeqList { DataType *array; int size; //顺序表当前有效元素个数 int capacity; //顺序表容量大小 }SeqList,*pSeqList; void InitSeqList(pSeqList pSeq); //初始化顺序表 void CheakCapacity(pSeqList pSeq); //检查当前开辟空间 void PushBack(pSeqList pSeq,DataType data); //尾插 void PopBack(pSeqList pSeq); //尾删 void PushFront(pSeqList pSeq,DataType data); //头插 void PopFront(pSeqList pSeq); //头删 void Print(pSeqList pSeq); //打印顺序表 void Insert(pSeqList pSeq,int pos,DataType data); //在指定位置插入 void Erase(pSeqList pSeq,int pos); //在指定位置上删除 void Remove(pSeqList pSeq,DataType data); //删除指定元素 int Find(pSeqList pSeq,DataType data); //查找指定元素 void RemoveAll(pSeqList pSeq,DataType data); //删除顺序表中所有指定元素 void BubbleSort(pSeqList pSeq); //冒泡排序 void SelectSort(pSeqList pSeq); //选择排序 int BinarySerch(pSeqList pSeq,DataType data); //二分查找 int BinarySerch_p(pSeqList pSeq,int left,int right,DataType data);//递归实现二分查找 int Size(pSeqList pSeq); //查找表中有效元素个数 void Clear(pSeqList pSeq); //清空表中元素 void DestroyCapacity(pSeqList pSeq); //释放动态开辟内存 #endif __SeqList_H__
//功能实现 #include "SeqList.h" void InitSeqList(pSeqList pSeq) //初始化顺序表 { pSeq->array=(DataType *)malloc(MAX_SIZE*sizeof(DataType)); if(pSeq->array==NULL) { printf("out of memory\n"); exit(EXIT_FAILURE); } memset(pSeq->array,0,MAX_SIZE*sizeof(DataType)); pSeq->size=0; pSeq->capacity=MAX_SIZE; } void CheakCapacity(pSeqList pSeq) //检查当前开辟空间 { assert(pSeq); if(pSeq->size== pSeq->capacity) { DataType *ptr=(DataType *)realloc(pSeq->array,(pSeq->size+INC_SZ)*sizeof(DataType)); if(ptr==NULL) { printf("out of memory\n"); exit(EXIT_FAILURE); } pSeq->array=ptr; pSeq->capacity+=INC_SZ; } } void PushBack(pSeqList pSeq,DataType data) //尾插 { assert(pSeq); CheakCapacity(pSeq); pSeq->array[pSeq->size]=data; pSeq->size++; } void PopBack(pSeqList pSeq) //尾删 { assert(pSeq); if(pSeq->size<1) { printf("表为空\n"); return; } pSeq->size--; } void PushFront(pSeqList pSeq,DataType data) //头插 { int i=0; assert(pSeq); CheakCapacity(pSeq); for(i=pSeq->size-1;i>=0;i--) { pSeq->array[i+1]=pSeq->array[i]; } pSeq->array[0]=data; pSeq->size++; } void PopFront(pSeqList pSeq) //头删 { int i=0; assert(pSeq); if(pSeq->size<1) { printf("表为空\n"); return; } for(i=0;i<pSeq->size-1;i++) { pSeq->array[i]=pSeq->array[i+1]; } pSeq->size--; } void Print(pSeqList pSeq) //打印顺序表 { int i=0; assert(pSeq); for(i=0;i<pSeq->size;i++) { printf("%d ",pSeq->array[i]); } printf("\n"); } void Insert(pSeqList pSeq,int pos,DataType data) //在指定位置插入 { int i=0; assert(pSeq||(pos>=0&&pos<=pSeq->size)); CheakCapacity(pSeq); for(i=pSeq->size-1;i>=pos;i--) { pSeq->array[i+1]=pSeq->array[i]; } pSeq->array[pos]=data; pSeq->size++; } void Erase(pSeqList pSeq,int pos) //在指定位置上删除 { int i=0; assert(pSeq||(pos>=0&&pos<=pSeq->size-1)); for(i=pos;i<pSeq->size-1;i++) { pSeq->array[i]=pSeq->array[i+1]; } pSeq->size--; } void Remove(pSeqList pSeq,DataType data) //删除指定元素 { int ret=Find(pSeq,data); assert(pSeq); if(ret!=-1) { Erase(pSeq,ret); } } int Find(pSeqList pSeq,DataType data) //查找指定元素 { int i=0; assert(pSeq); for(i=0;i<pSeq->size;i++) { if(data==pSeq->array[i]) { return i; } } return -1; } void RemoveAll(pSeqList pSeq,DataType data) //删除顺序表中所有指定元素 { int icount=0; int i=0; assert(pSeq); if(pSeq->size<1) { printf("表为空\n"); return; } for(i=0;i<pSeq->size;i++) { if(data==pSeq->array[i]) { icount++; } else { pSeq->array[i-icount]=pSeq->array[i]; } } pSeq->size-=icount; } //void BubbleSort(pSeqList pSeq) //冒泡排序 //{ // int i=0; // int flag=1; // assert(pSeq); // for(i=0;i<pSeq->size-1;i++) // { // int j=0; // flag=1; // for(j=pSeq->size-1;j>0+i;j--) // { // if(pSeq->array[j]<pSeq->array[j-1]) // { // DataType tmp=pSeq->array[j-1]; // pSeq->array[j-1]=pSeq->array[j]; // pSeq->array[j]=tmp; // flag=0; // } // } // if(flag==1) // { // return; // } // } //} void BubbleSort(pSeqList pSeq) //冒泡排序2 { int i=0; int flag=1; int input=0; assert(pSeq); printf("请输入选择(1.升序***2.降序):"); scanf("%d",&input); for(i=0;i<pSeq->size-1;i++) { int j=0; flag=1; for(j=0;j<pSeq->size-1-i;j++) { if(input==1) { if(pSeq->array[j]>pSeq->array[j+1]) { DataType tmp=pSeq->array[j+1]; pSeq->array[j+1]=pSeq->array[j]; pSeq->array[j]=tmp; flag=0; } } else { if(pSeq->array[j]<pSeq->array[j+1]) { DataType tmp=pSeq->array[j+1]; pSeq->array[j+1]=pSeq->array[j]; pSeq->array[j]=tmp; flag=0; } } } if(flag==1) { return; } } } void SelectSort(pSeqList pSeq) //选择排序 { int i=0; int minpos=0; assert(pSeq); for(i=0;i<pSeq->size-1;i++) { int j=0; minpos=i; for(j=i+1;j<pSeq->size;j++) { if(pSeq->array[j]<pSeq->array[minpos]) { minpos=j; } } if(minpos!=i) { DataType tmp=pSeq->array[i]; pSeq->array[i]=pSeq->array[minpos]; pSeq->array[minpos]=tmp; } } } int BinarySerch(pSeqList pSeq,DataType data) //二分查找 { int left=0; int right=pSeq->size; assert(pSeq); while(left<right) { int mid=left+((right-left)>>1); if(pSeq->array[mid]==data) { return mid; } else if(pSeq->array[mid]>data) { right=mid; } else { left=mid+1; } } return -1; } int BinarySerch_p(pSeqList pSeq,int left,int right,DataType data)//递归实现 { int mid=left+((right-left)>>1); if(left>right) { return -1; } if(pSeq->array[mid]==data) { return mid; } else if(pSeq->array[mid]>data) { return BinarySerch_p(pSeq,left,mid-1,data); } else { return BinarySerch_p(pSeq,mid+1,right,data); } } int Size(pSeqList pSeq) //查找表中有效元素个数 { assert(pSeq); return pSeq->size; } void Clear(pSeqList pSeq) //清空表中元素 { assert(pSeq); pSeq->size=0; } void DestroyCapacity(pSeqList pSeq) //释放动态开辟内存 { if(pSeq->array!=NULL) { free(pSeq->array); pSeq->array=NULL; } }
#include "SeqList.h" void test1() { SeqList Seq; InitSeqList(&Seq); PushBack(&Seq,1); PushBack(&Seq,2); PushBack(&Seq,3); PushBack(&Seq,4); PushBack(&Seq,5); PushBack(&Seq,6); PushBack(&Seq,7); PushBack(&Seq,8); Print(&Seq); PopBack(&Seq); PopBack(&Seq); PopBack(&Seq); Print(&Seq); DestroyCapacity(&Seq); } void test2() { SeqList Seq; InitSeqList(&Seq); PushBack(&Seq,1); PushBack(&Seq,2); PushBack(&Seq,3); Print(&Seq); PushFront(&Seq,4); PushFront(&Seq,5); PushFront(&Seq,6); Print(&Seq); PopFront(&Seq); PopFront(&Seq); Print(&Seq); PopBack(&Seq); Print(&Seq); DestroyCapacity(&Seq); } void test3() { SeqList Seq; InitSeqList(&Seq); PushBack(&Seq,2); PushBack(&Seq,2); PushBack(&Seq,3); Print(&Seq); Insert(&Seq,1,1); Insert(&Seq,4,4); Print(&Seq); Erase(&Seq,1); Print(&Seq); Remove(&Seq,4); Print(&Seq); PushBack(&Seq,4); PushBack(&Seq,5); PushBack(&Seq,2); PushBack(&Seq,2); PushBack(&Seq,4); PushBack(&Seq,2); Print(&Seq); RemoveAll(&Seq,2); Print(&Seq); DestroyCapacity(&Seq); } void test4() { SeqList Seq; int ret=0; int ret1=0; int sz=0; InitSeqList(&Seq); PushBack(&Seq,6); PushBack(&Seq,1); PushBack(&Seq,5); PushBack(&Seq,7); PushBack(&Seq,3); PushBack(&Seq,4); PushBack(&Seq,8); PushBack(&Seq,2); Print(&Seq); SelectSort(&Seq); //BubbleSort(&Seq); Print(&Seq); ret=BinarySerch(&Seq,1); printf("ret=%d\n",ret); sz=Size(&Seq); ret1=BinarySerch_p(&Seq,0,sz-1,8); printf("ret1=%d\n",ret1); DestroyCapacity(&Seq); } int main() { printf("test1:\n"); test1(); printf("\ntest2:\n"); test2(); printf("\ntest3:\n"); test3(); printf("\ntest4:\n"); test4(); system("pause"); return 0; }