C语言高级进阶
队列是一种线性的数据结构,其行为类似于排队。队列通常支持两种主要的操作:入队和出队。 入队操作把数据元素添加到队列中,出队操作从队列中删除数据元素。一般来说,队列的操作遵循先进先出(FIFO)原则,即第一个添加到队列中的元素也是第一个离开队列的元素。学习内容
此章我们学习如何创建和使用队列这种线性数据结构。 实现队列经常用到链表,入队操作就是将节点添加到链表头,出队操作就是从链表尾删除节点。学习产出
队的创建和使用如下示例://Queue Illustrated
typedef struct _employee
{
char* name;
unsigned char age;
}Employee;
int compareEmployee(Employee* e1, Employee* e2)
{
return strcmp(e1->name, e2->name);
}
void displayEmployee(Employee* employee)
{
printf("%s\t%d\n", employee->name, employee->age);
}
typedef void(*DISPLAY)(void *);
typedef int(*COMPARE)(void*, void*);
typedef struct _node
{
void* data;
struct _node* next;
}Node;
typedef struct _linkedList
{
Node* head;
Node* tail;
Node* current;
}Linkedlist;
void initializeList(Linkedlist*);
void addHead(Linkedlist*, void*);
void addTail(Linkedlist*, void*);
void delete(Linkedlist*, Node*);
Node* getNode(Linkedlist*, COMPARE, void*);
void displayLinkedList(Linkedlist*, DISPLAY);
void initializeList(Linkedlist* list)
{
list->head = NULL;
list->tail = NULL;
list->current = NULL;
}
void addHead(Linkedlist* list, void* data)
{
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
if(list->head == NULL)
{
list->tail = node;
node->next = NULL;
}
else
{
node->next = list->head;
}
list->head = node;
}
typedef Linkedlist Queue;
void initializeQueue(Queue* queue)
{
initializeList(queue);
}
void enqueue(Queue* queue, void* node)
{
addHead(queue, node);
}
void* dequeue(Queue* queue)
{
Node* tmp = queue->head;
void* data;
if(queue->head == NULL)
{
data = NULL;
}
else if(queue->head == queue->tail)
{
queue->head = queue->tail = NULL;
data = tmp->data;
free(tmp);
tmp = NULL;
}
else
{
while(tmp->next != queue->tail)
{
tmp = tmp->next;
}
queue->tail = tmp;
tmp = tmp->next;
queue->tail->next = NULL;
data = tmp->data;
free(tmp);
tmp = NULL;
}
return data;
}
int main()
{
Queue queue;
initializeQueue(&queue);
Employee* e1 = (Employee*)malloc(sizeof(Employee));
e1->name = "TomCat";
e1->age = 13;
Employee* e2 = (Employee*)malloc(sizeof(Employee));
e2->name = "KittyMouse";
e2->age = 16;
Employee* e3 = (Employee*)malloc(sizeof(Employee));
e3->name = "BabyFish";
e3->age = 10;
enqueue(&queue, e1);
enqueue(&queue, e2);
enqueue(&queue, e3);
void* data = dequeue(&queue);
printf("Dequeued1: %s\n", ((Employee*)data)->name);
data = dequeue(&queue);
printf("Dequeued2: %s\n", ((Employee*)data)->name);
data = dequeue(&queue);
printf("Dequeued3: %s\n", ((Employee*)data)->name);
return 0;
}
运行结果如下: