C语言 c语言中使用链表实现队列
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17320096/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Implementation of queue using linked list in c
提问by user2227862
I am trying to implement queue using a linked list. I am using the following code but my display function is not working properly:
我正在尝试使用链表实现队列。我正在使用以下代码,但我的显示功能无法正常工作:
What is wrong with my code?
我的代码有什么问题?
My Code:
我的代码:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int info;
struct node *link;
}*front=NULL,*rear=NULL;
void insert(int item);
int del();
int peek();
int isEmpty();
void display();
main()
{
int choice,item;
while(1)
{
printf("1.Insert\n");
printf("2.Delete\n");
printf("3.Display the element at the front\n");
printf("4.Display all elements of the queue\n");
printf("5.Quit\n");
printf("Enter your choice : ");
scanf("%d", &choice);
switch(choice)
{
case 1:
printf("Input the element for adding in queue : ");
scanf("%d",&item);
insert(item);
break;
case 2:
printf("Deleted element is %d\n",del());
break;
case 3:
printf("Element at the front of the queue is %d\n", peek() );
break;
case 4:
display();
break;
case 5:
exit(1);
default :
printf("Wrong choice\n");
}
}
}
void insert(int item)
{
struct node *tmp;
tmp=(struct node *)malloc(sizeof(struct node));
if(tmp==NULL)
{
printf("Memory not available\n");
return;
}
tmp->info = item;
tmp->link=NULL;
if(front==NULL) /*If Queue is empty*/
front=tmp;
rear=tmp;
}
int del()
{
struct node *tmp;
int item;
if( isEmpty( ) )
{
printf("Queue Underflow\n");
exit(1);
}
tmp=front;
item=tmp->info;
front=front->link;
free(tmp);
return item;
}
int peek()
{
if( isEmpty( ) )
{
printf("Queue Underflow\n");
exit(1);
}
return front->info;
}
int isEmpty()
{
if(front==NULL)
return 1;
else
return 0;
}
void display()
{
struct node *ptr;
ptr=front;
if(isEmpty())
{
printf("Queue is empty\n");
return;
}
printf("Queue elements :\n\n");
while(ptr!=NULL)
{
printf("%d ",ptr->info);
ptr=ptr->link;
}
printf("\n\n");
}
回答by Some programmer dude
Your insertfunction doesn't link the new nodes into the list properly. You just set the tail to point to the new node, but you don't make the previous tail node link point to the new tail.
您的insert函数没有将新节点正确链接到列表中。您只需将尾部设置为指向新节点,但不要使之前的尾部节点链接指向新的尾部。
回答by poorvank
Modify your insert function as:
将您的插入功能修改为:
if(front==NULL) /*If Queue is empty*/
front=tmp;
else
rear->link = tmp;
/*The above statement would link the the previous node to the newly created node*/
rear=tmp;
回答by rashedcs
Enqueue Algorithm :
1. Create a newNode with data and address.
2. if queue i.e front is empty
i. front = newnode;
ii. rear = newnode;
3. Else
i.rear->next = newnode;
ii.rear = newnode;
Dequeue Algorithm :
1. if queue is i.e front is NULL printf("\nQueue is Empty \n");
2. Else next element turn into front
i. struct node *temp = front ;
ii. front = front->next;
iii.free(temp);
C programming implementation :
C编程实现:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
node *next;
};
node *front = NULL;
node *rear =NULL;
node *creation(int data)
{
tmp=(struct node *)malloc(sizeof(struct node));
tmp->data = data;
tmp->next=NULL;
return tmp;
}
void Insert(int item)
{
struct node *newnode = creation(item);
if(front==NULL)
{
front = rear = newnode;
}
else
{
rear->next = newnode;
rear = newnode;
}
}
void Delete()
{
struct node *temp;
if (front == NULL)
{
printf("\nQueue is Empty \n");
return;
}
else
{
temp = front;
front = front->next;
if(front == NULL) rear = NULL;
free(temp);
}
}
void display()
{
struct node *temp=front;
if(front == NULL)
{
printf("Queue is Overflow\n");
}
else
{
printf("Queue is :\n");
while(temp != NULL)
{
printf("%d ", temp->data);
temp = temp->next;
}
}
printf("\n");
}

