1. 程式人生 > >資料結構-雙向連結串列

資料結構-雙向連結串列

單鏈表的結點中只有一個指示直接後繼的指標域,由此,從某個結點出發只能順指標往後尋查其他結點。若要尋查結點的直接前驅,則需從表頭指標出發。為克服單鏈表這種單向性的缺點,可利用雙向連結串列。

在雙向連結串列中的結點中有兩個指標域,其一指向直接後繼,另一指向直接前驅。

定義的輔助巨集:

#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;
}