c/c++ 线性表之顺序表

时间:2022-12-16 20:44:02

线性表之顺序表

存储在连续的内存空间,和数组一样。

下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit)。

实现了以下功能:

函数 功能描述
push_back 从最后插入
push_front 从最前插入
show_list 打印出顺序表里的元素
pop_back 从最后删除
pop_front 从最前删除
insert_pos 从指定位置插入
find 查找指定的元素,返回其在顺序表中的下标
length 返回顺序表的长度
delete_pos 从指定位置删除
delete_val 删除指定的值的元素
sort1 按升序排序
sort2 按降序排序
resver 反转顺序表中的元素
clear 清除顺序表中的元素
destroy 释放顺序表所占用的内存空间

SeqList.h

#ifndef __SEQLIST__
#define __SEQLIST__ #include <stdio.h>
#include <malloc.h>
#include <assert.h>
#include <memory.h>
#include <stdbool.h> #define SEQLIST_INIT_SIZE 8
typedef int ElemType; typedef struct SeqList{
int cap;//顺序表所能容纳的最大元素数量
int size;//当前顺序表中元素的数量
ElemType *base;//指向顺序表开始位置的指针
}SeqList; void init(SeqList*);
void push_back(SeqList*, ElemType);
void show_list(SeqList*);
void push_front(SeqList*, ElemType);
void pop_back(SeqList*);
void pop_front(SeqList*);
void insert_pos(SeqList*, ElemType, int);
int find(SeqList*, ElemType);
int length(SeqList*);
void delete_pos(SeqList*, int);
void delete_val(SeqList*, int);
void sort1(SeqList*);
void sort2(SeqList*);
void resver(SeqList*);
void clear(SeqList*);
void destroy(SeqList*);
#endif

SeqList.c

#include "SeqList.h"

bool reInit(SeqList* seq){
//容量已满,所以重新开辟空间
ElemType* newp = (ElemType*)realloc(seq->base,(seq->size+1)*sizeof(ElemType));
if(NULL == newp){
return true;
}
//如果重新开辟的空间的地址和原来空间的地址不相同
//就需要把原来内存空间里的值,复制到新的内存空间中。
if(seq->base != newp){
memmove(seq->base, newp, sizeof(ElemType)*seq->size);
seq->base = newp;
}
seq->cap++;
return false;
}
void init(SeqList* seq){
//开辟能容纳8个元素的内存空间
seq->base = (ElemType*)malloc(sizeof(ElemType) * SEQLIST_INIT_SIZE);
assert(NULL != seq->base);
seq->cap = SEQLIST_INIT_SIZE;
seq->size = 0;
}
void push_back(SeqList* seq, ElemType x){
if(seq->size >= seq->cap && reInit(seq)){
printf("线性表已满\n");
return;
}
seq->base[seq->size] = x;
seq->size++;
}
void push_front(SeqList* seq, ElemType x){
if(seq->size >= seq->cap && reInit(seq)){
printf("线性表已满\n");
return;
}
//往后移动一个元素的距离
memmove(seq->base+1, seq->base,seq->size * sizeof(ElemType));
seq->base[0] = x;
seq->size++;
}
void pop_back(SeqList* seq){
if(seq->size <= 0){
printf("线性表以空\n");
return;
}
seq->size--;
}
void pop_front(SeqList* seq){
if(seq->size <= 0){
printf("线性表以空\n");
return;
}
//往前移动一个元素的距离
memmove(seq->base, seq->base+1,seq->size * sizeof(ElemType));
seq->size--;
}
void insert_pos(SeqList* seq, ElemType x, int index){
if(seq->size >= seq->cap && reInit(seq)){
printf("线性表已满\n");
return;
}
if(index < 0 || index > seq->size){
printf("given index is error\n");
return;
}
//在指定的位置往后移动一个元素的距离
memmove(seq->base+index+1,seq->base+index,(seq->size-index)*sizeof(ElemType));
seq->base[index] = x;
seq->size++;
}
int find(SeqList* seq, ElemType x){
for(int i = 0; i < seq->size; ++i){
if(x == seq->base[i]){
return i;
}
}
return -1;
}
int length(SeqList* seq){
return seq->size;
}
void delete_pos(SeqList* seq, int index){
if(seq->size <= 0){
printf("线性表以空\n");
return;
}
if(index < 0 || index > seq->size - 1){
printf("given index is error\n");
return;
}
//在指定的位置往前移动一个元素的距离
memmove(seq->base+index,seq->base+index+1,(seq->size-index-1)*sizeof(ElemType));
seq->size--;
}
void delete_val(SeqList* seq, int value){
int pos = find(seq, value);
if(pos == -1){
printf("The enter value is not exist");
return;
}
delete_pos(seq, pos); }
void sort1(SeqList* seq){
for(int i = 0; i < seq->size-1; ++i){
for(int j = 0; j < seq->size-i-1; ++j){
if(seq->base[j] > seq->base[j+1]){
ElemType tmp = seq->base[j];
seq->base[j] = seq->base[j+1];
seq->base[j+1] = tmp;
}
}
}
}
void sort2(SeqList* seq){
for(int i = 0; i < seq->size-1; ++i){
for(int j = 0; j < seq->size-1-i; ++j){
if(seq->base[j] < seq->base[j+1]){
seq->base[j] = seq->base[j] + seq->base[j+1];
seq->base[j+1] = seq->base[j] - seq->base[j+1];
seq->base[j] = seq->base[j] - seq->base[j+1];
}
}
}
}
void resver(SeqList* seq){
//如果seq->size是偶数就会被整除,如果是奇数就会舍掉小数位,不进1
for(int i = 0; i < seq->size / 2; ++i){
ElemType tmp = seq->base[i];
seq->base[i] = seq->base[seq->size-i-1];
seq->base[seq->size-i-1] = tmp;
}
}
void clear(SeqList* seq){
seq->size = 0;
}
void destroy(SeqList* seq){
free(seq->base);
seq->base = NULL;
seq->cap = 0;
seq->size = 0;
}
void show_list(SeqList* seq){
for(int i = 0; i < seq->size; ++i){
printf("%d ", seq->base[i]);
}
printf("\n");
}

SeqListMain.c

#include "SeqList.h"

int main(){
SeqList list;
init(&list);
int select = 1;
ElemType item;
int index;
while(select){
printf("*****************************************\n");
printf("*** [1] push_back [2] push_front ***\n");
printf("*** [3] show_list [4] pop_back ***\n");
printf("*** [5] pop_front [6] insert_pos ***\n");
printf("*** [7] find [8] length ***\n");
printf("*** [9] delete_pos [10] delete_val ***\n");
printf("*** [11] sort1 [12] resver ***\n");
printf("*** [13] clear [14*] destroy ***\n");
printf("*** [0] quit [15] sort2 ***\n");
printf("*****************************************\n");
printf("请选择:>");
scanf("%d", &select);
if(0 == select)
break;
switch(select){
case 1:
printf("请输入要插入的数据,以-1结束>\n");
while(scanf("%d",&item),item != -1){
push_back(&list, item);
}
show_list(&list);
break;
case 2:
printf("请输入要插入的数据,以-1结束>\n");
while(scanf("%d",&item),item != -1){
push_front(&list, item);
}
show_list(&list);
break;
case 3:
show_list(&list);
break;
case 4:
pop_back(&list);
show_list(&list);
break;
case 5:
pop_front(&list);
show_list(&list);
break;
case 6:
printf("请输入要插入的数据>\n");
scanf("%d",&item);
printf("请输入要插入的index>\n");
scanf("%d",&index);
insert_pos(&list, item, index);
show_list(&list);
break;
case 7:
printf("please enter what you shoule find out>\n");
scanf("%d",&item);
index = find(&list, item);
if(index == -1){
printf("can not find %d \n", item);
}else{
printf("find %d at position %d\n", item, index);
}
show_list(&list);
break;
case 8:
printf("length is %d\n", length(&list));
show_list(&list);
break;
case 9:
printf("please enter the index that you shoule delete>\n");
scanf("%d", &index);
delete_pos(&list, index);
show_list(&list);
break;
case 10:
printf("please enter the value what you shoule delete >\n");
scanf("%d", &item);
delete_val(&list, item);
show_list(&list);
break;
case 11:
sort1(&list);
show_list(&list);
break;
case 12:
resver(&list);
show_list(&list);
break;
case 13:
clear(&list);
show_list(&list);
break;
case 15:
sort2(&list);
show_list(&list);
break;
default:
printf("输入的选择错误,请重新选择\n");
break;
}
}
destroy(&list);
}

c/c++ 线性表之顺序表的更多相关文章

  1. C&num;线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

  2. &lbrack;C&plus;&plus;&rsqb;线性链表之顺序表&lt&semi;一&gt&semi;

    顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...

  3. &lbrack;C&plus;&plus;&rsqb;线性链表之顺序表&lt&semi;二&gt&semi;

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

  4. 线性表之顺序表C&plus;&plus;实现

    线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...

  5. &lbrack;C&plus;&plus;&rsqb;数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  6. &lbrack;数据结构 - 第3章&rsqb; 线性表之顺序表(C&plus;&plus;实现)

    一.类定义 顺序表类的定义如下: #ifndef SEQLIST_H #define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况 ...

  7. 数据结构Java实现02----线性表与顺序表

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. 数据结构Java实现01----线性表与顺序表

    一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...

  9. C&num; 数据结构 线性表(顺序表 链表 IList 数组)

    线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. ...

随机推荐

  1. Sprint第二个冲刺(第七天)

    一.Sprint 计划会议: 现在简单的说下今天的会议情况:组员们除了完善之前做的功能,还打算实现把轮播图迁移到一个fragment中,方便管理.现在也准备着手实现商家上传商品的图片这个功能,虽说现在 ...

  2. ByteArrary&lpar;优化数据存储和数据流&rpar;

    原地址:http://www.unity蛮牛.com/blog-1801-799.html 首页 博客 相册 主题 留言板 个人资料   ByteArrary(优化数据存储和数据流) 分类:unity ...

  3. Oracle中使用escape关键字实现like匹配特殊字符,以及&字符的转义

    转:http://blog.chinaunix.net/uid-26896647-id-3433968.html 问题描述:如果在一个表中的一个字段上存在'&',  '_',  '%'这样的特 ...

  4. Android4&period;2增加新键值

    这里添加新的键值,不是毫无凭据凭空创造的一个键值, 而是根据kernel中检测到的按键值,然后转化为android所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Bro ...

  5. Android&period;mk文件详解(转)

    源:Android.mk文件详解 从对Makefile一无所知开始,折腾了一个多星期,终于对Android.mk有了一个全面些的了解.了解了标准的Makefile后,发现Android.mk其实是把真 ...

  6. NSTimer应用

    NSTimer应用 在参与项目开发中遇到了NSTimer的应用,虽然我负责的模块内只用到了一小部分,但我觉得还是有必要拿出来好好琢磨一下. 一.概念(来自官方描述) 官网上最新的定义是“A timer ...

  7. 自己动手实现java数据结构(一) 向量

    1.向量介绍 计算机程序主要运行在内存中,而内存在逻辑上可以被看做是连续的地址.为了充分利用这一特性,在主流的编程语言中都存在一种底层的被称为数组(Array)的数据结构与之对应.在使用数组时需要事先 ...

  8. ng-repeat不添加容器标签

    如UL中的循环, 我们不期望添加额外的div之类的容器标签, 使用ng-repeat-start和ng-repeat-end可以实现 <li class="item item-icon ...

  9. 安装 rabbitmq ,通过生成器获取redis列表数据 与 Celery 分布式异步队列

    一.安装rabbitmq  @全体成员 超简易安装rabbitmq文档 1.安装配置epel源rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/ ...

  10. Alpha阶段敏捷冲刺⑤

    1.提供当天站立式会议照片一张. 每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 新增了一个登录界面 完成记账的分类模块 报表界面初步设计 今天要完成 ...