1. 程式人生 > >線性連結串列的實現和操作

線性連結串列的實現和操作

本次實現的是線性連結串列的操作,和上次單鏈表不同在於,上次只實現了表頭的插入和刪除,這次是對線性表的整體實現插入和刪除

廢話不多說,直接看程式碼,linked_LList.h

#include<iostream>
using namespace std;
template <class T>
struct node{
T d;
node *next;
};

template <class T>
class linked_LList{
	private:
		node<T> *head;
	public:
		linked_LList();
		void prt_linked_LList();
		void ins_linked_LList(T,T);
		int del_linked_LList(T);
};

template <class T>
linked_LList<T>::linked_LList(){
head=NULL;
return;
}

template <class T>
void linked_LList<T>::prt_linked_LList(){
	node<T> *p;
	p=head;
	if(p==NULL){cout<<"Empty linked list!"<<endl;return;}
	do{
	cout<<p->d<<endl;
	p=p->next;
	}while(p!=NULL);
	return;
}

template <class T>
void linked_LList<T>::ins_linked_LList(T x,T b){
	node<T> *p,*q;
	p=new node<T>;
	p->d=b;
	if(head==NULL){head=p;p->next=NULL;return;}//empty
	if(head->d==x){p->next=head;head=p;return;}//first node
	q=head;
	while((q->next!=NULL)&&(((q->next)->d)!=x)) q=q->next;
	p->next=q->next;q->next=p;
	return;
}

template <class T>
int linked_LList<T>::del_linked_LList(T x){
	node<T> *p,*q;
	if(head==NULL) return 0;
	if((head->d)==x) {
	p=head->next;
	delete head;
	head=p;
	return 1;
	}
	while((q->next!=NULL)&&(((q->next)->d)!=x)) q=q->next;
	if(q->next==NULL) return 0;
	p=q->next;q->next=p->next;
	delete p;
	return 1;
}
舉例說明上面操作,linked_LList_main.cpp
#include"linked_LList.h"
int main(){
	linked_LList<int> s;
	cout<<"1 ouput the element"<<endl;
	s.prt_linked_LList();
	s.ins_linked_LList(10,10);
	s.ins_linked_LList(10,20);
	s.ins_linked_LList(10,30);
	s.ins_linked_LList(40,40);
	cout<<"2 ouput the element"<<endl;
	s.prt_linked_LList();
	if(s.del_linked_LList(30)) cout<<"delete:30"<<endl;
	else
		cout<<"there is no 30"<<endl;
	if(s.del_linked_LList(50)) cout<<"delete:50"<<endl;
	else
		cout<<"there is no 50"<<endl;
	cout<<"3 ouput the element"<<endl;
	s.prt_linked_LList();
	return 0;
}
這次圖就不截了,不過簡單的說明一下,對於連結串列最基本的操作,插入和刪除。

關於插入:

首先,插入,要明白是要把什麼東西插入到什麼位置,所以2個引數,x和b,在x前面插入b。

位置就有3種情況:

1.如果本來就是空連結串列?那麼此時b這個元素自然是表頭,head和p同時指向這個位置。

2.假如是一個頭結點?那麼就是上次介紹的單鏈表,p指向head,再由head指到p就可以了,(指向:p->next=head,指到:head=p)

3.如果是中間的某個結點?首先找到要插入位置的前一個節點,如何找,上面的while迴圈。

然後,就是就是連線進去,也就是p指向q的指向,q的指向再到p,來回就是這樣的。

關於刪除:

1.要刪除什麼?2.先說到底有沒有這個元素?

所以3種情況:

1.如果是空表?那麼就沒什麼好刪除的,退出;

2.如果是一個元素頭結點?和上面的是一個道理

3.如果是中間的某個元素?

3.1.假如遍歷完,沒有?那自然不用刪除

3.2.發現元素,這個元素的前一個結點為q,自己為p,所以q指向到p的指向,釋放p,就可以了。