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

宇宙全能王 2014-04-16 08:27:46

#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 *que;
void init(){
que=(struct queue*)malloc(sizeof(struct queue));
que->front=que->rear=NULL;
}
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;
}
// destroy one node
void dequeue(struct queue *queue){
struct node* temp=(struct node*)malloc(sizeof(struct node));
if(queue->front!=NULL){
temp=queue->front;
queue->front=queue->front->next;
free(temp);
temp=NULL;
}
else printf("queue is empty\n");
}
//return length of queue
int length(struct queue *queue){
struct node* temp=(struct node*)malloc(sizeof(struct node));
temp=queue->front;
int length=0;
while(temp!=NULL){
length++;
temp=temp->next;
}
temp=NULL;
return length;
}
//print the queue
void print(struct queue *queue){
struct node* temp=(struct node*)malloc(sizeof(struct node));
temp=queue->front;
if(temp!=NULL){
while(temp!=NULL){
printf("%d--> ",temp->data);
temp=temp->next;
}
printf("\n");
temp=NULL;
}
else init();//if queue is empty , then initial the queue
}

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(){
init();
system("clear");
int choice,num;
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;
}
}
return 0;
}
...全文
181 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gojoy_x13 2014-04-17
  • 打赏
  • 举报
回复
type struct queue_header {...} queueheader~~
gojoy_x13 2014-04-17
  • 打赏
  • 举报
回复
楼主的队列的len的算法或许可以有些改进: type struct queue_header { int qlen; struct queue *header; struct queue *last; } header 记录头,last记录尾部,qlen记录长度 个人感觉数组实现方便些。
宇宙全能王 2014-04-17
  • 打赏
  • 举报
回复
引用 6 楼 liuhengxiao 的回复:
看完代码我惊呆了,楼主你对指针和内存这块真的是什么都不知道啊。。。。每次调用函数你都给temp申请空间。。。 你只需要在添加节点的时候为temp申请空间,删除,计算长度都不需要再申请个空间。。。。
受教了,谢谢你的指点
Hardworking2009 2014-04-17
  • 打赏
  • 举报
回复
大致改了几个地方: 全局变量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;
}
我还在迷路 2014-04-17
  • 打赏
  • 举报
回复
看完代码我惊呆了,楼主你对指针和内存这块真的是什么都不知道啊。。。。每次调用函数你都给temp申请空间。。。 你只需要在添加节点的时候为temp申请空间,删除,计算长度都不需要再申请个空间。。。。
我还在迷路 2014-04-17
  • 打赏
  • 举报
回复
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");
}
我还在迷路 2014-04-17
  • 打赏
  • 举报
回复
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指针的,肯定会出错的
}
mangoalx 2014-04-16
  • 打赏
  • 举报
回复
看出个错误,除了enqueue,dequeue,length,print 都不需要分配内存的

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧