顺序表(动态)
2017-06-05 18:40
141 查看
用动态开辟内存的方式写一个列表
SeqList.h
#ifndef _SEQLIST_H__ #define _SEQLIST_H__ #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <assert.h> #include <errno.h> #include <stdlib.h> #define TYPES "%d" #define INIT_SZ 2//初始化的容量 #define ADD_SZ 2//每次扩容增加的容量 typedef int DataType;//为实现各种类型的列表,命名int为DataType typedef struct Seqlist { DataType *List; int sz;//有效大小 int capacity;//容量 }Seqlist, *pSeqlist; void InitSeqlist(pSeqlist p);//初始化 void PushBack(pSeqlist p, DataType d);//尾插 void PrintSeqlist(pSeqlist p);//打印 void PopBack(pSeqlist p);//尾删 void PushFront(pSeqlist p,DataType d);//头插 void PopFront(pSeqlist p);//头删 void Insert(pSeqlist p, int pos,DataType d);//指定位置插入 int Find(pSeqlist p, DataType d);//遍历查找 void Remove(pSeqlist p, DataType d);//删除 void ReverseSeqlist(pSeqlist p);//逆序 void SortSeqlist(pSeqlist p);//冒泡排序 int BinarySearch(pSeqlist p, DataType d);//二分查找,返回ret为元素所在列表位置下标 void Expansion(pSeqlist p);//扩容 #endif //_SEQLIST_H__
SeqList.c
#include "SeqList.h" void InitSeqlist(pSeqlist p)//初始化 { assert(p); p->List = malloc(INIT_SZ*sizeof(Seqlist)); if (p->List==NULL) { perror("Failed to open up\n"); return ; } //memset(p, 0, sizeof(Seqlist)); p->sz=0; p->capacity=INIT_SZ; } void Expansion(pSeqlist p)//扩容 { DataType *tmp = realloc(p->List, (p->capacity+ADD_SZ)*sizeof(Seqlist)); assert(p); if(tmp==NULL) { perror("Failed to add\n"); return ; } p->List=tmp; p->capacity+=ADD_SZ; } void PushBack(pSeqlist p, DataType d)//尾插 { assert(p); if(p->sz==p->capacity) { Expansion(p); printf("扩容成功\n"); } p->List[p->sz]=d; p->sz++; } void PrintSeqlist(pSeqlist p)//打印 { int i=0; assert(p); if(p->sz==0) { printf("列表为空\n"); return ; } for (i=0; i<p->sz; i++) { printf(TYPES,p->List[i]); } printf("\n"); } void PopBack(pSeqlist p)//尾删 { assert(p); //p->List[p->sz-1]=0; p->sz--; } void PushFront(pSeqlist p,DataType d)//头插 { int i=0; assert(p); if(p->sz==p->capacity) { Expansion(p); printf("扩容成功\n"); } for (i=p->sz; i>0; i--) { p->List[i]=p->List[i-1]; } p->List[0]=d; p->sz++; } void PopFront(pSeqlist p)//头删 { int i=0; assert(p); for(i=0; i<p->sz-1; i++) { p->List[i]=p->List[i+1]; } p->sz--; } void Insert(pSeqlist p, int pos,DataType d)//指定位置插入 { int i = 0; assert(p); if(p->sz==p->capacity) { Expansion(p); printf("扩容成功\n"); } for (i=p->sz; i>pos; i--) { p->List[i]=p->List[i-1]; } p->List[pos]=d; p->sz++; } int Find(pSeqlist p, DataType d)//遍历查找 { int i = 0; assert(p); for (i=0; i<p->sz; i++) { if(p->List[i]==d) { return i; } } if(i==p->sz) { printf("没找着\n"); } return -1; } void Remove(pSeqlist p, DataType d)//删除 { int ret=Find(p, d); assert(p); if(ret==-1) { printf("没有此元素\n"); } else { int i = 0; for(i=ret; i<p->sz-1; i++) { p->List[i]=p->List[i+1]; } p->sz--; } } void ReverseSeqlist(pSeqlist p)//逆序 { int left=0; int right=p->sz-1; assert(p); while (left<right) { DataType tmp = p->List[left]; p->List[left] = p->List[right]; p->List[right] = tmp; left++; right--; } } void SortSeqlist(pSeqlist p)//冒泡排序 { int i=0; assert(p); for (i=0; i<p->sz-1; i++) { int j=0; for (j=0; j<p->sz-i-1; j++) { if(p->List[j]>p->List[j+1]) { DataType tmp = p->List[j]; p->List[j] = p->List[j+1]; p->List[j+1] = tmp; } } } } int BinarySearch(pSeqlist p, DataType d)//二分查找,默认顺序从小到大 { int left=0; int right=p->sz-1; assert(p); while (left<=right) { int mid = left+(right-left)/2; if(p->List[mid]>d) { right=mid; } else if(p->List[mid]<d) { left=mid; } else { return mid; } } return -1; }
test.c
#include "SeqList.h" void test1() { Seqlist seqlist; int ret = 0; InitSeqlist(&seqlist);//初始化 bd35 PushBack(&seqlist, 1);//尾插 PushBack(&seqlist, 2); PushBack(&seqlist, 3); PushBack(&seqlist, 4); printf("尾插1、2、3、4:"); PrintSeqlist(&seqlist);//打印 PopBack(&seqlist);//尾删 PopBack(&seqlist); printf("尾删:"); PrintSeqlist(&seqlist); PushFront(&seqlist, 0);//头插 printf("头插0:"); PrintSeqlist(&seqlist); PopFront(&seqlist);//头删 printf("头删:"); PrintSeqlist(&seqlist); Insert(&seqlist, 1, 5);//指定位置插入 printf("在1位置插入5:"); PrintSeqlist(&seqlist); ret = Find(&seqlist, 5); printf("ret = %d\n", ret); Remove(&seqlist, 5);//删除 printf("删除5这个元素:"); PrintSeqlist(&seqlist); } void test2() { Seqlist seqlist; int ret = 0; InitSeqlist(&seqlist);//初始化 PushBack(&seqlist, 1);//尾插 PushBack(&seqlist, 2); PushBack(&seqlist, 3); PushBack(&seqlist, 4); PrintSeqlist(&seqlist); ReverseSeqlist(&seqlist);//逆序 printf("逆序:"); PrintSeqlist(&seqlist); SortSeqlist(&seqlist);//排序 printf("排序:"); PrintSeqlist(&seqlist); ret = BinarySearch(&seqlist, 2);//二分查找,返回ret为元素所在列表位置下标 printf("二分查找元素2:"); printf("ret = %d\n", ret); } int main() { test1(); //test2(); return 0; }
test1
test2
相关文章推荐
- 动态链接库DLL的操作顺序
- 类成员析构、虚析构函数、动态生成对象相关的 关于析构顺序的杂谈
- c++ 实现动态顺序表(拷贝构造 赋值运算符重载等操作)
- 函数模板在c++动态顺序表中的大作用
- 模拟实现顺序表-动态的存储方式
- 父类 子类 动态代码块 静态代码块 构造函数 执行顺序
- C编写的具有模板功能的Vector - 基于动态顺序数组
- 静态和动态顺序表的实现(c语言)
- C++继承中构造函数、析构函数调用顺序及虚函数的动态绑定
- JS实现文件动态顺序载入的方法
- 模板实现动态顺序表(含容量检测函数的详细讲解)
- 基于顺序搜索的动态分区分配算法
- 动态规划--加工顺序问题
- 【UML入门教程】——动态部分(下):顺序图、协作图
- 动态顺序表的简单实现
- 《算法导论》第十四章----数据结构的扩张(动态顺序统计)
- java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
- java静态/动态成员变量、初始化块,父类/子类构造函数执行顺序问题
- c++动态库加载顺序和同名动态库同时加载问题
- c::动态顺序表的简单实现