[데이터 구조] 순환 양 방향 링크 정의 와 기본 작업

8172 단어 데이터 구조
순환 양 방향 링크:
순환 양 방향 링크 의 정의:
typedef struct CDLNode{
    LElemType data;
    struct CDLNode * pre;
    struct CDLNode * next;
    CDLNode(LElemType Data=0,struct CDLNode* Pre=NULL,struct CDLNode* Next=NULL){
        data=Data;  pre=Pre;    next=Next;
    }
}CDLNode,*CDLinkList;

순환 양 방향 링크 기본 작업 의 실현:
(1) 、 초기 화 작업 InitDuLinkList( &L )
(2) 단일 체인 시트 를 만 드 는 작업 CreateDuLinkList(&L , n)
(3) 선형 표 가 빈 표 인지 판단 하기 ListIsEmpty (L)
(4), 선형 표 의 길이 ListLength (L)
(5), 선형 표 의 i 번 째 요소 GetElem (L, i, & e)
(6), 원소 e 가 선형 테이블 에 있 는 위치 찾기 LocateElem (L, e)
(7) 、 삽입 작업 ListInsert (& L, i, e)
(8) 、 삭제 작업 LIstDelete (& L, i, & e)
(1) 、 초기 화 작업 InitDuLinkList( &L )
void InitCDLinkList(CDLinkList &L){
    L=new CDLNode(inf,NULL,NULL);
    L->next=L->pre;
    L->pre=L->next;
}

(2) 단일 체인 시트 를 만 드 는 작업 CreateDuLinkList(&L , n)
void CreateLinkList_Tail(CDLinkList &L,int n=0){ //   
    InitCDLinkList(L);
    CDLinkList p=L,Pre=L;
    Pre=L;
    LElemType Data;
    for(int i=1;i<=n;i++){
        printf("    %d data :
",i); cin>>Data; p=new CDLNode(Data,Pre,L); Pre->next=p; Pre=p; } L->pre=Pre; }
void CreateLinkList_Head(CDLinkList &L,int n=0){ //   
    InitCDLinkList(L);
    CDLinkList p=L,Pre=L,s;
    LElemType Data;
    for(int i=1;i<=n;i++){
        printf("    %d data :
",i); cin>>Data; p=new CDLNode(Data,L,L->next); s=L->next; if(i==1){ L->pre=p; p->next=L; } if(s){ s->pre=p; } L->next=p; } }

 
(3) 선형 표 가 빈 표 인지 판단 하기 ListIsEmpty (L)
bool ListIsEmpty(CDLinkList &L){
    return L->pre==L->next?false:true;
}

(4), 선형 표 의 길이 ListLength (L)
int ListLength(CDLinkList &L){
    CDLinkList p=L->next;
    int Len=0;
    while(p!=L){
        Len++;
        p=p->next;
    }
    return Len;
}

(5), 선형 표 의 i 번 째 요소 GetElem (L, i, & e)
void GetElem(CDLinkList &L,int i,LElemType &e){
    int j=1;
    CDLinkList p=L->next;
    while(p!=L&&jnext;
    }
    if(p==L||j>i){
        printf("\" GetElem \" index %d error!!!
",i); return ; } e=p->data; }

(6), 원소 e 가 선형 테이블 에 있 는 위치 찾기 LocateElem (L, e)
int LocateElem(CDLinkList &L,LElemType e){
    int j=1;
    CDLinkList p=L->next;
    while(p!=L&&p->data!=e){
        p=p->next;
        j++;
    }
    if(p==L){
        printf("\"LocateElem\" not found %d
",e); return -1; } return j; }

(7) 、 삽입 작업 ListInsert (& L, i, e)
void ListInsert(CDLinkList &L ,int i,LElemType e){
    int j=0;
    CDLinkList p=L,s;
    while(jnext!=L){
        j++;p=p->next;
    }
    if((p==L||j>i-1)&&i!=1){
        printf("\"ListInsert\" index : %d error!!!
",i); }else{ s=new CDLNode(e,p,p->next); p->next->pre=s; p->next=s; } }

(8) 、 삭제 작업 LIstDelete (& L, i, & e) 
void ListDelete(CDLinkList &L,int i,LElemType &e){
    int j=0;
    CDLinkList p=L,s;
    while(jnext!=L){
        j++;p=p->next;
    }
    if((p==L||j>i-1)&&i!=1){
        printf("\"ListInsert\" index : %d error!!!
",i); }else{ s=p->next; p->next=s->next; s->next->pre=p; e=s->data; delete s; } }

 
전체 디 버 깅 코드:
#include
#include
#include
#include
#define LElemType int
#define inf 0x3f3f3f3f
using namespace std;
typedef struct CDLNode{
    LElemType data;
    struct CDLNode * pre;
    struct CDLNode * next;
    CDLNode(LElemType Data=0,struct CDLNode* Pre=NULL,struct CDLNode* Next=NULL){
        data=Data;  pre=Pre;    next=Next;
    }
}CDLNode,*CDLinkList;
void InitCDLinkList(CDLinkList &L){
    L=new CDLNode(inf,NULL,NULL);
    L->next=L->pre;
    L->pre=L->next;
}

void CreateLinkList_Tail(CDLinkList &L,int n=0){ //   
    InitCDLinkList(L);
    CDLinkList p=L,Pre=L;
    Pre=L;
    LElemType Data;
    for(int i=1;i<=n;i++){
        printf("    %d data :
",i); cin>>Data; p=new CDLNode(Data,Pre,L); Pre->next=p; Pre=p; } L->pre=Pre; } void CreateLinkList_Head(CDLinkList &L,int n=0){ // InitCDLinkList(L); CDLinkList p=L,Pre=L,s; LElemType Data; for(int i=1;i<=n;i++){ printf(" %d data :
",i); cin>>Data; p=new CDLNode(Data,L,L->next); s=L->next; if(i==1){ L->pre=p; p->next=L; } if(s){ s->pre=p; } L->next=p; } } void OutputCDLinkList(CDLinkList &L){ CDLinkList p=L->next; printf("
:
"); while(p!=L){ printf("%d
",p->data); p=p->next; } p=p->pre; printf("
:
"); while(p!=L){ printf("%d
",p->data); p=p->pre; } printf("
"); } bool ListIsEmpty(CDLinkList &L){ return L->pre==L->next?false:true; } int ListLength(CDLinkList &L){ CDLinkList p=L->next; int Len=0; while(p!=L){ Len++; p=p->next; } return Len; } void GetElem(CDLinkList &L,int i,LElemType &e){ int j=1; CDLinkList p=L->next; while(p!=L&&jnext; } if(p==L||j>i){ printf("\" GetElem \" index %d error!!!
",i); return ; } e=p->data; } int LocateElem(CDLinkList &L,LElemType e){ int j=1; CDLinkList p=L->next; while(p!=L&&p->data!=e){ p=p->next; j++; } if(p==L){ printf("\"LocateElem\" not found %d
",e); return -1; } return j; } void ListInsert(CDLinkList &L ,int i,LElemType e){ int j=0; CDLinkList p=L,s; while(jnext!=L){ j++;p=p->next; } if((p==L||j>i-1)&&i!=1){ printf("\"ListInsert\" index : %d error!!!
",i); }else{ s=new CDLNode(e,p,p->next); p->next->pre=s; p->next=s; } } void ListDelete(CDLinkList &L,int i,LElemType &e){ int j=0; CDLinkList p=L,s; while(jnext!=L){ j++;p=p->next; } if((p==L||j>i-1)&&i!=1){ printf("\"ListInsert\" index : %d error!!!
",i); }else{ s=p->next; p->next=s->next; s->next->pre=p; e=s->data; delete s; } } int main() { CDLinkList La; LElemType e,t; InitCDLinkList(La); if(!ListIsEmpty(La)){ printf("La is empty!!!
"); } // 、 //CreateLinkList_Tail(La,5); CreateLinkList_Head(La,5); OutputCDLinkList(La); /* , , int Len=ListLength(La); if(ListIsEmpty(La)){ for(int i=0;i<=Len+1;i++){ e=inf; GetElem(La,i,e); e!=inf?printf("%d
",e):1; } } */ /* printf(" :
"); scanf("%d",&e); t=LocateElem(La,e); if(t!=-1){ printf("%d Locate : %d
",e,t); } */ /* ListInsert(La,6,123); OutputCDLinkList(La); */ e=inf; ListDelete(La,5,e); if(e!=inf){ printf("Delete : %d
",t); } OutputCDLinkList(La); }

좋은 웹페이지 즐겨찾기