#include <iostream>
using namespace std;
typedef struct LNode{
int data;
LNode* next;
}LNode, *LinkList;
void CreateList(LinkList &L, int len)//尾插法
{
int data;
LinkList p;
L=new LNode;
if(L==NULL)
{
cout<<"Fail to allocate memory!"<<endl;
exit(1);
}
L->next=NULL;
LinkList q=L;
for(int i=1; i<=len; i++)
{
p=new LNode;
if(p==NULL)
{
cout<<"Fail to allocate memory!"<<endl;
exit(1);
}
scanf("%d",&data);
p->data=data;
p->next=NULL;
L->next=p;
L=p;
}
L=q;
}
void CreateList2(LinkList &L, int len)//头插法
{
int data;
LinkList p;
L=new LNode;
if(L==NULL)
{
cout<<"Fail to allocate memory!"<<endl;
exit(1);
}
L->next=NULL;
for(int i=1; i<=len; i++)
{
p=new LNode;
if(p==NULL)
{
cout<<"Fail to allocate memory!"<<endl;
exit(1);
}
scanf("%d",&data);
p->data=data;
p->next=L->next;
L->next=p;
}
}
void Delete(LinkList &L, int k)//删除第k个节点
{
int i=0;
LinkList p=L,q;
while(i<k && p)
{
i++;
q=p;
p=p->next;
}
q->next=p->next;
free(p);
}
void insert(LinkList &L , int data, int position)//在第position位置插入data
{
int i=0;
LinkList p=L, q;
while(i<position && p)
{
i++;
q=p;
p=p->next;
}
LinkList node=new LNode;
if(node==NULL)
{
cout<<"Fail to allocate memory!"<<endl;
exit(1);
}
node->data=data;
q->next=node;
node->next=p;
}
void Traverse(LinkList L)//遍历链表
{
LinkList p=L->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void Reverse(LinkList &L)//原地逆置
{
LinkList p=L->next,q;
L->next=NULL;
while(p)
{
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
void Destory(LinkList &L)//销魂链表
{
LinkList p;
while(L)
{
p=L->next;
free(L);
L=p;
}
}
void ClearList(LinkList L)//置为空表
{
LinkList p, q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
}
int length(LinkList L)//求表长
{
int len=0;
LinkList p=L->next;
while(p)
{
len++;
p=p->next;
}
return len;
}
int IsEmpty(LinkList L)//判空
{
return NULL==L->next;
}
void MergeList(LinkList L1, LinkList &L2, LinkList &L3)//合并非递减序列
{
LinkList p1=L1->next;
LinkList p2=L2->next;
LinkList p3=L3=L1;
while(p1 && p2)
{
if(p1->data <= p2->data)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else
{
p3->next=p2;
p3=p2;
p2=p2->next;
}
}
p3->next=p1?p1:p2;
free(L2);
L2=NULL;
}
void Difference(LinkList L1, LinkList &L2, LinkList &L3)//求差集:L3=L1-L2
{
LinkList p1=L1->next;
LinkList p2=L2->next;
LinkList p3=L3=L1;
while(p1 && p2)
{
if(p1->data<p2->data)
{
p3->next=p1;
p3=p1;
p1=p1->next;
}
else if(p1->data > p2->data)
{
// p3->next=p2;
// p3=p2;
p2=p2->next;
}
else
{
p1=p1->next;
p2=p2->next;
}
}
p3->next=p1;
free(L2);
L2=NULL;
}
void Bubblesort(LinkList L)//冒泡排序
{
int len, temp;
LinkList p;
if(NULL==L->next || NULL==L->next->next)
{
printf("No enough nodes!");
return;
}
len=(length(L));
for(int i=0; i< len-1; i++)
{
p=L->next;
for(int j=0; j<len-1-i; j++)
{
if(p->data>p->next->data)
{
temp=p->data;
p->data=p->next->data;
p->next->data=temp;
}
p=p->next;
}
}
}
void main()
{
LinkList L1, L2, L3;
CreateList(L1,6);
// Bubblesort(L1);
// Traverse(L1);
CreateList(L2, 5);
Difference(L1, L2, L3);
Traverse(L3);
// CreateList(L2,4);
// MergeList(L1, L2, L3);
// Traverse(L3);
/* CreateList2(L, 5);
Traverse(L);
Delete(L, 4);
Traverse(L);
insert(L, 10, 4);
Traverse(L);
Reverse(L);
Traverse(L);
cout<<length(L)<<endl;*/
}