队列接口声明:
#ifndef __LINKLIST_QUEUE_H_
#define __LINKLIST_QUEUE_H_
struct unit {
char data;
struct unit* punit;
};
struct linklistqueue {
int size;
struct unit* phead;
struct unit* ptail;
void(*pfunenqueue)(struct linklistqueue* pqueue, char value);
char(*pfundequeue)(struct linklistqueue* pqueue);
void(*pfuntraverse)(struct linklistqueue* pqueue);
};
void linklistenqueue(struct linklistqueue* pqueue, char value);
char linklistdequeue(struct linklistqueue* pqueue);
void linklistqueuetraverse(struct linklistqueue* pqueue);
#endif
队列接口实现:
#include "linklist_queue.h"
#include <stdlib.h>
#include <stdio.h>
void linklistenqueue(struct linklistqueue* pqueue, char value)
{
struct unit* pnew = (struct unit*)malloc(sizeof(struct unit));
if(NULL == pnew)
{
printf("create unit error for enqueue\n");
return;
}
pnew->punit = NULL;
pnew->data = value;
if(NULL == pqueue->phead)
{
pqueue->ptail = pnew;
pqueue->phead = pnew;
}
else
{
pqueue->ptail->punit = pnew;
pqueue->ptail = pnew;
}
pqueue->size++;
}
char linklistdequeue(struct linklistqueue* pqueue)
{
if(NULL == pqueue->phead)
{
pqueue->ptail = NULL;
printf("empty queue dequeue error\n");
return -1;
}
struct unit* ptemp = pqueue->phead;
char temp = ptemp->data;
pqueue->phead = pqueue->phead->punit;
free(ptemp);
pqueue->size--;
if(0 == pqueue->size)
{
pqueue->ptail == NULL;
}
return temp;
}
void linklistqueuetraverse(struct linklistqueue* pqueue)
{
struct unit* phead = pqueue->phead;
while(phead)
{
printf("%c | ", phead->data);
phead = phead->punit;
}
printf("\n");
}
测试函数:
#include "linklist_queue.h"
#include <stdio.h>
int main()
{
int i = 0;
char c;
struct linklistqueue queue1;
queue1.size = 0;
queue1.phead = NULL;
queue1.ptail = NULL;
queue1.pfunenqueue = linklistenqueue;
queue1.pfundequeue = linklistdequeue;
queue1.pfuntraverse = linklistqueuetraverse;
for(i = 0; i < 100; i++)
{
//scanf("%c", &c);
c = getchar();
if('c' == c)
{
queue1.pfuntraverse(&queue1);
}
else if ('-' != c && '\n' != c)
{
queue1.pfunenqueue(&queue1, c);
printf("after enqueue, queue size is:%d, input char is:%c\n", queue1.size, c);
}
else if('-' == c)
{
printf("after dequeue, queue size is:%d, output char is:%c\n", queue1.size, queue1.pfundequeue(&queue1));
}
else if('\n' == c)
{
continue;
}
//printf("count i = %d\n", i);
}
printf("test successfully\n");
return 0;
}