C 队列


头文件

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



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值