單鏈表的基本操作

2021-07-13 08:53:28 字數 4237 閱讀 7995

鍊錶概述

鍊錶是一種常見的重要的資料結構。它是動態地進行儲存分配的一種結構。它可以根據需要開闢記憶體單元。鍊錶有乙個「頭指標」變數,以head表示,它存放乙個位址。該位址指向乙個元素。鍊錶中每乙個元素稱為「結點」,每個結點都應包括兩個部分:一為使用者需要用的實際資料,二為下乙個結點的位址。因此,head指向第乙個元素:第乙個元素又指向第二個元素;……,直到最後乙個元素,該元素不再指向其它元素,它稱為「表尾」,它的位址部分放乙個「null」(表示「空位址」),鍊錶到此結束。

鍊錶的各類操作包括:單向鍊錶的建立、刪除(頭刪、尾刪)、  插入(頭插、c和c++尾插)、輸出、  查詢某乙個結點、指定位置刪除某結點等。

各種操作**如下:

#include"slistnode.h"

slistnode* _buynode(datatype x)//開闢新節點

void printslist(slistnode* & phead)//列印單鏈表

while (cur)

printf("null");

}void destorylist(slistnode* & phead)//釋放空間

phead = null;

}void pushback_c(slistnode** phead, const datatype x)//c尾插

}void pushback_cpp(slistnode* & phead, const datatype x)//c++尾插,使用引用

}void popback(slistnode* & phead)//尾刪

else if (phead->next == null)

else

tail->next = null;

free(tail->next); }}

void pushfront(slistnode* & phead, const datatype x)//頭插

}void popfront(slistnode* & phead)//頭刪

else }

slistnode* find(slistnode* phead, const datatype x)//查詢某數結點

printf("%d position is not exist!", x);

return null;

}void insert(slistnode* pos, const datatype x)//指定位置pos後插入新結點

void erase(slistnode* & phead, slistnode* pos)//刪除某結點

slistnode* prev = phead;

while (prev)

prev = prev->next;

}}

各函式測試用例如下:

#include"slistnode.h"

void test1()

void test2()

void test3()

int main()

標頭檔案如下:

#pragma once

#ifndef __slistnode_h__

#define __slistnode_h__

#define _crt_secure_no_warnings 1

#include #include #includetypedef int datatype;

typedef struct slistnode

slistnode;

slistnode* _buynode(datatype x);//開闢新節點

void printslist(slistnode* & phead);//列印單鏈表

void pushback_cpp(slistnode* & phead, const datatype x);//c++尾插

void pushback_c(slistnode** phead, const datatype x);//c尾插

void popback(slistnode* & phead);//尾刪

void pushfront(slistnode* & phead, const datatype x);//頭插

void popfront(slistnode* & phead);//頭刪

slistnode* find(slistnode*  phead, const datatype x);//查詢某數結點

void insert(slistnode* pos, const datatype x);//指定位置pos後插入新結點

void erase(slistnode* & phead, slistnode* pos);//刪除某結點

void destorylist(slistnode* & phead);//釋放空間

void printtailtohead(slistnode* phead);//從尾到頭列印單鏈表

void delnontailnode(slistnode* pos);//刪除乙個無頭單鏈表的非尾節點

void insertfrontnode(slistnode* pos, datatype x);//在無頭單鏈表的乙個非頭結點前插入乙個節點

slistnode* rverse(slistnode* phead);//逆置/反轉單鏈表

slistnode* findmidnode(slistnode* phead);//查詢單鏈表的中間節點,要求只能遍歷一次鍊錶

slistnode* findmidnode(slistnode* phead, datatype k);//查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶

slistnode* mergelist(slistnode* l1, slistnode* l2);//合併兩個有序鍊錶,合併後依然有序

void bubblesort(slistnode* phead);//氣泡排序單鏈表

slistnode* josephcycle(slistnode* phead, int k);//單鏈表實現約瑟夫環

//判斷單鏈表是否帶環?若帶環,求環長度,求環入口點

slistnode* checkcycle(slistnode* phead);//檢查是否帶環

int getcyclelength(slistnode* meetnode);//求環的長度

slistnode* getentrynode1(slistnode* phead);//求環的入口位址

slistnode* getentrynode2(slistnode* phead);//求環的入口位址

#endif //__slistnode_h__

鍊錶操作的其他實現見本人部落格:

【面試題】單鏈表的操作1 

【面試題】

單鏈表的操作2 

堆疊的簡述:

1、管理方式和碎片問題

對於棧來講,是由編譯器自動管理,無須手工控制;對於堆來說,釋放工作由程式設計師來控制,容易產生記憶體碎片;對於堆,頻繁的new / delete勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式的效率降低。對於棧來講,則不會出現這樣的問題,因為棧是先進後出的佇列,不可能有乙個非棧頂的記憶體塊從棧中間彈出,在它彈出之前,它上面後進的棧內容已經被彈出,因此不會出現不連續的碎片。

2、分配效率

棧是系統提供的資料結構,計算機會在底層對棧提供支援,分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。堆則是c / c++提供的,它的機制相對複雜;例如分配一塊記憶體,會按照一定的演算法(記憶體分配演算法)在堆記憶體中搜尋可用的足夠大小的空間,如果沒有足夠大小的記憶體空間(可能由於記憶體碎片太多),就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就有機會分到足夠大小的記憶體,然後進行返回。顯然,堆的效率比棧要低很多。

3、增長的方向不同

棧記憶體由乙個棧指標esp來開闢和**,棧記憶體是從高位址向低位址增長的,增長時,棧指標是向低位址方向移動,指標的位址值也就相應的減小;**時,棧指標向高位址方向移動,位址值也就增加。所以棧記憶體的開闢與**都只是指標的加減。

對於堆來講,增長的方向是向上的,也就是向著記憶體高位址的方向移動;**時,指標向低位址方向移動,位址值也就減小。

4、空間大小不同

一般來講32位的系統下,堆記憶體可以達到4gb的空間,從這個角度來看堆記憶體幾乎是沒什麼限制的。但是對於棧來講,一般都有一定的空間大小。無論是堆還是棧,都要防止越界現象的發生,因為越界的結果要麼是程式崩潰,要麼是摧毀程式的堆、棧結構,產生意想不到的結果。

本文出自 「scen」 部落格,請務必保留此出處

單鏈表基本操作

include include include include includeusing namespace std typedef struct node node,plinklist plinklist createfromhead node pstnode node malloc sizeof...

單鏈表基本操作

單鏈表的初始化,建立,插入,查詢,刪除。author wang yong date 2010.8.19 include include typedef int elemtype 定義結點型別 typedef struct node node,linkedlist 單鏈表的初始化 linkedlist...

單鏈表基本操作

include using namespace std define namelenth 20 define ok 0 define error 1 typedef struct flagnode node 生成結點 inline node newnode 銷毀化煉表 void destroylin...