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 ...