头文件
/* * 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代码注重的不仅仅是逻辑,而且还需要注重内存的分配,,,也许现在代码还是有许许多多的问题,但我相信总有一天会改得更好。之前的队列出现了太多问题,所以在这里重新修改了一遍,供以后参考。