链表中的笔记

来源:互联网 发布:开淘宝店需要用电脑吗 编辑:程序博客网 时间:2024/06/10 16:14

ListLength(L)

#define MAX 100

typedef struct{

                              int *base;

                               int front;

                               int last;

                         }SqList;

  int SqListlength(SqList L)

{ //链表中的元素个数

          return (L.last-L.front+MAX)/MAX;

}

 

 

Status Get(Triplet T,int i,ElemType &e)
{返回链表的第i个值

      T_len=ListLength(T);
    if(i>T_len || i<0) return ERROR;
    e=T[i-1];
    return ok;      
}

 

void union(List &La,List Lb)
{//将所有不在线性表La,但在Lb中的元素,转移到La中
     La_len=ListLength(La);Lb_len=ListLength(Lb);
     for(i=1;i<Lb_len;i++)
                      {
      GetElem(Lb,i,e);//取出Lb中第i个元素赋值给e.
      if(!LocateElem(La,e,equal)) 
                      ListInsert(La,++La_len,e);//不存在的进行插入
                      }
}

 

Ststus ListInsert_Sq(SqList &L,int i,ElemType e)
{//在顺序线性表L中第i个位置之前插入新元素e
    if(i<1 ||i>L.Length+1)
                 return 0;//i不合法
    if(L.length>=L.listsize)
    {//存储空间已经满了,增加分配
         newbase=(Elemtype *)realloc(L.elem,(L.listsize+Listsize)*sizeof(ElemType));
         if(!newbase) exit (-1);//新空间开辟失败
         L.elem=newbase;//新基趾
         L.listsize+=Listsize;  //增加存储容量                     
    }
    q=&(L.elem[i-1]);//q为插入位置
    for(p=&(L.elem[L.length-1]);p>=q;--p)

                     *(p+1)= *p;            //插入位置及之后的元素右移
    *q=e;//插入e
    ++L.length;//表长增加1
    return ok;                 
}

 

Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{//删除第i个元素,并用e来进行返回
      L_len=ListLength;
      if(i<0 || i>L_len) return -1;
      p=&(L.elem[i-1]);//p为被删除元素的位置
      e=*p;//被删除的元素赋值给e
      q=L.elem+L.length-1;//表尾的元素
      for(++p;p<=q;++p)
                *(p-1)=*p;//删除元素后左移
      --L.length;
      return ok;
}


int ListDelete(LinkList &first,int i)
{//将链表第i个元素删除
    ListNode *p,*q;
       p=Locate(first,i-1);//寻找第i-1个结点
       if(p==NULL || p->link==NULL)
             return 0;//i的值不合理
       q=p->link;//q此时指第i个元素
       p->link=q->link;//删除结点
       delete q;//释放
       return 1;
}


Status ListDelete(List &L,int i,ElemType &e)
{//删除第i个元素,并用e来进行返回
      ListNode *p,*q;
      p=Locate(first ,i-1);
      if(p==NULL || p->link==NULL)
              return 0;
        q=p->link;
        e=*q;
        p->link=q->link;
        delete q;
        return 1;      
}

 

 Status LocateElem_Sq(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{//在链表中第一个与e满足compare()的元素的为序
    i=1;//i的初始位序
    p=L.elem;//p的初值为第一个元素的值
    while(i<=L.length && !(*compare)(*p++,e))
                 i++;
     if(i<=L.length) return i;
     else return 0;  
}

 

Ststus GetElem_L(LinkList L,int i,ElemType &e)
{//L为带头结点的单链表的头指针
    p=L->next;j=1;//p指向第一个结点,j为计数器
    while(p && j<i)//顺着指针找,直到p指向第i个元素或p为空
    {
       p=p->next;j++;       
    }
    if(!p || j>i) return 0;//第i个元素不存在
    e=p->data;//取出第i个元素
    return ok;     
}

0 0
原创粉丝点击