顺序表】相关应用与基础操作函数【SDUT_2017_暑假

**顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。--摘自百度百科**
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#define LISTINCREASMENT 1000   //每次再分配元素的个数
#define  LISTSIZE 100000    //顺序存储的最大个数
#define  OVERFLOW -1
#define  OK 1
using namespace std;

int SeqInitial(Seqlist &L)      //初始化线性表
int ListInsert(Seqlist &L, int i, int e)   //向位置i插入元素e
void ListDelete(Seqlist &L, int i, int &e)     //删除线性表中第i个位置上的元素
int LocateELem(Seqlist &L, int e)    //定位元素e在顺序表中的位置
int GetElem(Seqlist &L, int i)    //返回第i个位置上的元素值

typedef struct        //顺序表元素定义
{
    int *elem;             //元素数据
    int length;            //顺序表现在的长度
    int listsize;              //顺序表开辟的长度
}Seqlist;


int SeqInitial(Seqlist &L)      //初始化线性表
{
    L.elem = (int *) malloc (sizeof(int) * LISTSIZE);      //为新数据开辟空间
    if(!L.elem) exit(OVERFLOW);    //如果分配失败返回OVERFLOW
    L.length = 0;   //顺序表长度初始化0
    L.listsize = LISTSIZE;   //顺序表总长度初始化
    return OK;
}


int ListInsert(Seqlist &L, int i, int e)   //向位置i插入元素e
{
    if(i < 1 || i > L.length + 1) printf("ERROR!");   //如果插入位置不合法
    if(L.length >= L.listsize)
    {
        int *newbase = (int *) realloc (L.elem, (L.listsize + LISTINCREASMENT) * sizeof(int));
        if(!newbase) return OVERFLOW;   //当前存储空间已满
        L.elem = newbase;
        L.listsize += LISTINCREASMENT;    //表的容量不足以分配内存
    }
    int *q = &(L.elem[i - 1]);     //找到前驱结点
    int *p;
    for(p = &(L.elem[L.length - 1]); p >= q; --p)   //依次往后移
        *(p + 1) = *p;
    *q = e;        //插入新数据
    ++L.length;     //长度++
    return OK;
}


void ListDelete(Seqlist &L, int i, int &e)     //删除线性表中第i个位置上的元素
{
    if(i < 1 || i > L.length) printf("ERROR!");    //如果删除位置不合法
    else
    {
        e = L.elem[i - 1];           //能保存一下被删掉的值
        for(; i < L.length; i++)     //从被删的数的位置开始依次后面的开始抵消前面的
        {
            L.elem[i - 1] = L.elem[i];
        }
        L.length--;    //总长度--
    }
}


int LocateELem(Seqlist &L, int e)    //定位元素e在顺序表中的位置
{
    int i;
    for(i = 0; i <= L.length - 1; i++)
    {
        if(L.elem[i] >= e)
        {
            break;
        }
    }
    return i + 1;
}


int GetElem(Seqlist &L, int i)    //返回第i个位置上的元素值
{
    if(i < 1 || i > L.length) printf("ERROR!");   //如果位置不合法
    else
    {
        return L.elem[i - 1];
    }
    return 0;
}

int main()
{
    Seqlist L;
    int i, d, n, t;
    printf("请输入顺序表的初始元素个数: ");
    scanf("%d", &n);    //n个数的线性表
    SeqInitial(L);     //初始化一个线性表
    printf("请输入数据: ");
    for(i = 1; i <= n; i++)     //输入数据
    {
        scanf("%d", &d);
        ListInsert(L, i, d);   //i为位置
    }

    printf("表长: %d\n", L.length);    //输出表的长度

    printf("表数据如下: ");
    for(i = 1; i <= L.length; i++)     //遍历整个顺序表并输出
    {
        printf("%d ", L.elem[i - 1]);
    }
    printf("\n");

    printf("请输入要删除元素的位置: ");
    scanf("%d", &t);   //删除元素的位置
    ListDelete(L, t, d);
    printf("被删除元素的值: %d\n", d);
    printf( "删除后的表:");
    for(t=1; t<=L.length; t++)
        printf("%d ",L.elem[t-1]);                 //删除后的表
    printf("\n");


    printf("请输入要插入数值的位置: ");
    scanf("%d", &t);
    printf("请输入要插入数值的数值: ");
    scanf("%d", &d);
    ListInsert(L, t, d);
    printf( "插入以后的表:");
    for(t=1; t<=L.length; t++)                  //插入以后的表
        printf("%d ",L.elem[t-1]);
    printf("\n");


    printf("请输入要检索的元素的位置: ");            //检索元素
    scanf("%d", &t);
    d = GetElem(L, t);
    printf("该元素的值为:%d\n",d);

    printf("谢谢使用请挂机\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值