一、链表的基本概念
- 链表是一种物理上不连续、非顺序的存储结构,数据元素之间通过指针关联在一起。
- 链表有一系列的节点构成,每个节点至少包含两部分信息:元素数据、指向下一个节点的指针。
- 链表的特点:
1)空间开销大(物理空间不连续)
2)可以动态添加新的节点
3)查找元素只能按顺序查找
二、单向链表
- 图示
- 节点代码
class Node{//节点
public:
int data;
Node* pNode;
};
- 链表代码
class LinkList{
Node* head;
public:
LinkList(){
head=new Node;
head->data=0;
pNode=NULL;
}
~LinkList(){delete head;}
void CreatLinkList(int n);//创建链表
void InsertNode(int position,int d);//插入节点
bool isEmpty();
int getLength();
void deleteNode(int position);
void deleteLinkList();
};
- 创建链表—指定要创建的节点个数
void LinkList::CreatLinkList(int n){
if(n<0)
{
cout<<"error";
exit(EXIT_FAILURE);
}
Node *pnew,*tmp;
tmp=head;
for(int i=1;i<=n;i++
{
pnew=new Node;
cout<<"请输入第"<<i<<"节点的值"<<endl;
cin>>pnew->data;
pnew->pNode=NULL;
tmp->pNode=pnew;
tmp=pnew;
}
}
- 节点的插入
void LinkList::InsertNode(int position,int d){//d为数据,position为位置
if(position<0||position>getLength()+1)
{
cout<<"error";
exit(EXIT_FAILURE);
}
Node *tmp,*pnew;
tmp=head;
pnew=new Node;
pnew->data=d;
while(position-->0)
tmp=tmp->pNode;
pnew->pNode=tmp->pNode;
tmp->pNode=pnew;
}
- 判断链表是否为空
bool LinkList::isEmpty(){
if(head->pNode==NULL)
return true;
else
return false;
}
- 获取链表的长度
int LinkList::getLength(){
int length=0;
Node*p;
p=head->pNode;
while(p!=NULL)
{
length++;
p=p->pNode;
}
}
- 删除链表中指定位置的节点
void LinkList::deleteNode(int position){
if (position < 0 || position > GetLength()) {
cout << "输入位置错误!" << endl;
exit(EXIT_FAILURE);
}
Node*p=head;
Node*tmp;
while(position-->1)
p=p->pNode;
tmp=p->PNode;
p->pNode=tmp->pNode;
delete tmp;
}
- 删除链表
void LinkList::deleteLinkList(){
Node *p=head->pNode;
Node *tmp;
while(p!=NULL)
{
tmp=p;
p=p->pNode;
head->pNode=p;
delete tmp;
}
}
三、循环单向链表
- 图示
- 区别:创建头节点时,其指针指向head而非NULL