#include
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
bool InitList(LinkList &L);
void DestoryList(LinkList &L);
int InsertList(LinkList &L,int i,int e);
int InsertNextNode(LNode*p ,int e);
int InsertPriorNode(LNode* p,int e);
int DeleteList(LinkList &L,int i,int &e);
int DeleteNode(LNode*p);
int AlterList(LinkList &L,int i,int e);
LNode* GetElem(LinkList L,int i);
LNode* LocatedElem(LinkList L,int e);
int Length(LinkList L);
bool IsEmpty(LinkList L);
void PrintList(LinkList L);
LinkList ListInsertTail(LinkList&L);
LinkList ListInsertHead(LinkList&L);
void MergeIncrease(LinkList &A,LinkList &B,LinkList &C);
void MergeDecrease(LinkList &A,LinkList&B,LinkList&C);
int FindAndDelete(LinkList&L,int i);
void DeleteDuplicate(LinkList &L);
void DeleteMin(LinkList &L);
void ReverseList(LinkList &L);
void Split(LinkList&A,LinkList&B);
void RePrintList(LinkList&L);
int FindKLast(LinkList&L,int k);
int main() {
LinkList L;
L=ListInsertTail(L);
PrintList(L);
RePrintList(L);
PrintList(L);
return 0;
}
bool InitList(LinkList &L)
{
L=(LNode*)malloc(sizeof(LNode));
if(L==NULL)return false;
L->next=NULL;
return true;
}
void DestoryList(LinkList &L)
{
free(L);
}
int InsertList(LinkList &L,int i,int e)
{
LNode*p=GetElem(L,i-1);
InsertNextNode(p,e);
}
int InsertNextNode(LNode*p ,int e)
{
if(p==NULL)return 0;
LNode*q=(LNode*)malloc(sizeof(LNode));
q->data=e;
q->next=p->next;
p->next=q;
return 1;
}
int InsertPriorNode(LNode* p,int e)
{
if(p=NULL)return 0;
LNode* q=(LNode*)malloc(sizeof(LNode));
q->next=p->next;
p->next=q;
q->data=p->data;
p->data=e;
return 1;
}
int DeleteList(LinkList &L,int i,int &e)
{
LNode*p=GetElem(L,i);
return DeleteNode(p);
}
int DeleteNode(LNode*p)
{
if(p==NULL)return 0;
LNode*q=p->next;
p->data=q->data;
p->next=q->next;
free(q);
return 1;
}
int AlterList(LinkList &L,int i,int e)
{
if(i<1)return 0;
LNode*p;
int j=0;
p=L;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(p==NULL)return 0;
p->data=e;
return 1;
}
LNode* GetElem(LinkList L,int i)
{
if(i<1)return NULL;
LNode* p;
int j=0;
p=L;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(j<i-1)
p=NULL;
return p;
}
LNode* LocatedElem(LinkList L,int e)
{
LNode*p=L;
while(p->next!=NULL&&p->data!=e)
p=p->next;
return p;
}
int Length(LinkList L)
{
LNode*p=L;
int len=0;
while(p->next!=NULL)
{p=p->next;
len++;}
return len;
}
bool IsEmpty(LinkList L)
{
if(Length(L)==0)return true;
return false;
}
void PrintList(LinkList L)
{
LNode*p=L;
int len=Length(L);
for(int i=0;i<len;i++)
{
p=p->next;
cout<<p->data<<endl;
}
}
LinkList ListInsertTail(LinkList&L)
{
int x;
L=(LNode*)malloc(sizeof(LNode));
LNode*s,*t=L;
scanf("%d",&x);
while(x!=9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
t->next=s;
t=s;
scanf("%d",&x);
}
t->next=NULL;
return L;
}
LinkList ListInsertHead(LinkList&L)
{
LNode*s;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
int x;
scanf("%d",&x);
while(x=!9999)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
void MergeIncrease(LinkList &A,LinkList &B,LinkList &C)
{
LNode*p=A->next;
LNode*q=B->next;
LNode*r;
C=A;
C->next=A;
free(B);
r=C;
while(p!=NULL&&q!=NULL)
{
if(p->data<q->data)
{
r->next=p;
p=p->next;
r=r->next;
}
else
{
r->next=q;
q=q->next;
r=r->next;
}
}
if(p!=NULL)
r->next=p;
if(q!=NULL)
r->next=q;
}
void MergeDecrease(LinkList &A,LinkList&B,LinkList&C)
{
LNode*p=A->next;
LNode*q=B->next;
C=A;
C->next=NULL;
LNode *r;
free(B);
while(q!=NULL&&p!=NULL)
{
if(p->data<=q->data)
{
r=p;
p=p->next;
r->next=C->next;
C->next=r;
}
else
{
r=q;
q=q->next;
r->next=C->next;
C->next=r;
}
}
while(p!=NULL)
{
r=p;
p=p->next;
r->next=C->next;
C->next=r;
}
while(q!=NULL)
{
r=q;
q=q->next;
r->next=C->next;
C->next=r;
}
}
int FindAndDelete(LinkList&L,int i)
{
LNode*p=L->next;
while(p!=NULL) {
if (p->data != i)
p = p->next;
break;
}
if(p==NULL)return 0;
LNode*q=p->next;
p->data=q->data;
p->next=q->next;
free(q);
return 1;
}
void DeleteDuplicate(LinkList &L)
{
LNode*p,*q;
p=L->next;
while(p->next!=NULL)
{
if(p->data==p->next->data)
{
q=p->next;
p->next=q->next;
free(q);
}
else
p=p->next;
}
}
void DeleteMin(LinkList &L)
{
LNode*p=L->next;
LNode*prep=L;
LNode*min=L->next;
LNode* premin=L;
while(p!=NULL)
{
if(p->data<min->data)
{
min=p;
premin=prep;
}
prep=p;
p=p->next;
}
premin->next=min->next;
free(min);
}
void ReverseList(LinkList &L)
{
LNode*p,*q;
p=L->next;
L->next=NULL;
while(p!=NULL)
{
q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
void Split(LinkList&A,LinkList&B)
{
LNode*p,*q,*r;
B=(LinkList)malloc(sizeof(LNode));
B->next=NULL;
p=A;
r=B;
while (p != NULL) {
if (p->next->data%2 == 0) {
q = p->next;
p->next = p->next->next;
r->next = q;
r = q;
q->next = NULL;
} else {
p = p->next;
}
}
}
void RePrintList(LinkList &L)
{
LNode*p=L->next;
if(p!=NULL)
{
RePrintList(p);
printf("---%d\n",p->data);
}
}
int FindKLast(LinkList&L,int k)
{
LNode*p,*q;
p=L->next;
q=L;
int i=1;
while(p!=NULL)
{
p=p->next;
i++;
if(i>k)q=q->next;
}
if(q==L)return 0;
else {
printf("%d",q->data);
return 1;
}
}