資料結構 雙向鍊錶

2021-08-25 02:33:34 字數 4543 閱讀 7116

1.linkedlist.h

#ifndef linked_list_h

#define linked_list_h

#include #include #include //首先定義乙個鍊錶節點結構體

typedef struct linknodelinknode;

//再定義鍊錶結構體

typedef struct linklist;

//列印函式指標

typedef void(*printlinknode)(void*);

//初始化鍊錶

linklist* initlinklist();

//指定位置插入

void insertlinklist(linklist* list, int pos, void* data);

//刪除指定位置的值

void removebyposlinklist(linklist* list, int pos);

//獲得鍊錶的長度

int getlinklistsize(linklist* list);

//查詢

int findposbydata(linklist* list, void* data);

//返回第乙個結點

void* frontlinklist(linklist* list);

//返回最後乙個結點

void* backlinklist(linklist* list);

//列印鍊錶結點

void printlinklist(linklist* list, printlinknode print);

//釋放鍊錶記憶體

void freespacelinklist(linklist* list);

//從後面加入

void pushback(linklist* list, void* data);

//從後面彈出

void popback(linklist* list);

//從前面加入

void pushfront(linklist* list, void* data);

//從前面彈出

void popfront(linklist* list);

#endif // !linked_list_h

2.linkedlist.c

#include "linkedlist.h"

//初始化鍊錶

linklist* initlinklist()

//指定位置插入

void insertlinklist(linklist* list, int pos, void* data)

if (data == null)

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

//建立新的結點

linknode* newnode = (linknode*)malloc(sizeof(linknode));

newnode->data = data;

newnode->next = null;

//輔助指標

linknode* pcurrent = list->head;

for (int i = 0; i < pos; i++)

//將新節點加入鍊錶

newnode->pre = pcurrent;

newnode->next = pcurrent->next;

pcurrent->next = newnode;

list->size++;

}//刪除指定位置的值

void removebyposlinklist(linklist* list, int pos)

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

//輔助指標

linknode* pcurrent = list->head;

for (int i = 0; i < pos; i++)

//快取刪除的節點

linknode* pdel = pcurrent->next;

pcurrent->next = pdel->next;

//釋放刪除節點的記憶體

free(pdel);

list->size--;

}//獲得鍊錶的長度

int getlinklistsize(linklist* list)

//查詢

int findposbydata(linklist* list, void* data)

firstnode = firstnode->next;

pos++;

} return -10086;//表示沒有找到

}//返回第乙個結點

void* frontlinklist(linklist* list)

//返回最後乙個結點

void* backlinklist(linklist* list)

return pcurrent->data;

}//列印鍊錶結點

void printlinklist(linklist* list, printlinknode print)

}//釋放鍊錶記憶體

void freespacelinklist(linklist* list)

//輔助指標變數

linknode* pcurrent = list->head;

while (pcurrent != null)

//釋放鍊錶記憶體

list->size = 0;

free(list);

}//從後面加入

void pushback(linklist* list, void* data)

if (data == null)

insertlinklist(list, list->size, data);

}//從後面彈出

void popback(linklist* list)

//把最後乙個的前乙個的指標的next指向null

pcurrent->pre->next = null;

//釋放掉最後乙個指標

free(pcurrent);

list->size--;

}//從前面加入

void pushfront(linklist* list, void* data)

if (data == null)

insertlinklist(list, 0, data);

}//從前面彈出

void popfront(linklist* list)

3.測試

#include "linkedlist.h"

//自定義資料型別

typedef struct person person;

//列印函式

void myprint(void* data)

void test01() ;

person p2 = ;

person p3 = ;

person p4 = ;

person p5 = ;

person p6 = ;

printf("size:%d\n", getlinklistsize(list));

pushback(list, &p1);

printf("size:%d\n", getlinklistsize(list));

pushback(list, &p2);

pushback(list, &p3);

pushback(list, &p4);

pushback(list, &p5);

pushfront(list, &p6);

printlinklist(list, myprint);

printf("size:%d\n", getlinklistsize(list));

printf("-----------從後面彈出----------\n");

popback(list);

printlinklist(list, myprint);

printf("size:%d\n", getlinklistsize(list));

printf("-----------從前面彈出----------\n");

popfront(list);

printlinklist(list, myprint);

printf("size:%d\n", getlinklistsize(list));

printf("-----------返回第乙個節點資料----------\n");

myprint(frontlinklist(list));

printf("-----------返回最後乙個節點資料----------\n");

myprint(backlinklist(list));

}int main(void)

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...

資料結構 雙向鍊錶

前幾天寫了乙個單向鍊錶,今天參考自己單向鍊錶改寫了乙個雙向非迴圈鍊錶,下面只討論雙向非迴圈鍊錶。雙向非迴圈鍊錶有如下特點 一 雙向鍊錶每個結點都有乙個前驅指標和後驅指標 當然頭結點和尾結點除外 二 雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。三 頭結點只有後驅指標沒有前驅...

資料結構 雙向鍊錶

單鏈表的單向性 只能從頭結點開始高效訪問鍊錶中的資料元素。單鏈表還存在另乙個缺陷 逆序訪問時候的效率極低。如下 linklistlist for int i 0 i 5 i for int i list.length 1 i 0 i 根據大o推算法可以得出乙個for迴圈的時間複雜度為o n get ...