线性表插入和删除——程序实例

本文详细介绍了C++顺序表的基本操作,包括创建、初始化、销毁、清空、判断空表、求长度、获取元素、定位元素、插入元素、删除元素及遍历表等内容。

顺序实现

.h文件 此文件为方法    
#ifndef SQLIST_H_INCLUDED     
#define SQLIST_H_INCLUDED     
#include "ds.h" //for Status,OK ...     
#ifndef ElemType     
#define ElemType int /* 数据元素类型默认为 int */     
#define ELEMTYPE_TAG     
#endif  

   
/**********************************************************     
*  顺序表的存储结构定义      
***********************************************************/
#define LIST_INIT_SIZE 100 /* 存储空间初始分配容量 */     
#define LISTINCREMENT 10 /* 存储空间分配的增量 */     
typedef struct {     
    ElemType *elem;    //存储空间基址     
    int length;        //当前长度      
    int listsize;      //当前已分配的存储空间(元素个数)      
} SqList;  

   
/**********************************************************     
*  顺序表的基本操作声明     
***********************************************************/
//创建并初始化为空表      
Status InitList(SqList &L);     
//销毁整个表(从此之后不再可用)      
Status DestroyList(SqList &L);     
//将表L置空      
Status ClearList(SqList &L);     
//判断表L是否为空表      
bool ListEmpty(SqList L);     
//求表L的长度      
int ListLength(SqList L);     
//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR      
Status GetElem(SqList L, int i, ElemType &e); 
    
template <typename T> bool equal(T a, T b)     
{     
    return a==b;     
} 
    
//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0      
//    compare(a,b) 为比较函数,匹配时返回true,否则返回false      
//                 这里默认使用equal进行比较   
   
int LocateElem(SqList L, ElemType e,      
      bool (*compare)(ElemType,ElemType)=equal<ElemType>);     
//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR     
Status ListInsert(SqList &L, int i, ElemType e);     
//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR      
Status ListDelete(SqList &L, int i, ElemType &e);     
//遍历表L,对每个元素调用visit(x).      
Status ListTraverse(SqList L, Status (*visit)(ElemType));     
/**********************************************************     
*  顺序表的基本操作的实现     
***********************************************************/
//创建并初始化为空表      
Status InitList(SqList &L)     
{     
    // TODO (#1#): 创建空表     
    L.elem=(ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));     
    if(!L.elem)exit(OVERFLOW);     
    L.length=0;     
    L.listsize=LIST_INIT_SIZE;     
    return OK;     
    //-------------------------------------     
}     
//销毁整个表(从此之后不再可用)      
Status DestroyList(SqList &L)     
{     
    free(L.elem);     
    return OK;     
    //-------------------------------------     
}     
//将表L置空      
Status ClearList(SqList &L)     
{     
    // TODO (#1#): 清空表     
    L.length=0;     
    return OK;     
    //-------------------------------------     
}     
//判断表L是否为空表      
bool ListEmpty(SqList L)     
{     
    // TODO (#1#): 顺序表判空      
    if(L.length==0)     
        return TRUE;     
    else
    return FALSE;     
    //-------------------------------------     
}     
          
//求表L的长度      
int ListLength(SqList L)     
{     
    // TODO (#1#): 求顺序表长度     
    return  L.length;     
  
    //-------------------------------------     
}     
          
//取表L中的第i个元素,并用e返回. 操作成功返回OK,失败时返回ERROR      
Status GetElem(SqList L, int i, ElemType &e)     
{     
    // TODO (#1#): 取元素     
    if(ListEmpty(L))     
    {     
        printf("线性表L为空n");     
        return ERROR;     
    }      
    if(i<1||i>L.length)     
    {     
        printf("不存在%d位置的元素n",i);     
        return ERROR;     
    }     
    e=L.elem[i-1];     
    return OK;      
    //-------------------------------------     
}     
          
//在表L中定位元素e首次出现的位置. 操作成功返回位序,失败时返回0      
//    compare(a,b) 为比较函数,匹配时返回true,否则返回false      
int LocateElem(SqList L, ElemType e, bool (*compare)(ElemType,ElemType))     
{     
    // TODO (#1#): 在表中定位元素e,用compare(a,b)匹配元素     
    for (int j=0; j<L.length; j++)     
        if ( compare(L.elem[j],e) )  return j+1;     
    return 0;     
    //-------------------------------------     
}     
          
          
//在表L中插入第i个元素e. 操作成功返回OK,失败时返回ERROR     
Status ListInsert(SqList &L, int i, ElemType e)     
{     
    // TODO (#1#): 在链表中插入元素     
    if(i<1 || i>L.length+1)     
        return ERROR;     
     if (L.length >= L.listsize) //判读存储空间是否已满     
    {     
        ElemType * newbase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));     
        if (!newbase)     
            exit(OVERFLOW);     
        L.elem = newbase;     
        LL.listsize = L.listsize + LISTINCREMENT;     
    }     
    ElemType *q = &(L.elem[i - 1]); //q指向第i个元素     
    ElemType *p;                     //p指向最后一个元素     
          
    for (p= &(L.elem[L.length - 1]); p >= q; p--) //从最后一个位置开始移动     
    {     
        *(p + 1) = *p;     
    }     
          
    *q = e;     
    L.length++;     
    return ERROR;     
    //-------------------------------------     
}     
          
//删除表L中第i个元素,结果用e返回. 操作成功返回OK,失败时返回ERROR      
Status ListDelete(SqList &L, int i, ElemType &e)     
{     
    // TODO (#1#): 在顺序表中删除元素     
if (L.length == 0) //判断表是否为空     
    {     
        printf("表为空n");     
        return ERROR;     
    }     
          
    if (i < 1 || i > L.length) //判断删除位置是否合法     
    {     
        printf("删除位置不合法n");     
        return ERROR;     
    }     
          
    ElemType *p = &(L.elem[i - 1]); //p指向待删除的元素     
    e = *p;     
    ElemType *q = &(L.elem[L.length - 1]);     
    //ElemType *q = L->elem + L->length - 1; //q指向最后一个元素     
    for (pp = p + 1; p <= q; p++) //p从待删除的后一个元素开始,直到最后一个元素,每个元素一次向前移动一个位置     
    {     
        *(p - 1) = *p;     
    }     
          
    L.length--; //最后,线性表长度减一     
          
    return OK;     
    //-------------------------------------     
}     
          
//遍历表L,对每个元素调用visit(x).      
Status ListTraverse(SqList L, Status (*visit)(ElemType))     
{     
    // TODO (#1#): 遍历顺序表      
    for (int j=0; j<L.length; j++)     
        if ( ! visit(L.elem[j]) )  return ERROR;     
    return OK;     
    //-------------------------------------     
}
.cpp文件 此文件为主函数    
#ifdef ELEMTYPE_TAG     
#undef ElemType     
#undef ELEMTYPE_TAG     
#endif     
#endif  // SQLIST_H_INCLUDED     
#include <stdio.h>     
#include <stdlib.h>     
#include "ds.h"     
#define ElemType int                 //数据元素的类型      
Status print(ElemType e);            // 打印数据元素的方法     
bool equal(ElemType a, ElemType b);  //比较两个元素相等的方法      
#include "sqlist.h"     
//打印顺序表内容      
void PrintLinkList(SqList L);     
int main()     
{     
    SqList L;     
              
    //1)初始化顺序表      
    InitList(L);     
              
    //2)插入一些元素: 12,23,34,45     
    ListInsert(L,1,12);     
    ListInsert(L,1,23);     
    ListInsert(L,1,34);     
    ListInsert(L,1,45);     
              
    //3)打印顺序表信息      
    printf("n开始时顺序表内容n");     
    PrintLinkList(L);     
    printf("ListLength(L) : %dn", ListLength(L));     
    printf("ListEmpty(L)  : %dn", ListEmpty(L));     
              
    //4)顺序表插入      
    printf("n请输入一个元素:");      
    ElemType x;     
    read(x);     
    printf("插入开头:");     
    ListInsert(L,1,x);     
    PrintLinkList(L);     
    printf("插入末尾:");      
    ListInsert(L,ListLength(L)+1,x);     
    PrintLinkList(L);     
              
    //5)顺序表删除     
    printf("n请选择删除第i(1..%d)个元素:", ListLength(L));     
    int i;     
    read(i);     
    ElemType e;      
    if ( ListDelete(L,i,e)==OK ) {     
        Status print(ElemType e);  //声明print(e)函数      
                  
        printf("删除"); print(e);     
        printf("成功n");     
    } else
        printf("删除失败.n");     
    printf("顺序表内容:");     
    PrintLinkList(L);     
              
    //6)元素定位     
    printf("n请输入一个元素以便定位:");     
    read(x);     
    i = LocateElem(L,x);     
    if ( i!=0 ) {     
        printf("该元素是表中的第%d个元素.n",i);     
    } else
        printf("该元素在表中不存在.n");      
              
    //7)清空顺序表     
    ClearList(L);     
    printf("n最后顺序表内容n");     
    PrintLinkList(L);     
    printf("ListLength(L) : %dn", ListLength(L));     
    printf("ListEmpty(L)  : %dn", ListEmpty(L));     
               
    //8)销毁顺序表      
    DestroyList(L);     
              
    system("PAUSE");     
    return 0;     
}     
          
// 打印数据元素的方法      
Status print(ElemType e)     
{     
    printf("%5d",e);     
    return OK;     
}     
          
//比较两个元素相等的方法     
bool equal(ElemType a, ElemType b)     
{     
    return a==b;     
}     
          
//打印顺序表内容      
void PrintLinkList(SqList L)     
{     
    ListTraverse(L,print); //遍历顺序表并print()每个元素      
    printf("n");     
}


,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
电源题电赛单相并网离网软件硬件锁相环单极性双极性调制等代码及仿真环路计算资料+原理图PCB内容概要:本文档是一份关于电力电子与能源系统仿真研究的技术资料集合,涵盖单相并网/离网系统、软件与硬件锁相环设计、单极性与双极性调制技术、虚拟同步机控制建模、P2G-CCS耦合系统、微电网优化调度、光伏风电联合运行、储能配置及需求响应等多个电力系统核心主题。文档提供了大量基于Matlab/Simulink的代码实现与仿真模型,包括LLC谐振变换器小信号分析、永磁同步电机控制、DC-AC变换器设计、光伏阵列故障仿真、直流微电网建模等,并附有原理图与PCB设计资源。同时整合了智能优化算法(如遗传算法、粒子群、灰狼优化器)、机器学习模型(如LSTM、CNN-GRU-Attention)在负荷预测、故障诊断、路径规划等领域的应用案例,形成一个跨学科的科研资源包。; 适合人群:电气工程、自动化、能源系统及相关专业的研究生、科研人员以及从事电力电子、微电网、新能源控制方向的工程师;具备Matlab/Simulink编程基础和一定电力系统理论知识者更佳。; 使用场景及目标:① 支持电赛科研项目中对并网逆变器、锁相环、调制策略的设计与验证;② 用于复现高水平论文(如EI/SCI)中的优化调度、控制算法与仿真模型;③ 辅助开展微电网能量管理、储能配置、需求响应策略等课题的研究与代码开发;④ 提供可直接调用的算法模板与仿真平台,提升科研效率。; 阅读建议:建议按照文档结构逐步浏览,优先下载并整理网盘中的完整资源包,结合具体研究方向选取对应代码与模型进行调试与二次开发;对于复杂算法(如NSGA-II、ADMM、MPC),应配合文献理解其数学原理后再实施仿真;关注其中“论文复现”类内容以提升学术研究规范性与技术深度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值