鍊錶是一種線性的鏈式儲存結構,可以不用事先確定節點的個數,插入刪除節點需要的操作量較少。但只能通過遍歷鍊錶來查詢想找的節點。
每個節點用乙個結構體表示,節點結構體內分成兩部分(資料域、指標域)。指標域用來指向下乙個節點、資料域存放資料。
單向鍊錶需要維護乙個頭節點,之後所有的操作都需要通過頭節點。定義乙個結構體來管理鍊錶,管理結構體包含乙個頭節點和記錄鍊錶長度的變數。頭節點裡不存放資料,只用來指向下一節點。最好手動維護鍊錶長度(插入和刪除時手動計數),這樣不用每次遍歷到next==null來確認鍊錶結束。
單向鍊錶的結構示意圖
要實現的功能
初始化、遍歷、插入、按位置刪除、按值刪除、清空鍊錶、釋放鍊錶
mylinklist.c#include"mylinklist.h"
#include#includevoid sayhello()
managelinklisttype* init_ll()
//按位置插入資料,這裡的data要保證生存週期正常,鍊錶並不維護data的釋放
void insert_ll(managelinklisttype* pmll,int pos, void * data)
if(pos < 0 || pos > pmll->m_szie)
//建立臨時節點,賦值為頭節點
struct lnodestruct * currnode = &(pmll->head);
//將臨時節點移動到要插入位置
for(int i=0; inext;
}struct lnodestruct * newnode = malloc(sizeof(struct lnodestruct));
newnode->data = data;
//插入臨時節點所在的位置
newnode->next = currnode->next;
currnode->next = newnode;
pmll->m_szie++;
}//遍歷函式
void foreach_ll(managelinklisttype* pmll, void(*myforeach)(void*))
struct lnodestruct * currnode = &(pmll->head);
for(int i=0; im_szie; i++)
}//刪除,通過位置
void remove_ll(managelinklisttype* pmll, int pos)
struct lnodestruct* currnode = &(pmll->head);
struct lnodestruct* delnode = null;
//找到前驅節點
for(int i=0; inext;
}//要刪除的節點
delnode = currnode->next;
//將前驅節點的next指向本節點的next(即後驅節點)
currnode->next = delnode->next;
//釋放要刪除的節點
free(delnode);
delnode = null;
pmll->m_szie--;
}//通過值刪除
void removebyval_ll(managelinklisttype* pmll,void* data, int (*mycompare)(void*,void*))
struct lnodestruct* currnode = &(pmll->head);
struct lnodestruct* pernode = &(pmll->head);
for(int i=0;im_szie;i++)
}}//清除鍊錶
void clear_ll(managelinklisttype* pmll)
struct lnodestruct* currnode = pmll->head.next;
struct lnodestruct* nextnode = null;
for(int i=0;im_szie;i++)
pmll->m_szie = 0;
}
mylinklist.h#ifndef __my_link_list_h
#define __my_link_list_h
struct lnodestruct
;typedef struct
managelinklisttype;
void sayhello(void);
managelinklisttype* init_ll(void);
void insert_ll(managelinklisttype* pmll,int pos, void * data);
void foreach_ll(managelinklisttype* pmll, void(*myforeach)(void*));
void remove_ll(managelinklisttype* pmll, int pos);
void removebyval_ll(managelinklisttype* pmll,void* data, int (*mycompare)(void*,void*));
void clear_ll(managelinklisttype* pmll);
#endif
start0.c#include "mylinklist.h"
#include#includestruct persion;
void myprint(void * data)
void test0(managelinklisttype* pmll);
insert_ll(pmll,0,&p0);
}int mycompare(void* data1,void* data2)
}return 0;
}int main();
struct persion p2=;
struct persion p0=;
insert_ll(pmll,0,&p1);
insert_ll(pmll,0,&p2);
insert_ll(pmll,0,&p0);
foreach_ll(pmll,myprint);
printf("------------------------\n");
//remove_ll(pmll,0);
struct persion p4=;
removebyval_ll(pmll,&p4,mycompare);
foreach_ll(pmll,myprint);
printf("----------------------\n");
clear_ll(pmll);
foreach_ll(pmll,myprint);
free(pmll);
return 0;
}
鍊錶1 單向鍊錶
鍊錶中最簡單的一種是單向鍊錶,它包含兩個域,乙個資料域和乙個指標域,指標域指向鍊錶中的下乙個節點,最後乙個節點的指標域指向乙個空值 鍊錶最基本的結構是在每個節點儲存資料和到下乙個節點的位址,在最後乙個節點儲存乙個特殊的結束標記,另外在乙個固定的位置儲存指向第乙個節點的指標,有的時候也會同時儲存指向最...
單向鍊錶 1
單向鍊錶的排序 查詢 插入 刪除 使用單向鍊錶 按學生成績從高到低的順序儲存學生資訊 從中刪除不及格學生的資訊 include include include include using namespace std struct student 構建鍊錶的單節點資料元素 typedef studen...
鍊錶 1 之單向動態鍊錶
題目 多函式程式設計 struct word char c 20 struct word next 函式1 一輸入一串單詞字串,假設每個單詞長度不超過19個字元,用空格隔開,把每個單詞資料存在乙個單向動態鍊錶 簡稱單詞鍊錶 裡的乙個節點。struct word create word list 生成...