定義乙個雙向鍊錶結構:
typedef struct dulnodedulnode,*dulinklist;
初始化乙個雙向鍊錶 :
dulinklist doublelinkedlistinit()
建立乙個雙向鍊錶:
//尾插法
void dulinklistcreatet(dulinklist l,int size)
t->next = null;
}// 頭插法
void dulinklistcreateh(dulinklist l,int size)
l->next = p;}}
列印輸出:
void printdulinklist(dulinklist l)
}printf("]\n");
printf("反向遍歷結果:[");
while(t->prior&&t!=l)
}printf("]\n");
}
指定位置插入
status dulinklistinsert(dulinklist l,int index,element v)
if(!p||i>index)
e = (dulinklist) malloc(sizeof(dulnode));
// 設定插入節點的資料為傳遞過來的引數值
e->data = v;
// 將要插入節點後繼為p指標的next,前驅就是p指標
e->next = p->next;
e->prior = p;
// 將原本是index位置節點的前驅指向要插入的元素
p->next->prior = e;
// 將p的next指向要插入的元素。
p->next = e;
return ok;
}
刪除指定位置的元素:
void dulinklistremove(dulinklist l,int index,element *e)
if(!p||i>index)
p->next->prior = p->prior;
p->prior->next = p->next;
*e = p->data;
// 釋放所在的記憶體空間
free(p);
}
測試結果:
資料結構與演算法 雙向鍊錶
雖然從表內第乙個節點到最後乙個節點的遍歷操作是非常簡單的,但是反向遍歷鍊錶卻不是一件容易的事情。如果為node類新增乙個欄位來儲存指向前乙個節點的連線,那麼久會使得這個反向操作過程變得容易許多。當向鍊錶插入節點的時候,為了吧資料複製給新的字段會需要執行更多的操作,但是當腰吧節點從表移除的時候就能看到...
資料結構與演算法 雙向鍊錶
typedef struct lineline line initline line head return head line insertline line head,int data,int add else 判斷條件為真,說明插入位置為鍊錶尾 if body next null else r...
資料結構與演算法 雙向鍊錶
ps 前面已經說過線性表的兩種表現形式,一種是順序,另一種是鏈式,鏈式的一種普通表現形式就是加入乙個指標,前乙個的指標指向後乙個結點的位址,那麼還有一種形式就是雙向鍊錶,裡面又加上了乙個指標變數,讓前指標變數指向直接前驅,後指標變數指向直接後繼。建立結構體 typedef struct double...