动态顺序表部分接口的简单实现
来源:互联网 发布:最新大智慧软件 编辑:程序博客网 时间:2024/06/07 09:21
我们的动态顺序表指的依旧是能动态开辟内存,需要用多少内存就开辟多少,从而合理的利用内存资源。
Seqlist_D.h
#ifndef __SEQLIST_D_H__#define __SEQLIST_D_H__#include <stdlib.h>#include <assert.h>#include <stdio.h>#include <assert.h>#define SZ 2 //初始化内存的大小#define INC 1 //动态开辟的大小#define MAX 100 //顺序表的长度typedef int DataType;typedef struct myseqlist { DataType *data; int sz; int capacity;}seqlist, *pseqlist;void InitSeqlist(pseqlist ps); //初始化void DestorySeqlist(pseqlist ps); //销毁void CheckSeqlist(pseqlist ps); //检查内存void PushBack(pseqlist ps, DataType d);//尾部插入元素void PrintSeqlist(const pseqlist ps);//打印void PopBack(pseqlist ps);//尾删void PushFront(pseqlist ps, DataType d); //头部插入元素void PopFrint(pseqlist ps); //头部删除元素void Insert(pseqlist ps, int pos, DataType d); //在pos前面插入目标元素int Find(pseqlist ps, DataType d); //查找目标元素并返回下标void Remove(pseqlist ps, DataType d); //删除目标元素void RemoveAll(pseqlist ps, DataType d); //删除所有元素dvoid ReverseSeqlist(pseqlist ps); //逆序void SortSeqlist(pseqlist ps); //冒泡排序int BinarySearch(pseqlist ps, DataType d); //二分查找目标元素#endif
Seqlist_D.c
#include "Seqlist_D.h"void InitSeqlist(pseqlist ps){ assert(ps); ps->data = (DataType*)malloc(sizeof(seqlist)*SZ); if (ps->data != NULL) { ps->sz = 0; ps->capacity = SZ; }}void DestorySeqlist(pseqlist ps){ assert(ps); if(ps->data != NULL) { free(ps->data); ps->data = NULL; }}void CheckSeqlist(pseqlist ps){ assert(ps); if (ps->sz == ps->capacity) { DataType *str = (DataType*)realloc(ps->data,sizeof(seqlist)*(ps->capacity+INC)); if(str != NULL) { ps->data = str; ps->capacity += INC; return; } exit(EXIT_FAILURE); } }void PushBack(pseqlist ps, DataType d){ assert(ps); CheckSeqlist(ps); //先检查内存容量,不够进行扩充 if(ps->sz != MAX) //MAX为最大容量 { ps->data[ps->sz] = d; ps->sz++; return; } exit(EXIT_FAILURE);}void PrintSeqlist(const pseqlist ps) //打印{ int i = 0; assert(ps); for(i=0; i<ps->sz; i++) { printf("%d ", ps->data[i]); } printf("\n");}void PopBack(pseqlist ps)//尾删{ assert(ps); if(ps->sz == 0) { return; } ps->sz--;}void PushFront(pseqlist ps, DataType d) //头部插入元素{ int i = 0; assert(ps); CheckSeqlist(ps); if(ps->sz != MAX) { for(i=ps->sz; i>0; i--) { ps->data[i] = ps->data[i-1]; } ps->data[0] = d; ps->sz ++; } return;}void PopFront(pseqlist ps) //头部删除元素{ assert(ps); if(ps->sz != 0) { int i = 0; for(i=0; i<ps->sz-1; i++) { ps->data[i] = ps->data[i+1]; } } ps->sz--;}void Insert(pseqlist ps, int pos, DataType d) //在pos前面插入目标元素{ int i = 0; assert(ps); CheckSeqlist(ps); if(ps->sz == MAX) { return; } for(i=ps->sz; i>pos; i--) { ps->data[i] = ps->data[i-1]; } ps->data[pos] = d; ps->sz++;}int Find(pseqlist ps, DataType d) //查找目标元素并返回下标{ int i = 0; assert(ps); for(i=0; i<ps->sz; i++) { if(ps->data[i] == d) { return i; } } return -1;}void Remove(pseqlist ps, DataType d) //删除目标元素{ int i = 0; int j = 0; assert(ps); i = Find(ps, d); if(ps->sz == 0) { return ; } if(i != -1) { for(;i<ps->sz-1;i++ ) { ps->data[i] = ps->data[i+1]; } ps->sz--; }}void RemoveAll(pseqlist ps,DataType d) //删除所有元素d { int i = 0; assert(ps); while(1) { int ret = 0; ret = Find(ps, d); if (ret != -1) { Remove(ps,d); i++; } else { return; } } ps->sz-=i;}void ReverseSeqlist(pseqlist ps) //逆序{ int left = 0; int right = ps->sz-1; assert(ps); while(left<right) { DataType n = ps->data[left]; ps->data[left] = ps->data[right]; ps->data[right] = n; left++; right--; }}void SortSeqlist(pseqlist ps) //冒泡排序{ int i = 0; int j = 0; assert(ps); for(i=0; i<ps->sz-1; i++) { for(j=0; j<ps->sz-i-1; j++) { if(ps->data[j] < ps->data[j+1]) { DataType n = ps->data[j]; ps->data[j] = ps->data[j+1]; ps->data[j+1] = n; } } } }int BinarySearch(pseqlist ps, DataType d) //二分查找目标元素{ int left = 0; int mid = 0; int right = 0; assert(ps); right = ps->sz-1; SortSeqlist(ps); //先进行冒泡排序,保证二分查找的有效性 while(left <= right) { int mid = (left - (left - right)/2); if(ps->data[mid] > d) { left = mid-1; } else if(ps->data[mid] < d) { right = mid+1; } else { return mid; } } return -1;}
test.c
#include "Seqlist_D.h"seqlist mylist;void test1(){ int tmp = 0; InitSeqlist(&mylist); PushBack(&mylist, 1); PushBack(&mylist, 2); PushBack(&mylist, 4); PushBack(&mylist, 9); PushBack(&mylist, 8); PushBack(&mylist, 3); PrintSeqlist(&mylist); SortSeqlist(&mylist); PrintSeqlist(&mylist); tmp =BinarySearch(&mylist, 8); printf("%d\n", tmp);}int main(){ test1(); return 0;}
经验证无误,哈哈又是一个练手的小项目。
阅读全文
0 0
- 动态顺序表部分接口的简单实现
- 动态顺序表部分接口实现
- 动态顺序表部分接口的简易实现
- 静态顺序表接口的简单实现
- 简单的动态顺序表实现
- c::动态顺序表的简单实现
- 动态顺序表的简单实现
- 简单实现动态顺序表
- 动态实现简单【顺序表】
- 动态顺序表一般接口功能的实现
- 简单c之实现顺序表的以下接口
- C语言:动态顺序表的简单实现
- 简单的动态顺序表实现 不足之处请留言指出
- 动态顺序栈的简单实现
- C简单实现动态顺序表
- 简单实现静态/动态顺序表
- C语言简单实现动态顺序表
- 顺序表的动态实现
- 513. Find Bottom Left Tree Value
- TSQ/CoDel队列管理以及TCP BBR如何解决Bufferbloat问题
- 学习笔记四--数据绑定
- Python Tkinter界面应用开发-01 简介
- AlphaGo获胜退休,礼物发酵
- 动态顺序表部分接口的简单实现
- android 权限大全
- 582. Kill Process
- 无穷小量
- abstract和virtual的用法和区别
- RHEL7.3安装VNC,小白轻松实现远程图形化界面访问server
- Spring采用注解使用AOP
- 梦之思想
- spring中使用配置文件实现AOP