1. 程式人生 > >單向連結串列之C++實現

單向連結串列之C++實現

單向連結串列是常用的資料結構,之前只是看過,沒有自己動手實現過,現在來實現以下,沒什麼難度,只是有些地方容易忽略。

把連結串列和連結串列結點定義在.h檔案中

//filename linklist.h
#ifndef LINKLIST_H
#define LINKLIST_H
#include<iostream>

//結點結構
class Node{
public:
	Node(int d):data(d),next(NULL){}
	int data;
	Node* next;	
};
class LinkList{
public:
	LinkList()
	{
		Head=NULL;
	}
	void init(Node *p)
	{
		Head=p;
	}
	void insert(Node*);//插入
	Node* deleteNode(Node*);//刪除
	void traverse(void(*visit)(Node*));//遍歷連結串列
	void destroy();//銷燬連結串列
	Node* search(int key);//查詢
private:
	Node* Head;
};
#endif

函式的實現在對應的.cpp檔案中
#include"linklist.h"
//在頭結點插入新節點
void LinkList::insert(Node *p)
{
	p->next=Head;
	Head=p;
}
//在連結串列中刪除結點p,成功則返回p,否則返回null
Node* LinkList::deleteNode(Node* p)
{
	Node** pnext;//pnext為指向指標的指標
	for(pnext=&Head;*pnext;pnext=&(*pnext)->next)
	{
		if(*pnext==p)
		{
			*pnext=p->next;
			return p;
		}
	}
	return NULL;

}
//遍歷連結串列
void LinkList::traverse(void(*visit)(Node*))
{
	Node* p;
	for(p=Head;p;p=p->next)
		visit(p);
}
//在連結串列中查詢數值為key的結點,找到(第一個)則返回結點指標,否則返回NUlLL
Node* LinkList::search(int key)
{
	Node* p;
	for(p=Head;p;p=p->next)
		if(p->data==key)
			return p;
	return NULL;
}
void LinkList::destroy()
{
	Node* p;
	Node* q;
	for(p=Head;p;)
	{
		q=p->next;
		delete p;
		p=q;
	}
	Head=NULL;
}

其中deleteNode函式的實現,沒有考慮要刪除的結點是否為頭結點。其中用了指向指標的指標。

最後寫個測試程式

#include<iostream>
#include"linklist.h"
using namespace std;
//遍歷函式
void printData(Node *p)
{
	cout<<p->data<<endl;
}
int main()
{
	LinkList H;
	Node *p;
	for(int i=0;i<10;i++)
	{
		p=new Node(i);
		H.insert(p);
	}
	p=H.search(5);//在連結串列找到結點
	Node* t=H.deleteNode(p);//把這個結點移除連結串列,並沒有釋放空間
	H.deleteNode(t);//釋放結點空間
	H.traverse(printData);//遍歷
	H.destroy();
	return 0;
}