資料結構之雙向鍊錶

2021-08-01 19:39:13 字數 3657 閱讀 9130

簡述

指標域有乙個指標

而言,占用資源更大,但相應的

雙向鍊錶遍歷的時候只需要乙個指標就可以,而且

只有得到其中任何乙個節點就是得到整個鍊錶,單向鍊錶必須得到他的頭節點,才能遍歷整個鍊錶,而且得有兩個指標。

實現 bothwaylinklist.h

#ifndef mymodule_h

#define mymodule_h

#include#include#if __cplusplus

extern "c"

#endif

#endif

bothwaylinklist.cpp

#include"bothwaylinklist.h"

//鍊錶節點

typedef struct _linknode

linknode;

//鍊錶

typedef struct _linklist

linklist;

//******************************************

//初始化鍊錶

void * init_linklist()

//指定位置插入元素

void insert_linklist(void *dlist, int pos, void *data)

if (null == data)

linklist *list = (linklist *)dlist;

linknode *ldata = (linknode *)data;

if (pos < 0 || pos > list->size)

//判斷鍊錶是否為空

if (list->size == 0)

//查詢插入的前乙個位置

linknode *current = &(list->header);

int i = 0;

for (; i < pos; i++)

//判斷是否在尾部插入節點

if (pos == list->size)

//其他插入情況

ldata->next = current->next;

ldata->prev = current;

current->next->prev = ldata;

current->next = ldata;

list->size++;

return;

}//頭部插入

void insert_front_linklist(void *dlist, void *data)

if (null == data)

insert_linklist(dlist, 0, data);

return;

}//尾部插入

void insert_back_linklist(void *dlist, void *data)

if (null == data)

linklist *list = (linklist *)dlist;

insert_linklist(dlist, list->size, data);

return;

}//指定位置刪除

void remove_bypos_linklist(void *dlist, int pos)

linklist *list = (linklist *)dlist;

if (pos < 0 || pos >= list->size)

if (list->size == 0)

//判斷鍊錶是否為乙個節點

if (list->size == 1)

//查詢待刪除節點的前乙個節點

linknode *current = &(list->header);

int i = 0;

for(; i < pos; i++)

//判斷刪除的節點是否為最後乙個節點

if (pos == list->size - 1)

//其他情況

linknode * del = (linknode *)current->next;

del->next->prev = current;

current->next = del->next;

list->size--;

return;

}//頭部刪除

void remove_front_linklist(void *dlist)

linklist *list = (linklist *)dlist;

if (list->size == 0)

remove_bypos_linklist(dlist, 0);

}//尾部刪除

void remove_back_linklist(void *dlist)

linklist *list = (linklist *)dlist;

if (list->size == 0)

remove_bypos_linklist(dlist, list->size - 1);

return;

}//獲得鍊錶大小

int size_linklist(void *dlist)

linklist *list = (linklist *)dlist;

return list->size;

}//正向列印鍊錶

void show_front_linklist(void *dlist, data_prent print)

linklist *list = (linklist *)dlist;

linknode *current = list->header.next;

while (current != null)

return;

}//反向列印鍊錶

void show_back_linklist(void *dlist, data_prent print)

linklist *list = (linklist *)dlist;

linknode *current = list->header.next;

//找到尾節點

int i = 0;

for (; i < list->size; i++)

//反序列印

while (current != &(list->header))

return;

}//銷毀鍊錶

void destroy_linklist(void *dlist)

free(dlist);

printf("鍊錶銷毀\n");

}

測試**

main.c

#define _crt_secure_no_warnings

#include#include#include#include"bothwaylinklist.h"

typedef struct _student

student;

void print(void* data)

void test()

int main()

資料結構之 雙向鍊錶

單鏈表的結點都只有乙個指向下乙個結點的指標。單鏈表的資料元素無法直接訪問其前驅元素。建立鍊錶 銷毀鍊錶 獲取鍊錶長度 清空鍊錶 獲取第pos個元素操作 插入元素到位置pos 刪除位置pos處的元素 dlinklist dlinklist creat 建立乙個鍊錶 void dlinklist des...

資料結構之雙向鍊錶

雙向鍊錶宛如一列火車,剛發明的時候只有乙個頭,如果它的行駛路線為 a b c d e f g h i j k a 這個時候有一批貨物需要從k運到j,那麼它的運輸路線一定是 k a b c d e f g h i j 所以後來火車就有了兩個頭,由此可見雙向鍊錶的重要性!雙向鍊錶 在單鏈表結點上增添了乙...

資料結構之雙向鍊錶

建立空鍊錶 list creat 摧毀鍊錶 in list 需要摧毀的鍊錶 void destroy list list 插入資料 頭插 in list 要插入的雙向鍊錶 in data 要插入的資料 bool insert head list list,data data 插入資料 尾插 in l...