slist.h
#pragma once
#include <
assert
.h>
#include
#include
typedef int sdatatype;
// 節點結構
typedef struct slistnode
node;
// 給乙個鍊錶結構
typedef struct slist
slist;
// 鍊錶的初始化
void
slistinit
(slist* pl)
;// 在鍊錶中尾插值為data的節點
void
slistpushback
(slist* pl, sdatatype data)
;// 刪除鍊錶最後乙個節點
void
slistpopback
(slist* pl)
;// 在鍊錶第乙個元素前插入值為data的節點
void
slistpushfront
(slist* pl, sdatatype data)
;// 刪除鍊錶中第乙個節點
void
slistpopfront
(slist* pl)
;// 在鍊錶pos位置後插入置為data的節點
void
slistinsertafter
(slist* pl,node* pos, sdatatype data)
;// 刪除鍊錶中值為data的節點
void
slisterase
(slist* pl, node* pos)
;// 在鍊錶中查詢值為data的節點,找到返回該節點的位址,否則返回空
node*
slistfind
(slist* pl, sdatatype data)
;// 銷毀鍊錶
void
slistdestroy
(slist* pl)
;// 獲取鍊錶中有效節點的個數
intslistsize
(slist* pl)
;// 檢測鍊錶是否為空
intslistempty
(slist* pl)
;// 獲取鍊錶的第乙個節點
node*
slistfront
(slist* pl)
;// 獲取鍊錶的第二個節點
node*
slistback
(slist* pl)
; node*
setnode
(sdatatype data)
;void
printslist
(slist* pl)
;void
test1
(slist* pl)
;void
slistremove
(slist* pl, sdatatype data)
;void
slistremoveall
(slist* pl, sdatatype data)
;
slist.c
#include "slist.h"
void
slistinit
(slist* pl)
// 在鍊錶中尾插值為data的節點
node*
setnode
(sdatatype data)
//創立乙個新節點
newslist-
>_data =data;
newslist-
>_pnext=null;
return newslist;
}void
slistpushback
(slist* pl, sdatatype data)
//尾插乙個節點
else
retslist-
>_pnext=newslist;}}
// 刪除鍊錶最後乙個節點
void
slistpopback
(slist* pl)
free
(ret-
>_pnext )
; ret-
>_pnext=null;
printf
("刪除成功!\n");
}// 在鍊錶第乙個元素前插入值為data的節點
void
slistpushfront
(slist* pl, sdatatype data)
// 刪除鍊錶中第乙個節點
void
slistpopfront
(slist* pl)
// 在鍊錶pos位置後插入值為data的節點
void
slistinsertafter
(slist* pl,node* pos, sdatatype data)
new-
>_pnext=ret-
>_pnext;
ret-
>_pnext=new;
}// 刪除鍊錶中pos位置的節點
void
slisterase
(slist* pl, node* pos)
else
if(pl-
>_phead-
>_pnext==null)
else
}else
ret-
>_pnext=pos-
>_pnext;
free
(pos)
; pos=null;}}
// 在鍊錶中查詢值為data的節點,找到返回該節點的位址,否則返回空
node*
slistfind
(slist* pl, sdatatype data)
return ret;
}// 銷毀鍊錶
void
slistdestroy
(slist* pl)
// 獲取鍊錶中有效節點的個數
intslistsize
(slist* pl)
printf
("有效元素的個數為:");
return count;
}// 檢測鍊錶是否為空
intslistempty
(slist* pl)
// 獲取鍊錶的第乙個節點
node*
slistfront
(slist* pl)
// 獲取鍊錶的第二個節點
node*
slistback
(slist* pl)
void
printslist
(slist* pl)
printf
("null\n");
}void
slistremove
(slist* pl, sdatatype data)
//移除第乙個值為data的節點
else
else}if
(ret-
>_data==data)
//最後乙個}}
/*node* ret=null;
node* ret2=null;
assert(pl);
ret=pl->_phead;
if(ret==null)
else
else
*///}
//}//while((ret!=null)&&(ret->_data!=data))//2 0 1 4
////if(ret==null)
////else
//else}if
(head-
>_pnext==null&&head-
>_data==data)
if(pl-
>_phead-
>_data==data)
}//當找到乙個之後,刪除這個節點,然後從這個節點繼續查詢
//node*ret=null;
//node* freelist=null;
//assert(pl);
//ret=pl->_phead;
//if(ret==null)
////else if(ret->_pnext==null&&ret->_data==data)
////else
//// ret=ret->_pnext;
// }
//}//}
void
test1
(slist* pl)
tast.c
#include "slist.h"
intmain()
無頭單鏈表的增刪查改
我們之前接觸過順序表 如果沒有了解的童鞋可以看看我的另一篇blog 資料結構 順序表 順序表的優點與缺點 我們知道順序表儲存資料可以很容易的對資料進行訪問 即隨機下標訪問 時間複雜度o 1 但是它也有自己的缺陷 比如在頻繁增刪的場景下時間複雜度很不友好o n 擴容時會導致空間的浪費等一系列問題。面對...
單鏈表的基本功能 C語言
整個工程所要可能會用到的標頭檔案 common.h ifndef common h define common h include include include include include define datatype int endif textmain.c define crt secu...
C 實現單鏈表的基本功能
鍊錶是指使用鏈結的方式儲存的線性表,一般乙個單鏈表結點由資料域和指標域兩個域組成如圖1所示,其中資料域data存放該結點的資料域的值,指標域next存放該結點的後繼結點的位址資訊。2 單鏈表的標頭檔案 pragma once include include struct stunode 代表學生的節...