양 방향 순환 링크 초기 화 삽입 삭제

9207 단어 데이터 구조
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE -1
#define NULL 0
#define OVERFLOW -2
#define ElemType int
#define Status int
typedef int ElemType
typedef int Status
#define LEN sizeof(DuLNode)
#define MLC (LinkList)malloc(sizeof(DuLNode))
/*
//          
InitList(&L) //      L
DestroyList(&L) //     L
ClearList(&L) //     L
ListEmpty(L) //         
ListLength(L) //    L   
GetElem(L,i,&e) //    L  i   
LocateElem(L,e,compare()) //       L   e
compare() //         ,  Bool
compareArray() //         ,  Bool
PriorElem(L,cur_e,&prio_e) //     L   e       
NextElem(L,cur_e,&next_e) //     L   e       
ListInsert(&L,i,e) //    L  i         e,  Bool
ListDelete(&L,i,e) //     L  i   ,     e  ,  Bool
ListTraverse(L,visit()) //     :   L       visit()
visit() //  visit                          ,
//                ,              。
//                                 “  ”
*/
//-------      --------------
//                
typedef struct DuLNode { //       
    ElemType data;
    struct DuLNode *prior;//  
    struct DuLNode *next;//  
}DuLNode, *DuLinkList;

//                           
DuLinkList DuLinkListInit_Out_Ptr() {
    DuLinkList L = (LinkList)malloc(LEN);
    if (L == NULL)       //             
        exit(OVERFLOW);
    L->next = L;  //next    
    L->prior = L; //prior    
    return L;
}
Status ListInsert_Dul_Tail_Tan(DuLinkList &L, int i, ElemType e) {
    //                i       e
    //   i-1   p   
    int j = 0; //   
    DuLinkList p = L; //p        
    DuLinkList s;//   
    while (j<i - 1 && p) { //   i-1   ,   i-1     
        p = p->next; //    
        j++; //   +1
    }
    if (!p) { //      i,  
        return FALSE;
    }
    s = (DuLinkList)malloc(sizeof(ElemType));//    
    if (!s) { //    ,  
        exit(OVERFLOW);
    }
    s->data = e;//     
                // i-1   , p   ,
    s->next = p->next;
    s->prior = p;
    (p->next)->prior = s;
    p->next = s;
}
Status ListInsert_Dul_Head_Tan(DuLinkList &L, int i, ElemType e) {
    //                i        e
    //   i   p   
    int j = 0; //   
    DuLinkList p = L; //p        
    DuLinkList s;//   
    while (j <= i - 1 && p) { //   i   ,   i     
        p = p->next; //    
        j++;//   +1
    }
    if (!p) {
        return FALSE;//      i
    }
    s = (DuLinkList)malloc(sizeof(ElemType));
    if (!s) {
        exit(OVERFLOW);//    ,  
    }
    s->data = e; //     
                 // i   , p   ,
    s->next = p;
    s->prior = p->prior;
    (p->prior)->next = s;
    p->prior = s;
}
Status ListDelete_Dul(DuLinkList &L,int i,ElemType e) {
    //                i        e
    int j = 0; //   
    DuLinkList p = L; //p        
    DuLinkList pre;//    pre
    DuLinkList nex;//    nex
    DuLinkList s;//    cur
    while (j <= i - 1 && p) { //   i   ,   i     
        p = p->next; //    
        j++;//   +1
    }
    s = p;
    pre = p->prior;
    nex = p->next;
    e = s->data; //     
    pre->next = nex->prior;
    nex->prior = pre->next;
    free(s);
    return TRUE;
}

좋은 웹페이지 즐겨찾기