链表三插法详解:
链表的三种插入方法(头插法,尾插法,任意位置插入)_链表插入_夜路难行々的博客-CSDN博客
1·使用头插法创建链表
#include <iostream>
using namespace std;typedef struct Lnode{int data;struct Lnode *next;
}LNode,*LinkList;void PrintList(LinkList &L)
{LinkList p=L->next;while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;
}
void CreateList_F(LinkList &L,int n){ L=new LNode; L->next=NULL; //先建立一个带头结点的单链表 for(int i=0;i<n;i++){ LNode *p=new LNode; //生成新结点 cin>>p->data; //输入元素值 p->next=L->next;L->next=p; //插入到表头 }
}
int main()
{int n;cin >> n;LinkList L;CreateList_F(L,n);PrintList(L);
}
2·使用尾插法创建链表
#include <iostream>
using namespace std;typedef struct Lnode{int data;struct Lnode *next;
}LNode,*LinkList;void PrintList(LinkList &L)
{LinkList p=L->next;while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;
}void CreateList_L(LinkList &L,int n){ L=new LNode; L->next=NULL; LinkList r=L; //尾指针r指向头结点 for(int i=0;i<n;++i){ LNode *p=new LNode; //生成新结点 cin>>p->data; //输入元素值 p->next=NULL; r->next=p; //插入到表尾 r=p; //r指向新的尾结点 }
}
int main()
{int n;cin >> n;LinkList L;CreateList_L(L,n);PrintList(L);
}
3·使用尾插法创建链表并实现删除指定元素
#include <iostream>
using namespace std;typedef struct Lnode{int data;struct Lnode *next;
}LNode,*LinkList;void PrintList(LinkList &L)
{LinkList p=L->next;while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;
}void CreateList_L(LinkList &L,int n){ //正位序输入n个元素的值,建立带表头结点的单链表L L=new LNode; L->next=NULL; LinkList r=L; //尾指针r指向头结点 for(int i=0;i<n;++i){ LNode *p=new LNode; //生成新结点 cin>>p->data; //输入元素值 p->next=NULL; r->next=p; //插入到表尾 r=p; //r指向新的尾结点 }
}//CreateList_Lbool ListDelete(LinkList &L,int e){LinkList p=L->next;LinkList q=L;while(p && p->data!=e){ q=p;p=p->next;} if(!p) return false; //没找到被删除元素 q->next=p->next; delete p;return true;
}//ListDelete
int main()
{int n;cin >> n;LinkList L;CreateList_L(L,n);int e;cin >> e;ListDelete(L,e);PrintList(L);return 0;
}
4·合并两个有序链表
#include <iostream>
using namespace std;typedef struct Lnode{int data;struct Lnode *next;
}LNode,*LinkList;void PrintList(LinkList &L)
{LinkList p=L->next;while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;
}void CreateList_L(LinkList &L,int n){ //正位序输入n个元素的值,建立带表头结点的单链表L L=new LNode; L->next=NULL; LinkList r=L; //尾指针r指向头结点 for(int i=0;i<n;++i){ LNode *p=new LNode; //生成新结点 cin>>p->data; //输入元素值 p->next=NULL; r->next=p; //插入到表尾 r=p; //r指向新的尾结点 }
}//CreateList_L
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc){LinkList pa=La->next; LinkList pb=Lb->next;LinkList pc=Lc=La; //用La的头结点作为Lc的头结点 while(pa && pb){if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next;}else{pc->next=pb; pc=pb; pb=pb->next;}}pc->next=pa?pa:pb; //插入剩余段 delete Lb; //释放Lb的头结点}
}
int main()
{int n;cin >> n;LinkList La;CreateList_L(La,n);int m;cin >> m;LinkList Lb;CreateList_L(Lb,m);LinkList Lc;MergeList_L(La,Lb,Lc);PrintList(Lc);return 0;
}