数组实现静态表

1.顺序线性表的建立、插入、删除及查找。

2.具体要求:

(1)建立含n个数据元素的顺序表;

(2)可以在线性表的任意合法位置i插入一个数据元素;

(3)可以删除线性表在任意合法位置i上的一个数据元素;

(4)可以删除线性表中所有值为e的数据元素,并知道删除了几个这样的元素;

(5)可以查找第i个位置的元素;

(6)可以查找值为e的元素在线性表中的第一个位置i;

(7)可以输出该表中各元素的值;

(8)可以输出顺序表的长度(即数据元素的个数);

建立工程

Header Files:<SqList.h>

#ifndef SQLIST_H
#define SQLIST_H

#define MAXSIZE 30          //定义线性表的最大长度

typedef  int  ElemType;             //线性表中存放整型元素 

typedef struct{
   ElemType elem[MAXSIZE];       //线性表
   int length;                               // length指示当前线性表的长度
}SqList;

void initial(SqList &);                  //初始化线性表
void print(SqList &);                   //输出函数
bool insert(SqList &,int,int);       //插入元素
bool del(SqList &,int ,int & );      //删除元素
int locate(SqList ,int );                //查找 

#endif

Sourse Flies:

主函数文件:<main.cpp>

#include <stdio.h>
#include <SqList.h>
void main()
{
    SqList S;                        //S为一线性表
    int loc,e,flag=1;
    char j;
    bool temp;

    initial(S);                        //初始化线性表
    while(flag)
    {
        printf("请选择:\n");
        printf("1.显示所有元素  2.插入一个元素 3.删除一个元素 4.查找一个元素\n");
        printf("                       5.退出程序           \n");
        scanf(" %c",&j);
        switch(j){
            case ‘1‘:print(S); break; //显示所有元素
            case ‘2‘:
                {
                printf("请输入要插入的元素(一个字符)和插入位置:\n");
                printf("格式:位置,整数;例如:1,-2\n");
                scanf(" %d,%d",&loc,&e);  //输入要插入的元素和插入的位置
                temp=insert(S,loc,e);     //插入
                if(temp==false)  printf("插入失败!\n");  //插入失败
                   else  {printf("插入成功!\n");   print(S);}  //插入成功
                break;
                }
            case ‘3‘:
                {
                    printf("请输入要删除元素的位置:");
                    scanf("%d",&loc);                     //输入要删除的元素的位置
                    temp=del(S,loc,e);                    //删除
                    if(temp==true) printf("删除了一个元素:%d\n",e); //删除成功
                    else printf("该元素不存在!\n");                 //删除失败
                    print(S);
                    break;
                }
            case ‘4‘:
                {
                    printf("请输入要查找的元素:");
                    scanf(" %d",&e);      //输入要查找的元素
                    loc=locate(S,e);      //定位
                    if(loc!=-1)
                        printf("该元素所在位置:%d\n",loc+1); //显示该元素位置
                    else
                        printf("%d 不存在!\n",e);           //当前元素不存在
                    break;
                }
            default:flag=0;printf("程序结束,按任意键退出!\n");
        }
        getchar();
    }
}

函数实现:<Sqlist.cpp>

#include "stdio.h"
#include "SqList.h"

void initial(SqList &v)                        //初始化线性表
{
     int i;
     printf("请输入初始线性表长度:n=");    //输入线性表初始化时的长度
     scanf("%d", &v.length);
     printf("请输入从1到%d的各元素(整数)\n",v.length);
     getchar();
     for(i=0; i<v.length; i++)
         scanf("%d",&v.elem[i]);            //输入线性表的各元素

}

void print(SqList &v)
{
     int i;
     for(i=0; i<v.length; i++)
        printf("%d\n",v.elem[i]);
}

bool insert(SqList &v,int loc,int e)        //插入一个元素,成功返回True,失败返回False
{
     int i;
     if((loc<1)||(loc>v.length+1))
     {
         printf("插入位置不合理!\n");         //位置不合理
         return false;
     }
     else if(v.length>=MAXSIZE)                //线性表已满
     {
         printf("线性表已满!\n");
         return false;
     }
     else
     {
              for(i=v.length-1;i>=loc-1;i--)
               v.elem[i+1]=v.elem[i];        //其后元素依次后移
           v.elem[loc-1]=e;                    //插入元素
           v.length++;                        //线性表长度加一
           return true;
     }
}
bool del(SqList &v,int loc,int &e)
{                                            //删除一个元素,成功返回True,并用ch返回该元素值,失败返回False
     int j;
     if(loc<1||loc>v.length)
         return false;                        //删除位置不合理
     else
     {
         e=v.elem[loc-1];                    //e取得该元素值
         for(j=loc-1;j<=v.length-1;j++)
            v.elem[j]=v.elem[j+1];            //其后元素依次前移
         v.length--;                        //线性表长度减一
         return true;
     }
}

int locate(SqList v,int e)
{                                            //在线性表中查找ch的位置,成功返回其位置,失败返回-1
    int i=0;
    while(i<v.length&&v.elem[i]!=e)
        i++;                                //当前位置后移,直到找到为止
    if(v.elem[i]==e)
        return i;                            //找到当前元素
    else  return(-1);
}

一般采用动态实现数据存储。数组的好处,直接给出下标即可找到下标相应的数据。下标为零位置不再存储数据。

时间: 2024-10-13 00:16:13

数组实现静态表的相关文章

基于静态分配的数组的顺序表(兼具Boost单元测试)

首先,我们来搞明白几个概念吧(参考自网站数据结构及百度百科). 线性表 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的.线性表的逻辑结构简单,便于实现和操作.在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法. 顺序表 用顺序存储方法存储的线性表简称为顺序表(Sequential List).顺序表的存储方法是把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元

算法系列笔记2(静态表顺序统计-随机选择算法)

问题:当给定存在静态表(如数组)中的n个元素,如何快速找到其中位数.最小值.最大值.第i小的数? 首先想到的方法是先对数组元素进行排序,然后找到第i小的元素.这样是可行的,但比较排序最快也需要O(nlgn),能否在线性时间内解决呢.这就是随机的分治法-随机选择. 思想:利用随机划分(在快速排序中介绍过)找到主元r,这样就将小于等于r的元素放在了其左边,大于r的元素放在了其右边.这是可以计算出r的rank为k,如果正好等于i,则就返回该元素:如果k大于i,则在左边中寻找第i小的元素,否则在右边中寻

基于动态分配的数组的顺序表(兼具Boost单元测试)

我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分配的数组的顺序表绝大部分跟基于静态分配的数组的顺序表是一样的,只需在后者程序上改动一小部分即可. 第一,我们不需定义一个容量常量CAPACITY,而是定义一个私有变量myCapacity. 第二,类的构造函数需要改进一下.我们需要类在被实例化时自动申请内存,即需添加下边程序: ElementType

【线性表4】线性表的链式实现:静态表

简介 静态表依然是一种链表,只不过结点是存储在预先分配好的一个大的结点数组中的.使用静态表的场合是:有些编程语言没有指针,但有数组,因此就不能使用传统的链表,这个时候就可以使用静态表是去实现. 特点:结点的 "指针域" 保存的是下一个结点在数组中的索引.它依然是链表,不支持随机访问. 静态表在实际编程中并不常用. 静态表的原理 如下是一个表内容为 ['A' , 'B' , 'C' , 'D' , 'E'] 的字符链表的剖析图 假设 L 是 StaticList  对象 ,内部使用数组

数据结构实践项目——数组和广义表

本文针对 [数据结构基础系列网络课程(5):数组和广义表] 1. 数组的基本概念与存储结构 2. 特殊矩阵的压缩存储 3. 稀疏矩阵的三元组表示 4. 稀疏矩阵的十字链表表示 5. 广义表 6. 广义表的存储结构及基本运算的实现 [项目1 - 猴子选大王(数组版)] 一群猴子,编号是1,2,3 -m,这群猴子(m个)按照1-m的顺序围坐一圈.从第1只开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,最后一只出圈的猴子为大王.输入m和n,输出猴子离开圈子的顺序,从中也可以看出最后为大王是几号

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

第五章:1.数组和广义表 -- 数组

前言: 2.3.4章讨论的线性结构中的数据元素都是非结构的原子类型,元素的值是不再分解的.本章讨论的两种数据结构---数组和广义表可以看成是线性表在下述含以上的扩展:表中的数据元素本身也是一个数据结构. 其中.数组是一种比较熟知的数据类型,几乎所有程序语言都把数组类型设定为固有类型,前两节节以抽象数据类型的形式讨论数组的定义和实现,使读者加深对数组的理解. 目录: 1.数组的定义 2.数组的顺序表示和实现 3.矩阵的压缩存储 4.广义表的定义 5.广义表的存储结构 6.m元多项式的表示 7.广义

数据结构期末复习第五章数组和广义表

数据结构期末复习第五章 数组和广义表 二维数组A[m][n]按行优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((i-1)*n+j-1)*d     设数组的基址为LOC(a00) :LOC(aij)=LOC(a00)+( i*n+j )*d    二维数组A[m][n]按列优先 寻址计算方法,每个数组元素占据d 个地址单元.     设数组的基址为LOC(a11) :LOC(aij)=LOC(a11)+((j

数组和广义表-第5章-《数据结构题集》答案解析-严蔚敏吴伟民版

习题集解析部分 第5章 数组和广义表 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       本习题文档的存放目录:数据结构\▼配套习题解析\▼05 数组和广义表       文档中源码的存放目录:数据结构\▼配