您的位置:首页 > 其它

链队列的简单操作(入队,出队,输出队元素等)

2017-10-27 22:59 543 查看
定义一个节点,里面包含元素类型,指向下一个节点的指针。然后定义一个结构体,里面两个指针,指向队头和队尾

typedef struct QNode {
int data;
struct QNode * next;
}QNode, * Queue;

typedef struct {
Queue front;
Queue rear;
}LinkQueue;
入队操作要注意别动指向队头的front指针,如果是q->front->next = p那每次就会插到队头。而队列是队头出,队尾进。也不要忘了新节点p->next = NULL;
void EnQueue(LinkQueue * q, int x)
{
Queue p = (Queue)malloc(sizeof(QNode));
if (!p) {
printf("无内存空间可分配\n");
}

p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}

出队别忘了最后的判断是否头尾指向了一个节点
void DeQueue(LinkQueue * q)
{
QNode * p;
if (IsEmpty(&q)) {
printf("空列\n");
}

p = q->front->next;
q->front->next = p->next;
if (q->rear == p) q->rear = q->front;
free(p);
printf("出队成功\n");
}


输出队列元素,首先判断是否为空。不要动队头和队尾指针,否则你移动了了个指针就破坏了队列结构,你将队头指针的地址告诉节点指针,让节点进行遍历,从而进行保护

void print(LinkQueue * q)
{
QNode * p = q->front->next;

if (IsEmpty(&q)) {
printf("空队\n");
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n\n");
}

具体实现如下

#include<stdio.h>
#include<stdlib.h>

typedef struct QNode {
int data;
struct QNode * next;
}QNode, * Queue;

typedef struct {
Queue front;
Queue rear;
}LinkQueue;

void InitialQueue(LinkQueue * q)
{
q->front = q->rear = (Queue)malloc(sizeof(QNode));
if (!q->front) {
printf("无内存空间可分配\n");
}
q->front->next = NULL;
printf("初始化成功\n");
}

void EnQueue(LinkQueue * q, int x)
{
Queue p = (Queue)malloc(sizeof(QNode));
if (!p) {
printf("无内存空间可分配\n");
}

p->data = x;
p->next = NULL;
q->rear->next = p;
q->rear = p;
}

int IsEmpty(LinkQueue * q)
{
return (q->front== q->rear)?1:0;
}

void DeQueue(LinkQueue * q) { QNode * p; if (IsEmpty(&q)) { printf("空列\n"); } p = q->front->next; q->front->next = p->next; if (q->rear == p) q->rear = q->front; free(p); printf("出队成功\n"); }

void DesQueue(LinkQueue * q)
{
while (q->front) {
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
printf("销毁成功\n");
exit(1);
}

void print(LinkQueue * q)
{
QNode * p = q->front->next;

if (IsEmpty(&q)) {
printf("空队\n");
}
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n\n");
}

int main(void)
{
LinkQueue queue;
int num, flag;
InitialQueue(&queue);

while (scanf("%d", &num)) {
EnQueue(&queue, num);
}
getchar();

printf("1.入队 2.出队\n");
printf("3.判断队是否为空 4.输出队列 5.销毁队列 6.退出\n");
while (scanf("%d", &flag) && flag != 6) {
switch (flag) {
case 1: printf("输入入队元素:");scanf("%d", &num);EnQueue(&queue, num);break;
case 2: DeQueue(&queue);break;
case 3: printf("%s\n\n", IsEmpty(&queue)==1?"空队":"非空队");break;
case 4: print(&queue);break;
case 5: DesQueue(&queue);break;
default: printf("请输入合法操作!\n\n");break;
}
printf("1.入队 2.出队\n");
printf("3.判断队是否为空 4.输出队列 5.销毁队列 6.退出\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐