69,381
社区成员
发帖
与我相关
我的任务
分享
#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;
}
#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;
}
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");
}
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指针的,肯定会出错的
}