链表《Link》

链表(Link)

使用线性表的不足之处:

1.如果长度不确定,使用线性表时,会很不方便,运算效率比较低。

2.在线性表时,插入和删除一个数时,要移动大量的数据,会造成效率低下。

3.当为一个线性表分配存储空间时,如果存储空间满的话,再次插入数据的话,会造成“上溢”错误。

这上面的三个不足,在链表中都可以得到解决。

 

在链式存储方式中,要求每个节点由两部分组成:一部分用于存放数据元素值,成为数据域;一部分用于存放指针,称为指针域。

 

 

在线性链表中,用一个专门的指针head指向线性链表的第一个元素的节点(即存放线性表中第一个数据元素的存储的存储点的序号),线性链表的最后一个节点的指针域为空。

 

线性链表的插入:

1.利用栈取一个节点,设该节点号为P,在P节点中的数据域中插入元素为bV(p) = b;

2.在链表中寻找包含元素为x的前一个节点,设该节点的序号为q

3.将节点P插入节点q之后;

4.使节点P指向包含元素x的节点,即NEXTp= NEXTq);

5.使节点q的指针域内容改为指向节点p,即NEXTq=p

6.插入完成


 

线性链表的删除:

1.在线性链表中找到包含元素X的前一个节点,设该节点的序号为q,则包含元素的节点序号为:p=NEXTq);

2.将节点q后的节点p从线性表中删除,即让节点q的指针指向包含元素X的节点p的指针指向的节点,即NEXTq=NEXTp);

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();

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值