表示形式
队列的链表形式与单链表类似,只不过多了两个结点来保存首位结点
一,关于链栈的结构体表示
结构体定义
第一种定义方法
struct Node
{
int data; //数据域
Node *front; //头
Node *rear; //尾
Node *next; //下一个
};
第二种定义方法
struct Node
{
int data; //数据域
Node *next; //下一个
};
struct List
{
Node *front; //尾
Node *rear; //头
};
图解
由图可以得知
- 因为是链表结构,所以是无限制的
- 判断队列为空的情况是,S->front == S->rear
队列的链式的定义
Node *Init()
{
Node *S = new Node;
S->front = S->rear=new Node;
S->front->next = NULL;
return S;
}
此时定义一个名为S的链表,然后将其中的front和rear都定义为空
入队
Node *Enter(Node *S)
{
Node *P = new Node;
cout << "输入将要入队列的值:";
cin>>P->data;
P->next = NULL;
S->rear->next = P;
S->rear = P;
return S;
}
定义一个新节点,然后将新节点赋值给队列的头。
出队
Node * Delete(Node *S)
{
if (S->front != S->rear)
{
S->front = S->front->next;
return S;
}
else
{
cout << "队列为空";
return 0;
}
}
即将队列尾指向队列尾下一个:即
S->front = S->front->next;
显示队列头
void Show(Node *S)
{
cout << "队头元素为:";
cout << S->front->next->data << endl;
}
因为链表的头指向的是空,所以显示出头的下一个元素,即
S->front->next->data
第一种代码实现
#include<iostream>
using namespace std;
#define MaxSize 20
struct Node
{
int data; //数据域
Node *front; //尾
Node *rear; //头
Node *next; //下一个
};
Node *Init()
{
Node *S = new Node;
S->front = S->rear=new Node;
S->front->next = NULL;
return S;
}
Node *Enter(Node *S)
{
Node *P = new Node;
cout << "输入将要入队列的值:";
cin>>P->data;
P->next = NULL;
S->rear->next = P;
S->rear = P;
return S;
}
Node * Delete(Node *S)
{
if (S->front != S->rear)
{
S->front = S->front->next;
return S;
}
else
{
cout << "队列为空";
return 0;
}
}
void Show(Node *S)
{
cout << "队头元素为:";
cout << S->front->next->data << endl;
}
int main()
{
Node *S = Init();
S=Enter(S);
S=Enter(S);
S=Enter(S);
Show(S);
S=Delete(S);
Show(S);
system("pause");
}
第二种代码实现
#include<iostream>
using namespace std;
#define MaxSize 20
struct Node
{
int data; //数据域
Node *next; //下一个
};
struct List
{
Node *front; //尾
Node *rear; //头
};
List *Init()
{
List *S = new List;
S->front = S->rear=new Node;
S->front->next = NULL;
return S;
}
List *Enter(List *S)
{
Node *P = new Node;
cout << "输入将要入队列的值:";
cin>>P->data;
P->next = NULL;
S->rear->next = P;
S->rear = P;
return S;
}
List* Delete(List *S)
{
if (S->front != S->rear)
{
S->front = S->front->next;
return S;
}
else
{
cout << "队列为空";
return 0;
}
}
void Show(List *S)
{
cout << "队头元素为:";
cout << S->front->next->data << endl;
}
int main()
{
List *S = Init();
S=Enter(S);
S=Enter(S);
S=Enter(S);
Show(S);
S=Delete(S);
Show(S);
system("pause");
}