1 單向鍊錶

2022-09-19 14:57:09 字數 3554 閱讀 6803

鍊錶是一種線性的鏈式儲存結構,可以不用事先確定節點的個數,插入刪除節點需要的操作量較少。但只能通過遍歷鍊錶來查詢想找的節點。

每個節點用乙個結構體表示,節點結構體內分成兩部分(資料域、指標域)。指標域用來指向下乙個節點、資料域存放資料。

單向鍊錶需要維護乙個頭節點,之後所有的操作都需要通過頭節點。定義乙個結構體來管理鍊錶,管理結構體包含乙個頭節點和記錄鍊錶長度的變數。頭節點裡不存放資料,只用來指向下一節點。最好手動維護鍊錶長度(插入和刪除時手動計數),這樣不用每次遍歷到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 生成...