#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; }
时间: 2024-10-17 11:13:12