单链表是用一组任意的存储单元存放线性表的元素。
1.为了能正确表示元素之间的逻辑关系,没个存储单元在存储数据元素的同时,还必须存储其后继元素所在的地址信息,这个地址信息称为指针,这两部分组成了数据元素的存储映像,称为结点。
2.单链表中每个结点的存储地址存放在其前驱结点的next域中,而第一个元素无前驱,所以设头指针(head pointer)指向第一个元素所在结点(称为开始结点),整个单链表的存取必须从头指针开始进行,因而头指针具有标识一个单链表的作用。
3.由于最后一个元素无后继,故最后一个元素所在结点(称为终端结点)的指针域为空,即Null,也称尾标志。
优点:
静态分配存储(顺序表)变为动态分配存储(单链表,循环双链表)
缺点:
必须从头指针开始遍历整个链表
代码:
#include<iostream>
using namespace std;
#define null 0
struct Node
{
int data;
Node *next;
};
class LinkList
{
private:
Node *first;
public:
LinkList();
LinkList(int a[],int n);
~LinkList();
int Length();
int Get(int i);
int Locate(int x);
void Insert(int i,int x);
int Delete(int i);
void PrintList();
};
LinkList::LinkList()
{
first=new Node;
first->next=null;
}
LinkList::LinkList(int a[],int n)
{
/*//头插法
first=new Node;
first->next=null;
for(int i=0;i<n;i++)
{
Node *s=new Node;
s->data=a[i];
s->next=first->next;
first->next=s;
}*/
//尾插法
first=new Node;
Node *r=first;
for(int i=0;i<n;i++)
{
Node *s=new Node;
s->data=a[i];
r->next=s;
r=s;
}
r->next=null;
}
LinkList::~LinkList()
{
Node *q=new Node;
while(first!=null)
{
q=first;
first=first->next;
delete q;
}
}
int LinkList::Length()
{
int c=0;
Node *q=new Node;
q=first->next;
while(q!=null)
{
c++;
q=q->next;
}
return c;
}
int LinkList::Get(int i)
{
Node *p=new Node;
p=first->next;
int c=1;
while(p!=null && c<i)
{
p=p->next;
c++;
}
if(p==null) throw "位置";
else return p->data;
}
int LinkList::Locate(int x)
{
Node *p=new Node;
p=first->next;
int c=1;
while(p!=null && p->data!=x)
{
p=p->next;
c++;
}
if(p==null) throw "位置";
else return c;
}
void LinkList::Insert(int i,int x)
{
Node *p=new Node;
p=first->next;
Node *q=new Node;
q->next=null;
q->data=x;
int c=1;
while(p!=null)
{
if(c==i-1)
{
q->next=p->next;
p->next=q;
break;
}
else
{
p=p->next;
c++;
}
}
}
int LinkList::Delete(int i)
{
Node *p=new Node;
p=first->next;
int c=1;
while(p!=null && c!=i-1)
{
p=p->next;
c++;
}
if(p==null || p->next==null) throw "位置";
Node *q=new Node;
q=p->next;
int x=q->data;
p->next=q->next;
delete q;
return x;
}
void LinkList::PrintList()
{
Node *p=new Node;
p=first->next;
while(p!=null)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main()
{
int a[10]={1,5,2,8,6,0,4,3,7,11};
LinkList ll(a,10);
ll.PrintList();
cout<<ll.Length()<<endl;
cout<<ll.Get(3)<<endl;
cout<<ll.Locate(0)<<endl;
ll.Insert(3,20);
ll.PrintList();
cout<<ll.Delete(3)<<endl;
ll.PrintList();
return 0;
}