动态顺序表的实现
来源:互联网 发布:.net域名续费价格 编辑:程序博客网 时间:2024/05/17 00:52
对顺序表的动态开辟空间实现,并对顺序表进行操作,实现增删查改排序等一系列操作。
代码实现:
头文件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;}
0 0
- 顺序表的动态实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态顺序表的实现
- 动态实现顺序表
- 实现动态顺序表
- 动态顺序 线性表 的实现源码
- 线性表的动态顺序存储实现
- 数据结构—动态顺序表的实现
- 动态顺序表的功能实现
- 简单的动态顺序表实现
- 线性表的动态顺序存储实现
- c::动态顺序表的简单实现
- 顺序表的静态和动态实现
- //网络Okhttp
- LeetCode 83. Remove Duplicates from Sorted List
- Spark错误异常-stdout日志乱码
- 第十六周项目2-大数据集上排序算法性能的体验
- python - urllib2简介
- 动态顺序表的实现
- http://blog.csdn.net/jeffasd/article/details/51183686
- 那些Python方法---zip()
- Linux初学者必学指令
- 游戏与算法的必经之路!
- LeetCode 82. Remove Duplicates from Sorted List II
- 小芳的妈妈每天给她2.5元钱
- js有关return的用法
- lua 计算utf8格式的字符串的长度