△節點結構
typedef定義
//不帶頭節點的單鏈表
typedef int sdatatype;
// 節點結構
typedef struct slistnode
node,*pnode;
△鍊錶結構
typedef定義
// 給乙個鍊錶結構
typedef struct slist
slist;
△鍊錶的初始化
1.斷言
2.頭指標指向null
// 鍊錶的初始化
void slistinit(slist* pl)
△建立新結點
1.為新結點申請動態記憶體空間
2.判斷新結點是否為空
3.將元素的值賦給新結點
4.將新結點的next域指向null
//建立乙個結點
pnode buylistnode(sdatatype data)
pnewnode->_data = data;
pnewnode->_pnext = null;
}
△尾插法
0.斷言assert( )
1.鍊錶為空
讓頭指標指向新結點
2.只有乙個結點
讓頭指標的next指向新結點
3.有多個結點
遍歷,找到鍊錶中next域為空的結點,將該結點的next指向新結點
void slistpushback(slist* pl, sdatatype data)
//2.只有乙個結點
else if (pl->_phead->_pnext == null)
//3.有多個結點
else
cur->_pnext = buylistnode(data);
}}
△尾刪法
1.斷言assert
2.鍊錶為空
返回;3.只有乙個結點
free掉頭指標的next域;
讓頭指標指向null;
4.有多個結點
設定指標cur,儲存鍊錶的最後乙個結點;
設定指標pre,儲存鍊錶的倒數第二個結點;
讓cur指向頭指標,將指標pre置為空,然後讓cur從鍊錶第乙個元素向後遍歷,pre指向cur,當cur指向的結點的next域為null時,遍歷結束,此時,cur指向鍊錶的最後乙個結點,pre指向了鍊錶的倒數第二個結點,free掉cur,將pre的next域指向空。
// 尾刪法
void slistpopback(slist* pl)
//只有乙個結點
else if (pl->_phead->_pnext==null)
//有多個結點
else
free(cur);
cur = null;
pre->_pnext = null;
}}
△頭插法
1.判表空
2.設定乙個cur指標存放新結點
3.將cur指向頭指標的next域,將頭指標指向cur
void slistpushfront(slist* pl, sdatatype data)
else
}
△頭刪法
1.判表空
2.只有乙個結點:
將頭指標指向null
3.有多個結點:
設定乙個指標cur指向頭指標的next域,將頭指標指向cur的next域,free掉cur
void slistpopfront(slist* pl)
else if (pl->_phead->_pnext==null)
else
}
△在鍊錶pos位置後插入置為data的節點
1.判斷插入位置是否合法
2.設定兩個指標cur,pre,cru指標指向頭指標,pre指標指向null,若cur不等於pos,cur繼續往後走,若cur等於pos,將data存放在pre中,將pre指向cur的next域,將cur的next域指向pre。
單鏈表操作 無頭節點
ifndef singlelist h define singlelist h 這是沒有頭結點的版本檔案 有頭結點的版本更簡單些,操作統一 include include include include typedef int elemtype typedef struct nodenode,lin...
無頭單鏈表
鍊錶有單鏈表 雙鏈表和雙向迴圈鍊錶,每種鍊錶都有無頭和帶頭兩種,帶頭就是頭結點不存放資料元素 ifndef linklist h define linklist h include stdio.h include assert.h include string.h include malloc.h ...
單鏈表 無頭節點
就這書上 敲了一邊,加深印象,沒有頭結點的時候插入第乙個就有所不同了,而刪除時要找到前乙個,注意current link null 就這樣。include include include using namespace std struct linknode class list bool list...