一、前插法
前插法是逆序创建链表的方式,(a1,a2,...an)逆置为(an,...a1)
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef struct Lnode
{
int data;
Lnode *next;
}Lnode,*LinkList;
//定义节点名称为Lnode和头指针类型名 *Linklist ,
//Linklist为Lnode类型的指针 Linklist = struct Lnode
void CreatList_head(LinkList &L)
{
int flag=1,x;
L=new Lnode;//建立一个带头结点的单链表
L->next=NULL;
cout<<"请输入要插入节点的数值,输入-1表示结束输入"<<endl;
while(flag)
{
cin>>x;
if(x!=-1)
{
LinkList p;
p=new Lnode; //生成新结点
p->data=x;
p->next=L->next; //插入到表头
L->next=p;
}
else
flag=0;
}
}
void Print_LinkList(LinkList &L)
{
Lnode *p=L->next;
cout<<"链表中元素依次为:";
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
}
int main()
{
LinkList head;
int n;
CreatList_head(head);
Print_LinkList(head);
}
二、尾插法
尾插法又称顺序创建,插入示意图与代码如下
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef struct Lnode
{
int data;
Lnode *next;
}Lnode,*LinkList;
void CreatList_last(LinkList &L,int n)
{
LinkList r;//定义一个尾指针
L=new Lnode; //L为头结点
L->next=NULL;
r=L; //尾指针r指向头结点
cout<<"请输入节点的个数n和每个节点的数值"<<endl;
cin>>n;
for(int i=0;i<n;++i)
{
LinkList p = new Lnode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
void Print_LinkList(LinkList &L)
{
Lnode *p=L->next;
cout<<"链表中元素依次为:";
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
}
int main()
{
int n;
LinkList t;
CreatList_last(t,n);
Print_LinkList(t);
}