無頭單鏈表的增刪查的基本功能實現

2021-09-09 08:40:07 字數 4483 閱讀 6645

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 代表學生的節...