线性表的链式存储
单链表结点类型定义
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*Linklist;//之后便可用与定义其他结点
eg: LNode *p,*pre;
或者 Linklist p, l;
申请存储单元
LNode *p;
p=new LNode;
delete p; 释放结点。
链表的输出
void out(Linklist L)
{
LNode *p; //工具指针
p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
链表的递归遍历
void out1(Linklist L) //正序,从前往后输出
{if(p)
{
cout<<p->data;
out1(p->next);
}
}
void out2(Linklist L) //逆序,从前往后输出
{if(p)
(
out2(p->next)
cout<<p->data;
}
}
链表的插入和创建
两种插入
1、结点p后插入
void Insert1(Linklist L,LNode *p, int x)
{
LNode *s;
s=new LNode; //创建新结点
s->data=x;
s->next=p->next;
p->next=s;
}
2、结点p前插入 //需要找到p的前驱pre,在pre之后插入结点
void Insert2(Linklist L,LNode *p,int s)
{
LNode *s,*pre;
***pre=L;*** //开始查找p的前驱pre;
while(pre->next!=NULL&pre->next!=p)
pre=pre->next;
if(pre->next==NULL)
{
cout<<"p不存在 "; //也可以在p之后插入,再交换p和p->next的值
return;
}
s=new LNode;
s->data=x;
s->next=pre->next;
pre->next=s;
}
两种创建
1、头插法
void createList_H(Linklist &L,int n) //头插法
{
L=new LNode;
L->next=NULL;
LNode *p;
for(int i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next=L->next;
L->next=p;
}
}
输入数据后,往第一个位置插入,所以数据为倒序
如图:
2、尾插法
void createList(Linklist &L,int n) //尾插法
{
L=new LNode;
L->next=NULL;
LNode *r;
LNode *p;
r=L;
for(int i=0;i<n;i++)
{
p=new LNode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
输入数据往尾部插入,所以为正序。