数据结构与算法复习

第2章 线性表

1. 熟练掌握顺序表的查找、插入和删除算法实现查找

查找

int LocateELem(SqList L,ElemType e)//不改变L,不需要&引用
{
  for (i=0;i<L.length;i++)
      if (L.elem[i]==e) return i+1;//i从0开始,当i=0时,返回位置i+1=1          
  return 0;
}

插入

Status ListInsert_Sq(SqList &L,int i ,ElemType e){
   if(i<1 || i>L.length+1) return ERROR;	         //i值不合法
   if(L.length==MAXSIZE) return ERROR;    //当前存储空间已满     
   for(j=L.length-1;j>=i-1;j--) 
       L.elem[j+1]=L.elem[j];    //插入位置及之后的元素后移
    L.elem[i-1]=e;                     //将新元素e放入第i个位置
  ++L.length;		     	//表长增1
  return OK;
}

删除

Status ListDelete_Sq(SqList &L,int i){
   if((i<1)||(i>L.length)) return ERROR;	 //i值不合法
   for (j=i;j<=L.length-1;j++)                   
    L.elem[j-1]=L.elem[j];       //被删除元素之后的元素前移  
   --L.length;               	      //表长减1
  return OK;
}

2.熟练掌握链表的创建(前插、后插)、查找、插入和删除算法实现并灵活运用

前插

void CreateList_F(LinkList &L,int n){ 
     L=new LNode; 
      L->next=NULL; //先建立一个带头结点的单链表 
      for(i=n;i>0;--i){ 
        p=new LNode; //生成新结点 
        cin>>p->data; //输入元素值 
        p->next=L->next;L->next=p; 	//插入到表头 
     } 
}//CreateList_F 

后插

void CreateList_L(LinkList &L,int n){ 
      //正位序输入n个元素的值,建立带表头结点的单链表L 
      L=new LNode; 
      L->next=NULL; 	
      r=L; 	//尾指针r指向头结点 
      for(i=0;i<n;++i){ 
        p=new LNode;	 	//生成新结点 
        cin>>p->data;   		//输入元素值 
        p->next=NULL; r->next=p; 	    	//插入到表尾 
        r=p; 	//r指向新的尾结点 
      } 
}//CreateList_L 

查找

LNode *LocateELem_L (LinkList L,Elemtype e) {
 //返回L中值为e的数据元素的地址,查找失败返回NULL
  p=L->next;
  while(p &&p->data!=e)  
        p=p->next;                		
  return p; 	
} 
int LocateELem_L (LinkList L,Elemtype e) {
 //返回L中值为e的数据元素的位置序号,查找失败返回0 
  p=L->next; j=1;
  while(p &&p->data!=e)  
        {p=p->next;  j++;}          		
  if(p) return j; 
  else return 0;
} 

插入

Status ListInsert_L(LinkList &L,int i,ElemType e){ 
     p=L;j=0; 
      while(p&&j<i−1){p=p->next;++j;}	//寻找第i−1个结点 
      if(!p||j>i−1)return ERROR;	//i大于表长 + 1或者小于1  
      s=new LNode;			//生成新结点s 
      s->data=e;      		           //将结点s的数据域置为e 
      s->next=p->next;	   	          //将结点s插入L中 
      p->next=s; 			//前插思维
      return OK; 
}//ListInsert_L 

删除

Status ListDelete_L(LinkList &L,int i,ElemType &e){
    p=L;j=0; 
    while(p->next &&j<i-1){//寻找第i个结点,并令p指向其前驱 
        p=p->next; ++j; 
    } 
    if(!(p->next)||j>i-1) return ERROR; //删除位置不合理 
    q=p->next; //临时保存被删结点的地址以备释放 
    p->next=q->next; 	//改变删除结点前驱结点的指针域 
    e=q->data; 	//保存删除结点的数据域 
    delete q; 	//释放删除结点的空间 
 return OK; 
}//ListDelete_L 

3.掌握循环链表、双向链表的特点

从循环链表中的任何一个结点的位置都可以找到其他所有结点,而单链表做不到;
对循环链表,有时不给出头指针,而给出尾指针
可以更方便的找到第一个和最后一个结点
开始结点:rear->next->next
终端结点:rear

4. 熟练掌握循环链表、双向链表插入和删除算法实现

插入
p=L
q=p->next;
p->next=s;
s->next=q;
删除
q->next=p->next;
delete p;
插入

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。它包含了逻辑结构、存储结构(物理结构)和数据的运算。数据结构的学习目的是通过程序代码将现实世界的问题信息化,并且用计算机高效地处理这些信息从而创造价值。 算法是通过解决问题所采取的一系列步骤或指令。在算法中,通过分析基本运算的频度来评估算法的时间复杂度。时间复杂度是算法问题规模n的函数,通常用最深层循环内的基本运算频度f(n)来表示。算法的时间复杂度主要分析T(n)的数量级,其中T(n)是算法中所有语句频度的总和。 因此,复习数据结构算法主要包括理解数据结构的概念和特性,掌握常见的数据结构和它们的操作,以及了解如何使用算法解决问题并评估算法的时间复杂度。这样可以帮助我们更好地理解和解决实际问题,并提升程序的效率和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【2023数据结构算法复习指导】](https://blog.csdn.net/chijijixiaozhang/article/details/125186559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值