線性表的實現(四)雙向鍊錶

2021-07-06 09:34:10 字數 3826 閱讀 2639

單鏈表的結點都只有乙個指向下乙個結點的指標

單鏈表的資料元素無法直接訪問其前驅元素

逆序訪問單鏈表中的元素是極其耗時的操作!

雙向鍊錶的定義

在單鏈表的結點中增加乙個指向其前驅的pre指標

插入操作

刪除操作

雙向鍊錶的新操作

獲取當前游標指向的資料元素

將游標重置指向鍊錶中的第乙個資料元素

將游標移動指向到鍊錶中的下乙個資料元素

將游標移動指向到鍊錶中的上乙個資料元素

直接指定刪除鍊錶中的某個資料元素

定義檔案:

#ifndef _my_dlinklist_h_

#define _my_dlinklist_h_

typedef void dlinklist;

/*typedef struct _tag_dlinklistnode dlinklistnode;

struct _tag_dlinklistnode;*/

typedef struct _tag_dlinklistnode

dlinklistnode;

dlinklist* dlinklist_create();

void dlinklist_destroy(dlinklist* list);

void dlinklist_clear(dlinklist* list);

int dlinklist_length(dlinklist* list);

int dlinklist_insert(dlinklist* list, dlinklistnode* node, int pos);

dlinklistnode* dlinklist_get(dlinklist* list, int pos);

dlinklistnode* dlinklist_delete(dlinklist* list, int pos);

//-- add

dlinklistnode* dlinklist_deletenode(dlinklist* list, dlinklistnode* node);

dlinklistnode* dlinklist_reset(dlinklist* list);

dlinklistnode* dlinklist_current(dlinklist* list);

dlinklistnode* dlinklist_next(dlinklist* list);

dlinklistnode* dlinklist_pre(dlinklist* list);

#endif

實現檔案:

typedef struct _tag_dlinklist

tdlinklist;

dlinklist* dlinklist_create()

return ret;

}void dlinklist_destroy(dlinklist* list)

}void dlinklist_clear(dlinklist* list)

}int dlinklist_length(dlinklist* list)

return ret;

}int dlinklist_insert(dlinklist* list, dlinklistnode* node, int pos)

next = current->next;

//步驟1-2

current->next = node;

node->next = next;

//步驟3-4

if( next != null ) //當鍊表插入第乙個元素,需要特殊處理

node->pre = current;

if( slist->length == 0 )

//若在0位置插入,需要特殊處理 新來結點next前pre指向null

if( current == (dlinklistnode*)slist )

slist->length++;

} return ret;

}dlinklistnode* dlinklist_get(dlinklist* list, int pos)

ret = current->next;

} return ret;

}//插入第乙個節點

//刪除的是最後乙個結點,該是如何處理

dlinklistnode* dlinklist_delete(dlinklist* list, int pos)

//if( (slist != null) && (0 <= pos) && (pos < slist->length) )

ret = current->next;

next = ret->next;

//步驟1

current->next = next;

//步驟2

if( next != null )//需要特殊處理

}if( slist->slider == ret )

slist->length--;

} return ret;

}dlinklistnode* dlinklist_deletenode(dlinklist* list, dlinklistnode* node)

current = current->next;

} if( ret != null )

}return ret;

}dlinklistnode* dlinklist_reset(dlinklist* list)

return ret;

}dlinklistnode* dlinklist_current(dlinklist* list)

return ret;

}dlinklistnode* dlinklist_next(dlinklist* list)

return ret;

}dlinklistnode* dlinklist_pre(dlinklist* list)

return ret;

}

測試檔案:

struct value

;int main22(int argc, char *argv)

優點:雙向鍊錶在單鏈表的基礎上增加了指向前驅的指標功能上雙向鍊錶可以完全取代單鏈表的使用迴圈鍊錶的next,pre和current操作可以高效的遍歷鍊錶中的所有元素缺點:**複雜

線性表4 雙向迴圈鍊錶

測試上一次介紹了單向迴圈鍊錶,這一次介紹雙向迴圈鍊錶。顧名思義,雙向迴圈鍊錶的結點中有兩個指標域,乙個指向直接後繼,乙個指向直接前驅。描述 資料域 兩個指標域 typedef int datatype typedef struct node dlinklist,dlinklist t 用malloc...

線性表 雙向鍊錶

雙向鍊錶是一種特殊的鍊錶。單鏈表和雙向鍊錶的區別 單鏈表 只能向乙個方向遍歷 雙向鍊錶 向兩邊都可以遍歷。雙向鍊錶的實現 為了找到節點和前驅,我們給節點增加乙個指向其前驅的指標,如下圖所示 既然單鏈表可以迴圈,那麼雙向鍊錶也就可以迴圈,如下圖所示即為雙向迴圈鍊錶 建立雙向鍊錶和建立單鏈表大同小異,雙...

(四)雙向鍊錶的設計與實現

1.概念 在單鏈表的結點中增加乙個指向其前驅的pre指標。雙向鍊錶擁有單鏈表的所有操作。2.設計與實現 1 插入操作 a.插入第乙個元素異常處理 if next null node pre current b.在0號位置處插入元素 新來結點node前pre指向null。即 node pre null...