顺序表(动态)

来源:互联网 发布:网络剧怎么备案 编辑:程序博客网 时间:2024/06/05 04:14

SeqList.h

#pragma once#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#define DEFAULT_SZ 10#define DEFAULT_INC 10typedef int DataType;typedef struct SeqList{DataType *pData;//指向数据的存储位置int sz;//有效个数int capacity;//容量}SeqList, *pSeqList;void InitSeqList(pSeqList ps);//初始化void CheckCapacity(pSeqList ps);//容量检测void DestroySeqList(pSeqList ps);//销毁void PushBack(pSeqList ps, DataType d);//尾部插入void PopBack(pSeqList ps);//尾部删除void PushFront(pSeqList ps, DataType d);//头部插入void PopFront(pSeqList ps);//头部删除void Insert(pSeqList ps, int pos, DataType d);//指定位置插入int Find(pSeqList ps, DataType d);//查找void Remove(pSeqList ps, DataType d);//删除最先出现的指定元素void SortSeqList(pSeqList ps);//冒泡排序void ReverseSeqList(pSeqList ps);//逆序void BinarySearch(pSeqList ps, DataType d);//二分查找void PrintSeqList(const pSeqList ps);//打印

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1#include "SeqList.h"void InitSeqList(pSeqList ps)//初始化{ps->pData = (DataType *)calloc(DEFAULT_SZ, sizeof(DataType));ps->sz = 0;ps->capacity = DEFAULT_SZ;}void CheckCapacity(pSeqList ps)//容量检测{if(ps->sz == ps->capacity){DataType *tmp = realloc(ps->pData, sizeof(DataType)+DEFAULT_INC);if(tmp != NULL){ps->pData = tmp;ps->capacity += DEFAULT_INC;printf("增容成功\n");}else{printf("%s\n", strerror(errno));}}}void DestroySeqList(pSeqList ps)//销毁{free(ps->pData);ps->pData = NULL;}void PushBack(pSeqList ps, DataType d)//尾部插入{CheckCapacity(ps);ps->pData[ps->sz] = d;ps->sz++;}void PopBack(pSeqList ps)//尾部删除{if(ps->sz == 0){printf("顺序表为空,无法删除\n");return;}ps->sz--;}void PushFront(pSeqList ps, DataType d)//头部插入{int i = 0;CheckCapacity(ps);for(i=ps->sz; i>0; i--){ps->pData[i] = ps->pData[i-1];}ps->pData[0] = d;ps->sz++;}void PopFront(pSeqList ps)//头部删除{int i = 0;for(i=0; i<ps->sz-1; i++){ps->pData[i] = ps->pData[i+1];}ps->sz--;}void Insert(pSeqList ps, int pos, DataType d)//指定位置插入{int i = 0;CheckCapacity(ps);for(i=ps->sz; i>pos; i--){ps->pData[i] = ps->pData[i-1];}ps->pData[pos] = d;ps->sz++;}int Find(pSeqList ps, DataType d)//查找{int i = 0;for(i=0; i<ps->sz; i++){if(ps->pData[i] == d){printf("pData[%d] = %d\n", i, d);return i;}}return -1;}void Remove(pSeqList ps, DataType d)//删除最先出现的指定元素{int ret = Find(ps, d);if(ret != -1){int i = 0;for(i=ret; i<ps->sz-1; i++){ps->pData[i] = ps->pData[i+1];}ps->sz--;}else{printf("无此元素\n");}}void SortSeqList(pSeqList ps)//冒泡排序{int i = 0;for(i=0; i<ps->sz; i++){int j = 0;DataType tmp = 0;for(j=0; j<ps->sz-i-1; j++){if(ps->pData[j] > ps->pData[j+1]){tmp = ps->pData[j];ps->pData[j] = ps->pData[j+1];ps->pData[j+1] = tmp;}}}}void ReverseSeqList(pSeqList ps)//逆序{int left = 0;int right = ps->sz-1;DataType tmp = 0;while(left<right){tmp = ps->pData[left];ps->pData[left] = ps->pData[right];ps->pData[right] = tmp;left++;right--;}}void BinarySearch(pSeqList ps, DataType d)//二分查找{int left = 0;int right = ps->sz-1;while(left <= right){int mid = left + (right-left)/2;if(d > ps->pData[mid]){left = mid + 1;}else if(d < ps->pData[mid]){right = mid -1;}else{printf("pData[%d] = %d\n", mid, d);return;}}if(left > right){printf("没找到\n");}}void PrintSeqList(const pSeqList ps)//打印{int i = 0;assert(ps);for(i=0; i<ps->sz; i++){printf("%d ", ps->pData[i]);}printf("\n");}

test.c

#include "SeqList.h"void test(){SeqList seqlist;InitSeqList(&seqlist);PushBack(&seqlist, 1);PushBack(&seqlist, 2);PushBack(&seqlist, 3);PopBack(&seqlist);PrintSeqList(&seqlist);PushFront(&seqlist, 0);PushFront(&seqlist, -1);PushFront(&seqlist, -2);PopFront(&seqlist);PrintSeqList(&seqlist);Insert(&seqlist, 2, 10);PrintSeqList(&seqlist);Find(&seqlist, 2);Remove(&seqlist, 10);PrintSeqList(&seqlist);ReverseSeqList(&seqlist);PrintSeqList(&seqlist);SortSeqList(&seqlist);PrintSeqList(&seqlist);BinarySearch(&seqlist, 2);PrintSeqList(&seqlist);DestroySeqList(&seqlist);//销毁}int main(){test();//测试代码return 0;}

原创粉丝点击