单链表实现一个随机队列

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);

    }

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值