user-0 提问: 我写了一个用链表实现的队列，第一次入队出队列都没问题，但是之后就出问题了，无法入队列，于是我设定，如果队列为空，再初始化队列，请问我这方法会不会很烂

回复:
user: user-1
content: type struct queue_header {...} queueheader～～

user: user-1
content: 楼主的队列的len的算法或许可以有些改进： type struct queue_header {        int qlen；        struct queue *header;        struct queue *last； } header 记录头，last记录尾部，qlen记录长度 个人感觉数组实现方便些。

user: user-0
content: 引用 6 楼 liuhengxiao 的回复:看完代码我惊呆了，楼主你对指针和内存这块真的是什么都不知道啊。。。。每次调用函数你都给temp申请空间。。。  你只需要在添加节点的时候为temp申请空间，删除，计算长度都不需要再申请个空间。。。。 受教了，谢谢你的指点

user: user-2
content: 大致改了几个地方： 全局变量que放到main() temp问题 enqueue(),在que== NULL时没有free掉，但在此函数中free会造成que无法避免地成为野指针，以致在调用print()时出错，只好在main()的最后free，求高人解决一下。 #include<stdio.h> #include<stdlib.h>  struct node { 	int data; 	struct node *next; } ;  struct queue { 	struct node *front; 	struct node *rear; } ;  // enter a node to queue struct queue *initQueue() { 	struct queue *que; 	que = (struct queue*)malloc(sizeof(struct queue)); 	que->front = que->rear = NULL; 	return que; }  void enqueue(struct queue *que, int num) { 	struct node* temp = (struct node*)malloc(sizeof(struct node)); 	temp->data = num; 	temp->next= NULL; 	//-------------------------------------------------------------------------------------------- 	//    because front and rear are NULL when being initialized,so i have to distinguish this two 	//    this is the point 	//-------------------------------------------------------------------------------------------- 	if (NULL == que->rear) 		que->front = que->rear = temp; 	else 	{ 		que->rear->next = temp; 		que->rear = temp; 	} }  // destroy one node void dequeue(struct queue *que) { 	struct node *temp = que->front; 	if (temp != NULL) 	{ 		que->front = que->front->next; 		free(temp); 		temp = NULL;  		if (que->front == NULL) 		{ 			que->rear = NULL; 			//free(que); 		} 	} }  //return length of queue int length(struct queue *que) { 	struct node* temp = que->front; 	int n = 0; 	while (temp != NULL) 	{ 		++n; 		temp = temp->next; 	} 	temp = NULL; 	return n; }  //print the queue void print(struct queue *que) { 	struct node* temp = que->front; 	if (que->front == NULL) 	{ 		printf("Empty Queue!\n"); 		return; 	}  	while (temp != NULL) 	{ 		printf("%d->", temp->data); 		temp = temp->next; 	} 	printf("\n");	 	temp=NULL; }   void menu() { 	printf("---------------------------------------------------------------------------------\n"); 	printf("-------------------------------first in first out example------------------------\n"); 	printf("---------------------------------------------------------------------------------\n"); 	printf("                                 1:enter queue\n"); 	printf("                                 2:destroy queue\n"); 	printf("                                 3:print queue\n"); 	printf("                                 4:length\n"); 	printf("                                 5:clear screen\n"); 	printf("                                 0:exit\n"); 	printf("---------------------------------------------------------------------------------\n"); 	printf("---------------------------------------------------------------------------------\n"); }  int main() { 	struct queue *que; 	int choice, num; 	que = initQueue(); 	menu(); 	while(1) 	{ 		printf("please enter your choice: "); 		scanf("%d", &choice); 		switch(choice) 		{ 		case 1: 			printf("please enter a number: "); 			scanf("%d",&num); 			enqueue(que,num); 			print(que); 			break; 		case 2: 			dequeue(que); 			print(que); 			break; 		case 3: 			print(que); 			break; 		case 4: 			printf("queue's length is :%d\n",length(que)); 			break; 		case 5: 			system("clear"); 			menu(); 			break; 		case 0: 			exit(1); 		default:printf("wrong input\n"); 			break; 		} 	} 	free(que); 	return 0; }

user: user-3
content: 看完代码我惊呆了，楼主你对指针和内存这块真的是什么都不知道啊。。。。每次调用函数你都给temp申请空间。。。  你只需要在添加节点的时候为temp申请空间，删除，计算长度都不需要再申请个空间。。。。

user: user-3
content: void dequeue(struct queue *queue){     struct node* temp=(struct node*)malloc(sizeof(struct node));//这里是删除节点，不用再给temp申请空间，直接把temp指向 要删除的节点，然后free掉就可以了     if(queue->front!=NULL){         temp=queue->front;         queue->front=queue->front->next;         free(temp);         temp=NULL;     }     else printf("queue is empty\n"); }

user: user-3
content: void enqueue(struct queue *queue,int num){     struct node* temp=(struct node*)malloc(sizeof(struct node));     temp->data=num;     temp->next=NULL;     //--------------------------------------------------------------------------------------------     //    because front and rear are NULL when being initialized,so i have to distinguish this two     //    this is the point     //--------------------------------------------------------------------------------------------     if(queue->rear==NULL)         queue->front=queue->rear=temp;     else         queue->rear=queue->rear->next=temp;//notice the sequence      //    queue->rear->next=temp;     //    queue->rear=temp;     temp=NULL; //这里的temp已经加入到队列中了，你把temp又指向NULL是什么意思？本来是一个已经分配的内存空间指针，现在又找不到了，当第二个插入的时候NULL 是没有next指针的，肯定会出错的 }

user: user-4
content: 看出个错误，除了enqueue，dequeue，length，print 都不需要分配内存的