#include<iostream>
#include <iomanip>
#include"windows.h"
using namespace std;
struct StaticLinkNode
{
int data;
int next;
};
struct StaticLink
{
StaticLinkNode* nodes;
int maxCnt;
int cnt;
};
StaticLink createStaticLink(int max)
{
StaticLink p;
p.nodes=new StaticLinkNode[max+2];
for(int i=0;i<max;i++)
p.nodes[i].next=i+1;
p.nodes[max].next=0;
p.nodes[max+1].next=0;
p.maxCnt=max;
p.cnt=0;
return p;
}
int getSpare(StaticLink* p)
{
int first = (*p).nodes[0].next;
if(first!=0)
(*p).nodes[0].next = (*p).nodes[first].next;
return first;
}
void releaseToSpare(StaticLink* p,int i)
{
int first = (*p).nodes[0].next;
(*p).nodes[i].next=first;
(*p).nodes[0].next=i;
}
bool add(StaticLink* p,int i,int value)
{
int target =getSpare(p);
if(target==0)
return 0;
int first =(*p).maxCnt+1;
for(int j=0;j<i-1 && first;j++)
first = (*p).nodes[first].next;
if(first!=0)
{
(*p).nodes[target].data=value;
(*p).nodes[target].next = (*p).nodes[first].next;
(*p).nodes[first].next=target;
(*p).cnt++;
return 1;
}
return 0;
}
bool remove(StaticLink* p,int i)
{
int first =(*p).maxCnt+1;
if(first==0)
return 0;
for(int j=0;j<i-1 && (*p).nodes[first].next;j++)
first = (*p).nodes[first].next;
if((*p).nodes[first].next)
{
int t=(*p).nodes[first].next ;
(*p).nodes[first].next = (*p).nodes[(*p).nodes[first].next].next;
releaseToSpare(p,t);
(*p).cnt--;
return 1;
}
return 0;
}
void output(StaticLink* p)
{
int first =(*p).nodes[(*p).maxCnt+1].next;
while(first!=0)
{
cout<<(*p).nodes[first].data<<" ";
first=(*p).nodes[first].next;
}
cout<<endl;
}
void main()
{
int max=28;
StaticLink p= createStaticLink(28);
for(int i=0;i<15;i++)
{
int x = rand()%100;
cout<<x<<" ";
add(&p,p.cnt+1,x);
}
cout<<endl;
output(&p);
add(&p,2,45);
output(&p);
add(&p,1,55);
output(&p);
add(&p,p.cnt,65);
output(&p);
add(&p,p.cnt+1,75);
output(&p);
remove(&p,2);
output(&p);
remove(&p,1);
output(&p);
remove(&p,p.cnt);
output(&p);
remove(&p,p.cnt+1);
output(&p);
cin>>max;
}