链表(Link)
使用线性表的不足之处:
1.如果长度不确定,使用线性表时,会很不方便,运算效率比较低。
2.在线性表时,插入和删除一个数时,要移动大量的数据,会造成效率低下。
3.当为一个线性表分配存储空间时,如果存储空间满的话,再次插入数据的话,会造成“上溢”错误。
这上面的三个不足,在链表中都可以得到解决。
在链式存储方式中,要求每个节点由两部分组成:一部分用于存放数据元素值,成为数据域;一部分用于存放指针,称为指针域。
在线性链表中,用一个专门的指针head指向线性链表的第一个元素的节点(即存放线性表中第一个数据元素的存储的存储点的序号),线性链表的最后一个节点的指针域为空。
线性链表的插入:
1.利用栈取一个节点,设该节点号为P,在P节点中的数据域中插入元素为b,V(p) = b;
2.在链表中寻找包含元素为x的前一个节点,设该节点的序号为q;
3.将节点P插入节点q之后;
4.使节点P指向包含元素x的节点,即NEXT(p)= NEXT(q);
5.使节点q的指针域内容改为指向节点p,即NEXT(q)=p;
6.插入完成
线性链表的删除:
1.在线性链表中找到包含元素X的前一个节点,设该节点的序号为q,则包含元素的节点序号为:p=NEXT(q);
2.将节点q后的节点p从线性表中删除,即让节点q的指针指向包含元素X的节点p的指针指向的节点,即NEXT(q)=NEXT(p);
3.删除完成。
代码:
#include<iostream>
using namespace std;
template<class Type>
struct node
{
Type d;
node *next;
};
template<class Type>
class link
{
public:
link();
void prt_link();
void ins_link(Type,Type);
Type del_link(Type);
private:
node<Type>*head;
};
template<class Type>
link<Type>::link()
{
head = NULL;
return ;
}
template<class Type>
void link<Type>::prt_link()
{
node<Type> *p;
p = head;
if(p == NULL)
{
cout<<"Empty!"<<endl;
}
/* while(p != NULL)
{
cout<<p->d<<endl;
p=p->next;
}
*/
do{
cout<<p->d<<endl;
p=p->next;
}while(p != NULL);
return ;
}
template<class Type>
void link<Type>::ins_link(Type x,Type b)
{
node<Type>*p,*q;
p = new node<Type>;
p->d = b;
if(head == NULL)
{
head = p ;
p->next = NULL;
}
if(head->d == x)
{
p->next = head;
head = p;
}
q = head;
while((q->next != NULL)&&(((q->next)->d) != x))
{
q = q->next;
p->next = q->next;
q->next = p;
}
}
template<class Type>
Type link<Type>::del_link(Type x)
{
node<Type>*p,*q;
if(head == NULL)
{
cout<<"ERROR"<<endl;
return 0;
}
if((head->d) == x)
{
p = head->next;
delete head;
head=p;
return 1;
}
q = head;
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;
}
#include"link.h"
int main()
{
link<int>s;
s.prt_link();
s.ins_link(10,10);
s.ins_link(10,30);
s.prt_link();
s.ins_link(10,40);
s.ins_link(10,50);
s.ins_link(10,60);
s.prt_link();
// s.del_link(50);
// s.prt_link();
}