头文件
/*
* Queues.h
*
* Created on: 2013-5-28
* Author: inner
*/
#ifndef QUEUES_H_
#define QUEUES_H_
typedef int QElemType;
typedef struct Queue{
QElemType elem;
struct Queue *next;
}*QueuePtr,QNode;
typedef struct {
QueuePtr front;//队头指针
QueuePtr tear;//尾指针
}SqQueue;
//初始化队列
void InitQueue(SqQueue *q);
//入队
void EnQueue(SqQueue *q,QElemType elm);
//入栈
void DeQueue(SqQueue *q);
//清栈
void ClearQueue(SqQueue *q);
//队列的销毁
void DestroyQueue(SqQueue *q);
#endif /* QUEUES_H_ */
源文件
代码的实现关键看指针内存的分配,,,和指针所指向的地址。
/*
* QueueMake.c
*
* Created on: 2013-5-28
* Author: inner
*/
#include<stdio.h>
#include<stdlib.h>
#include"Queues.h"
void InitQueue(SqQueue *q){
q->front =q->tear =(QueuePtr)malloc(sizeof(QNode));
if(!q->front&&!q->tear)
exit(0);
q->front->next = NULL;//给头尾指针初始化赋值空值
printf("初始化成功\n");
}
void EnQueue(SqQueue *q,QElemType elm){
QueuePtr p =(QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(0);
p->elem = elm;
q->tear->next = p;
p->next =NULL;
q->tear = p;
printf("进队%d\n",q->tear->elem);
}
void DeQueue(SqQueue *q){
if(q->front==q->tear){
printf("队列已空\n");
return;
}
QueuePtr p =q->front->next;
q->front->next = p->next;
if(p->next==NULL)
q->tear = q->front;
printf("出队%d\n",p->elem);
free(p);
}
void ClearQueue(SqQueue *q){
while(q->front){
DeQueue(q);
}
}
void DestroyQueue(SqQueue *q){
int i= 1;
while(q->front){
q->tear = q->front->next;
free(q->front);
q->front = q->tear;
printf("%d",i++);
}
}
队列的测试
int main(void) {
SqQueue s;
InitQueue(&s);
EnQueue(&s,5);
EnQueue(&s,4);
EnQueue(&s,3);
EnQueue(&s,5);
EnQueue(&s,4);
EnQueue(&s,3);
ClearQueue(&s);
DestroyQueue(&s);
InitQueue(&s);
EnQueue(&s,5);
EnQueue(&s,4);
DeQueue(&s);
return EXIT_SUCCESS;
}
结果
初始化成功
进队5
进队4
进队3
进队5
进队4
进队3
栈销毁
初始化成功
进队5
进队4
出队5
写在数据结构的话
当初年少不知,以为代码可以运行了就可以了。。。。。随着慢慢的深入,才发现写c代码注重的不仅仅是逻辑,而且还需要注重内存的分配,,,也许现在代码还是有许许多多的问题,但我相信总有一天会改得更好。之前的队列出现了太多问题,所以在这里重新修改了一遍,供以后参考。