根据结点插入位置的不同,链表的创建方法可分为前插法和后插法
前插法
前插法是通过将新节点逐个插入链表的头部(头节点之后)来创建链表,每次申请一个新节点,读入相应的数据元素值,然后将新节点插入到头节点之后。
后插法
后插法是通过将新节点逐个插入到链表的尾部来创建链表。同前插法一样,每次申请一个新节点,读入相应的数据元素值。不同的是,为了使新节点能够插入到表尾,需要增加一个尾指针 r 指向链表的尾结点。
前插法和后插法过程示意图与单链表的创建类似,只不过是多了个prior前驱指针
C++代码
#include<iostream>
using namespace std;
typedef struct DULNode//双向链表
{
int data;
struct DULNode *prior;
struct DULNode *next;
}DULNode,*DULinkList;
void create_Head(DULinkList &L,DULinkList &p,int n)//前插法
{
L = new DULNode;
L->next = NULL;
L->prior = NULL;
for( int i=0; i<n; i++ )
{
p = new DULNode;
cin>>p->data;
if(i==0)//当L只有头节点时要单独按出来连接节点p
{
p->next = NULL;
p->prior = L;
L->next = p;
}
else
{
p->next = L->next;
L->next->prior =p;
p->prior = L;
L->next = p;
}
}
}
void create_Tail(DULinkList &L,DULinkList &p,int n)//尾插法
{
DULinkList r;
L = new DULNode;
L->next = NULL;
L->prior = NULL;
r = L;
for( int i=0; i<n; i++ )
{
p = new DULNode;
cin>>p->data;
p->next = NULL;
r->next = p;
p->prior = r;
r= p;
}
}
void result_next(DULinkList L,int n)
{
DULinkList p;
p = L->next;
for( int i=0; i<n; i++ )
{
cout<<p->data;
p = p->next;
}
cout<<"\n";
}
void result_prior(DULinkList L,int n)
{
DULinkList p;
p = L->next;
for( int i=0; i<n-1; i++ )
p = p->next;
for( int i=0; i<n; i++ )
{
cout<<p->data;
p = p->prior;
}
cout<<"\n";
}
int main()
{
int n;
DULinkList L,p;
cout<<"数据结构---双向链表\n";
cout<<"请输入元素个数:";
cin>>n;
//尾插法
create_Tail(L,p,n);
cout<<"尾插法结果(next):";
result_next(L,n);
cout<<"尾插法结果(prior):";
result_prior(L,n);
//前插法
create_Head(L,p,n);
cout<<"前插法结果(next):";
result_next(L,n);
cout<<"前插法结果(prior):";
result_prior(L,n);
}
结果展示
数据结构---双向链表
请输入元素个数:3
4
5
6
尾插法结果(next):456
尾插法结果(prior):654
4
5
6
前插法结果(next):654
前插法结果(prior):456
--------------------------------
Process exited after 6.439 seconds with return value 0
请按任意键继续. . .
有问题可以评论留言,欢迎各位大佬的批评指正,十分感谢!
转载需说明