不帶頭結點的單鏈表

2021-09-02 02:18:30 字數 4038 閱讀 2161

slist.h

#pragma once

typedef int sldatatype;

typedef struct slistnode

slistnode;

不帶頭節點的單鏈表 /

////鍊錶初始化

void slistinit(slistnode** phead);

//建立新結點

slistnode* slistnewnode(sldatatype data);

//列印鍊錶

void slistprint(slistnode* phead);

//尾插

void slistpushback(slistnode** phead, sldatatype data);

//尾刪

void slistpopback(slistnode** phead);

//頭插

void slistpushfront(slistnode** phead, sldatatype data);

//頭刪

void slistpopfront(slistnode** phead);

//查詢

slistnode* slistfind(slistnode** phead, sldatatype data);

//任意位置插入

void slistinsert(slistnode** phead, slistnode* pos, sldatatype data);

//任意位置刪除

void slisterase(slistnode** phead, slistnode* pos);

//銷毀單鏈表

void slistdestroy(slistnode** phead);

//鍊錶大小

int slistsize(slistnode* phead);

//判空

int slistempty(slistnode* phead);

//首節點

sldatatype front(slistnode* phead);

//末節點

sldatatype back(slistnode* phead);

//刪除第乙個值為data的結點

void slistremove(slistnode** phead, sldatatype data);

//刪除值為data的所有節點

void slistremoveall(slistnode** phead, sldatatype data);

//氣泡排序

void slistbubblesort(slistnode** phead);

slist.c

#include"slist.h"

#include#include#include#include//初始化

void slistinit(slistnode** phead)

//建立新結點

slistnode* slistnewnode(sldatatype data)

else

}//列印鍊錶

void slistprint(slistnode* phead)

printf("null\n");

}//尾插

void slistpushback(slistnode** phead, sldatatype data)

//否則從頭開始遍歷鍊錶,直到當前節點的指標域指向null,然後讓當前節

//點的指標域指向新申請的節點即可

slistnode* ptail = *phead;

while (ptail->_pnext)

ptail->_pnext = newnode;

}//尾刪

void slistpopback(slistnode** phead)

else if (null == (*phead)->_pnext)

else

free(pcur->_pnext->_pnext);

pcur->_pnext = null; }}

//頭插元素

void slistpushfront(slistnode** phead, sldatatype data)

//頭刪元素

void slistpopfront(slistnode** phead)

else

}//查詢元素

slistnode* slistfind(slistnode** phead, sldatatype data)

slistnode* pfind = *phead;

while(pfind)

pfind = pfind->_pnext;

} return null;

}//任意位置的插入

void slistinsert(slistnode** phead, slistnode* pos, sldatatype data)

_pnew->_pnext = pos->_pnext;

pos->_pnext = _pnew;

}//任意位置的刪除

void slisterase(slistnode** phead, slistnode* pos)

if (*phead == pos)

else

pospre->_pnext = pos->_pnext; //1 2 3 4 5

free(pos); // pospre pos }}

//銷毀單鏈表

void slistdestroy(slistnode** phead)

}//鍊錶大小

int slistsize(slistnode* phead)

return length;

}//判空

int slistempty(slistnode* phead)

return 0;

}//首節點

sldatatype front(slistnode* phead)

//末節點

sldatatype back(slistnode* phead)

return pcur->_data;

}//刪除第乙個值為data的結點

//void slistremove(slistnode** phead, sldatatype data)

刪除指定的所有節點

//void slistremoveall(slistnode** phead, sldatatype data)

//}//氣泡排序

void slistbubblesort(slistnode** phead)

else

}if (flag == 0)

} }}//刪除第乙個值為data的元素

void slistremove(slistnode** phead, sldatatype data)

while (pcur)

else

free(pcur);

break;

} ppre = pcur;

pcur = pcur->_pnext; }}

//刪除指定的所有節點

void slistremoveall(slistnode** phead, sldatatype data)

while (pcur)

else

free(pcur);

pcur = ppre->_pnext;

continue;

}ppre = pcur;

pcur = pcur->_pnext;

}}

slist-test.c

#include "slist.h"

#include#includevoid testslistback()

void testslistfront()

void testslist()

testslistdestroy()

int main()

不帶頭結點的單鏈表

不帶頭結點的鍊錶的實現 核心是直接設定頭指標指向第乙個節點 要注意此時的l的位址可能會發生改變.同時還要注意一級指標和二級指標的區別.注意linklist l和linklist l的區別 和帶結點的單鏈表的操作相比較,要考慮到頭指標就是頭結點,在一些會改變頭結點的情況下要仔細考慮.include i...

不帶頭結點的單鏈表

單鏈表也可以不設頭結點,如圖212 所示。顯 然,基於這種結構的基本操作和帶有頭結點的線性鏈 表基本操作是不同的。bo2 8.cpp 是不帶頭結點的線 性鍊錶的基本操作。bo2 8.cpp 不帶頭結點的單鏈表 儲存結構由c2 2.h定義 的部分基本操作 9個 define destroylist c...

單鏈表的建立(帶頭結點以及不帶頭結點)

include stdio.h include stdlib.h typedef struct list list list headcreatlist 頭插法建立鍊錶,不帶頭結點 return head list tailcreatlist 尾插法建立鍊錶,不帶頭結點 r next s 將l指向的...