제1 부분 선형 표 의 체인 식 저장 소 (二) -- 무 두 결점

(2) 앞장 서지 않 는 단일 체인 시계
     선두 결점 을 가 진 단일 체인 표 에 비해 선두 결점 을 가지 지 않 은 단일 체인 표 는 직관 적 이지 만 첫 번 째 요 소 를 삽입 하고 삭제 할 때 다른 요 소 를 삽입 하고 삭제 하 는 작업 은 다르다.그리고 결점 이 있 는 단일 체인 표 의 조작 은 모두 통일 되 었 다.
     노드 가 없 는 단일 체인 시트 기본 동작:
      /*초기 화 * /
      /*빈 테이블 로 초기 화 * /
      /*빈 표 인지 아 닌 지 판단 * /
      /*데이터 요소 의 개 수 를 되 돌려 줍 니 다 * /
      /*i 번 째 요소 가 존재 할 때 e 에 값 을 부여 하고 OK 를 되 돌려 줍 니 다. 그렇지 않 으 면 ERROR * /
      /*링크 의 첫 번 째 e 와 copare 관 계 를 만족 시 키 는 데이터 요 소 를 되 돌려 주 는 순서 * /
      /*앞장 서지 않 는 단일 체인 시트 의 i 번 째 위치 에 요소 e * / 를 삽입 합 니 다.
      /*대여 점 이 없 는 단일 체인 시트 에서 i 번 째 요 소 를 삭제 합 니 다 * /
      /*표 의 모든 요소 호출 함수 visit * /
      /*약 cure 는 링크 의 요소 이 고 첫 번 째 가 아 닙 니 다. pre 로e. 전구 로 돌아 가 OK 로 돌아 가 는 데 성 공 했 습 니 다. false 로 돌아 가 는 데 실 패 했 습 니 다 * /
      /*약 crue 는 링크 의 요소 이 고 마지막 이 아 닙 니 다. next 로e. 그 후 계 를 되 돌려 줍 니 다. OK 를 성공 적 으로 되 돌려 주 었 습 니 다. 실 패 는 false * / 를 되 돌려 줍 니 다.
  / 、 ( )

/* */
void InitList(pLinkList L)
{
    L = NULL;
}

/* */
void ClearList(pLinkList L)
{
    pLinkList p;
    while(p)
    {
        p = L;
        L = p->next;
        free(p);
    }
}

/* */
Status ListEmpty(pLinkList L)
{
    if(L)
        return FALSE;
    else
        return TRUE;
}

/* */
int ListLength(pLinkList L)
{
    int i = 0;
    pLinkList p = L;
    while(p)
    {
        i++;
        p = p->next;
    }
    return i;
}

/* i , e, OK, ERROR*/
Status GetElem(pLinkList L,int i,elemtype *e)
{
    int j = 1;
    pLinkList p;
    while(j<i && p)
    {
        p = p->next;
        j++;
    }
    if(i == j && p)
    {
        *e = p->data;
        return OK;
    }
    return ERROR;
}

/* e compare */
int LocateElem(pLinkList L,elemtype e,Status(*compare)(elemtype,elemtype))
{ // :

    int i = 1; // int i =0;

    pLinkList p = L; // pLinkList p =L;

    while(p && !compare(p->data,e)) // while(p)

    { // { i++;

        i++; // if(compare(p->next,e))

        p = p->next; // return i;

    } // p = p->next;

    if(p) // }

        return i; // return 0;

    return 0;
}

/* i e*/
// 《 》 , 31

// ?

Status ListInsert (pLinkList L , int i ,elemtype e )
{
     int j = 1 ;
    pLinkList s ,p =L ;
     if (i <1 )
         return ERROR ;
    s = (pLinkList ) malloc ( sizeof (LinkList ) ) ;
    s - >data = e ;
     if (i = = 1 ) //i=1 。

     {
        s - >next = L ;
        L = s ;
     }
     else
     {
         while (p & &j <i -1 ) // i-1

         {
            j + + ;
            p = p - >next ;
         }
         if ( !p )
             return ERROR ;
        s - >next = p - >next ;
        p - >next = s ;
     }
     return OK ;
}
/* , , !
, i 1 , return , s ,
s , 。
, return ERROR; free(s) , 。*/
 
/* i , e */
Status ListDelete(pLinkList L,int i,elemtype * e)
{
 int j = 1;
 pLinkList q,p = L;
 if(!p)
        return ERROR;
 else if (i == 1)
 {
  L = p->next;
  *e = p->data;
  free(p);
 }
 else
 {
  while(!p->next && j<i-1)//p , i-1 , i
  {
   j++;
   p = p->next;
  }
  if(!p->next || j>i-1) // i<1 i
   return ERROR;
  q = p->next; //q
  *e = q->data;
  p->next = q->next;
  free(q);
 }
 return OK;
}
/* visit*/
void ListTraverse(pLinkList L,void(*visit)(elemtype *))
{
 pLinkList p = L;
 while(p)
 {
  visit(&p->data);
  p = p->next;
 }
}
/* cur_e , , pre_e , OK, false*/
Status PriorElem(pLinkList L,elemtype cur_e,elemtype *pre_e)
{
 pLinkList p = L;
 while(!p->next)
 {
  if(p->next->data == cur_e)
  {
   *pre_e = p->data;
   return OK;
  }
  p = p->next;
 }
 return ERROR;
}
/* cru_e , , next_e , OK, false*/
Status NextElem(pLinkList L,elemtype cur_e,elemtype *next_e)
{
 pLinkList p = L;
 while(!p->next)
 {
  if(p->data == cur_e)
  {
   *next_e = p->next->data;
   return OK;
  }
  p = p->next;
 }
 return ERROR;
}

좋은 웹페이지 즐겨찾기