数据结构与算法复习

第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;
插入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值