struct RandQueueNode
{
int data;
int index;
struct RandQueueNode* next;
};
typedef struct RandQueueNode* RandQueueLink;
void RandLinkInital();
void RandLinkPushBack(int);
int RandLinkPopRear();
void RandLinkFree();
RandQueueLink header,tail;
int gIndex;
int *gRandLink;
int gCount = 100;
void RandLinkInital()
{
gRandLink = (int*)malloc(sizeof(int)*gCount);
if (!gRandLink)
{
printf("create failed");
return;
}
memset(gRandLink, 0, sizeof(int)*gCount);
header = tail = NULL;
gIndex= 0;
}
static RandQueueLink NewNode(int aElement)
{
RandQueueLink x = (RandQueueLink)malloc(sizeof(*x));
if (!x)
{
printf("NewNode failed");
return NULL;
}
gIndex +=1;
if (gIndex >= gCount)
{
gRandLink = realloc(gRandLink, sizeof(int)*(gIndex + gCount/2));
if (!gRandLink)
{
printf("realloc failed");
return NULL;
}
gCount = gIndex + gCount/2;
}
x->data = aElement;
x->index = gIndex;
gRandLink[gIndex] = gIndex;
return x;
}
void RandLinkPushBack(int aElement)
{
if (!tail)
{
tail = NewNode(aElement);
if (!tail)
{
return;
}
tail->next = NULL;
header = tail;
return;
}
RandQueueLink x = NewNode(aElement);
if (!x)
{
return;
}
x->next = NULL;
tail->next = x;
tail = x;
}
int RandLinkPopRear()
{
if (--gIndex < 0)
{
return -1;
}
srand((unsigned)(time(NULL)));
int flag = 0;
int index = -1;
do
{
index = rand()%(gCount+1);
flag = gRandLink[index];
} while (!flag);
int temp = -1;
if (flag)
{
RandQueueLink p = header,q = NULL;
while (p&&(p->index != flag))
{
q = p;
p = p->next;
}
RandQueueLink tempLink = NULL;
if (p == header)
{
tempLink = header;
temp = tempLink->data;
header = header->next;
free(tempLink);
}
else
{
tempLink = q->next;
q->next = p->next;
temp = tempLink->data;
free(tempLink);
}
gRandLink[flag] = 0;
}
return temp;
}
void RandLinkFree()
{
free(gRandLink);
RandQueueLink p,tempLink = header;
while (tempLink)
{
p = tempLink;
tempLink = tempLink->next;
free(p);
}
}