顺序表(动态)
来源:互联网 发布:知青子女 知乎 编辑:程序博客网 时间:2024/06/05 07:07
用动态开辟内存的方式写一个列表
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为DataTypetypedef 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);//初始化 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
阅读全文
0 0
- 顺序表(动态)
- 【数据结构】顺序栈(顺序表动态实现)
- 线性顺序表(动态数组实现)
- 顺序表的删除(动态数组)
- 动态顺序表(可分配内存空间)
- 简单电话通讯录(动态顺序表)
- 顺序表(动态开辟内存)
- 动态顺序表(C语言实现)
- 改良版的顺序表(动态)
- 动态顺序表
- 数据结构---动态顺序表
- 动态顺序表
- 动态顺序表
- 动态顺序表
- 动态顺序表
- 动态顺序表算法
- 动态顺序表
- 动态实现顺序表
- SENSOR------驱动简介:
- python机器学习实战6:利用adaBoost元算法提高分类性能
- 原码、补码、反码
- 2017上海金马五校程序设计竞赛 E:Find Palindrome
- 美颜你的Unity--使用Lut为Unity调色
- 顺序表(动态)
- CA证书自签详解
- Zipper 深搜与剪枝
- 如何利用Redis分布式锁实现控制并发
- MySQL运算符的优先级
- SVM学习(六):将SVM用于多类分类
- extjs滚动条超出内容可以拖动,autoScroll : false,
- 逆置元素
- kl16串口