本次实现的是线性链表的操作,和上次单链表不同在于,上次只实现了表头的插入和删除,这次是对线性表的整体实现插入和删除
废话不多说,直接看代码,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,就可以了。