#include<iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void CreateList(LinkList&L,int n);
void ShowList(LinkList&L);
bool InsertElement(LinkList&L,int i,int element);
void DeleteElementNode(LinkList&L,int element);
bool DeleteLocationNode(LinkList&L,int location ,int&element);
LinkList MergeLinkList(LinkList&La,LinkList&Lb);
void CreateRecurrentList(LinkList&RL,int n);
void ShowRecurrentList(LinkList&RL);
void main(){
LinkList head;
CreateList(head,5);
ShowList(head);
InsertElement(head,4,6);
ShowList(head);
DeleteElementNode(head,5);
ShowList(head);
int element;
DeleteLocationNode(head,1,element);
ShowList(head);
cout<<"hello"<<endl;
cout<<element<<endl;
cout<<"hello"<<endl;
cout<<"MergeLinkList"<<endl;
LinkList La,Lb;
cout<<"输出第一个链表"<<endl;
CreateList(La,9);
ShowList(La);
cout<<"输出第二个链表"<<endl;
CreateList(Lb,10);
ShowList(Lb);
LinkList Lc = MergeLinkList(La,Lb);
cout<<"其实La和Lc虽然是不同的指针,但是指向同一个地址"<<endl;
cout<<"显示La"<<endl;
ShowList(Lc);
cout<<"显示Lc"<<endl;
ShowList(La);
cout<<"创建循环链表RL"<<endl;
LinkList RL;
CreateRecurrentList(RL,9);
ShowRecurrentList(RL);
}
void CreateList(LinkList&L,int n){
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LNode* slide = new LNode();
slide = L;
//前插入
//for (int i = 0;i<n;i+=2){
// LinkList p = (LinkList)malloc(sizeof(LNode));
// p->data = i;
// p->next =L->next;
// L->next = p;
//}
//尾插入
for (int i = 0;i<n;i+=2){
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = i;
p->next =slide->next;//这个相当于使得p->next=NULL,或者可以不要
slide->next = p;
slide = p;
}
}
void ShowList(LinkList&L){
LinkList slide = L;
slide = slide->next;
while (slide!=NULL)
{
cout<<slide->data<<endl;
slide = slide->next;
}
if(slide==NULL) {
cout<<"---------------------------------"<<endl;
}
}
bool InsertElement(LinkList&L,int i,int element){
LinkList slide = L;
int location = 1;
//扫描定位
while(slide&&location<i){
slide = slide->next;
location++;
}
//判断指针是否为空
if (i<1||slide==NULL)
{
return false;
}
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = element;
p->next = slide->next;
slide->next = p;
return true;
}
bool DeleteLocationNode(LinkList&L,int location,int&element){
LinkList slide = L;
int loc = 1;
while(slide&&loc<location){
slide = slide->next;
loc++;
}
//删除点错误
if (location<1||slide->next==NULL)
{
return false;
}else
{ LinkList p =slide->next;
slide->next = p->next;
element = p->data;
free(p);
return true;
}
}
void DeleteElementNode(LinkList&L,int element){
LinkList q = L;
LinkList p = L->next;
//查找元素为element的点
while(p!=NULL&&p->data !=element){
q = q->next;
p = p->next;
}
if (p)
{
q->next = p->next;
free(p);
}
}
//链表融合之前需要对链表中的数据进行从小到大的排序
LinkList MergeLinkList(LinkList&La,LinkList&Lb){
LinkList pa,pb,pc;
pa = La->next;
pb = Lb->next;
pc = La;
free(Lb);
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;
}
}
if(pa){
pc->next = pa;
}
if(pb){
pc->next = pb;
}
return La;
}
void CreateRecurrentList(LinkList&RL,int n){
RL = (LinkList)malloc(sizeof(LNode));
RL->next = NULL;
LinkList slide = RL;
for (int i = 0;i<n;i+=2)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
p->data = i;
p->next = slide->next;
slide->next = p;
slide = p;
}
slide->next = RL;
}
void ShowRecurrentList(LinkList&RL){
LinkList slide = RL->next;
while(slide!=RL){
cout<<slide->data<<endl;
slide = slide->next;
}
}