資料結構-雙向連結串列
阿新 • • 發佈:2018-12-13
單鏈表的結點中只有一個指示直接後繼的指標域,由此,從某個結點出發只能順指標往後尋查其他結點。若要尋查結點的直接前驅,則需從表頭指標出發。為克服單鏈表這種單向性的缺點,可利用雙向連結串列。
在雙向連結串列中的結點中有兩個指標域,其一指向直接後繼,另一指向直接前驅。
定義的輔助巨集:
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define LISTINCREMENT 10
#define LIST_INIT_SIZE 30000
typedef int Status;
typedef int ElemType;
雙向連結串列的儲存結構定義:
typedef struct DuLNode{ ElemType data; struct DuLNode *next; struct DuLNode *prior; }DuLNode,*DuLinkList;
初始化一個雙鏈表.
Status InitList_DuL(DuLinkList &L){
//初始化一個雙鏈表
L=(DuLNode *)malloc(sizeof(DuLNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
L->prior=NULL;
return OK;
}
在帶頭結點的雙鏈迴圈線性表L中第i個位置之前插入元素e
Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){ //在帶頭結點的雙鏈迴圈線性表L中第i個位置之前插入元素e //i的合法值為 1 <=i <= 表長+1 //在L中確定插入位置指標p DuLNode *p=L; int j=0; while(p&&j<i-1){ p=p->next; j++; } if(!p||i<1) return ERROR; DuLNode *s; s=(DuLNode *)malloc(sizeof(DuLNode)); if(!s) exit(OVERFLOW); s->data=e; s->prior=p; if(!(p->next)){ p->next=s; s->next=NULL; } else{ s->next=p->next; p->next->prior=s; p->next=s; } return OK; }
刪除帶頭結點的雙鏈線性表L的第i個元素.
Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){ //刪除帶頭結點的雙鏈線性表L的第i個元素,i的合法值為 //1<=i<=表長 在L中確定第i個元素的位置指標p p=NULL,即第i個元素不存在 DuLNode *p=L; int j=0; while(p&&j<i){ p=p->next; j++; } if(!p||i<1) return ERROR; e=p->data; if(p->next){ p->prior->next=p->next; p->next->prior=p->prior; } else p->prior->next=NULL; free(p); p=NULL; return OK; }