C语言实现链表队列(基本操作及图示)

————————————————————————————————————————————

基本概念:

  • 和栈相反,队列是一种先进先出(FIFO)的线性表。只允许在一端插入,在另一端删除。
  • 允许插入的叫"队尾"(rear),允许删除的叫"队头"(front)。

  • 使用场景:操作系统的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业运行。如果运行结果都需要通道输出,则按照请求输出的先后次序排队。每当通道传输完毕可以接受新的输出任务时,队头的作业先从队列中退出作输出操作。申请输出的作业都从队尾进入。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

基本操作:

/* 定义链表队列 */

struct Node //结构体存放节点

struct LinkQueue //存放队头指针和队尾指针,不存放在Node中是为了节省节点入队时占用的内存空间

/* 初始化队列 */

队头指针和队尾指针共同申请一个内存空间

节点下一节指向NULL

注意:头结点的数据为空

/* 入队操作 */

申请新节点

输入的数据elem存放在新节点数据中

新节点下一节指向NULL

尾节点的下一节点指向新节点

队尾指针指向新节点

/* 出队操作 */

节点指针p指向队头结点

队头结点指向第一节点

释放指针p指向的节点

p指向NULL //避免野指针

/* 打印操作 */

由于头节点为空,所以从第二节点开始打印,直到指向NULL时停止打印

实现代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define OK 1
 4 #define ERROE 0
 5 #define OVERFLOW -2
 6 typedef int Status;
 7 typedef int QElemType;
 8 typedef struct Node
 9 {
10     QElemType data;
11     struct Node *next;
12 } QNode;
13 /* 当链式队列的头尾节点指针定义成为一个单独的结构体,避免在新增节点时占用过多的空间 */
14 typedef struct
15 {
16     QNode *front;
17     QNode *rear;
18 } LinkQueue;
19 Status InitQueue(LinkQueue *Q)
20 {
21     Q->front = Q->rear = (QNode *)malloc(sizeof(QNode));
22     if (!Q->front)
23         exit(OVERFLOW);
24     Q->rear->next = NULL; //rear.next始终指向NULL,头结点front不动
25     return OK;
26 }
27 Status InQueue (LinkQueue *Q, int elem)
28 {
29     QNode *p;
30     p = (QNode *)malloc(sizeof(QNode));
31     p->data = elem;
32     p->next = NULL;
33     Q->rear->next = p;
34     Q->rear = p;
35     return OK;
36 }
37 Status PrintQueue(LinkQueue Q)
38 {
39     QNode *p;
40     p = Q.front->next;
41     printf("the queue is:");
42     while(p != NULL)
43     {
44         printf("%d ", p->data);
45         p = p->next;
46     }
47     return OK;
48 }
49 Status OutQueue(LinkQueue *Q)
50 {
51     QNode *p;
52     int i;
53     printf("\nthe number of out queue:");
54     scanf("%d", &i);
55     while(i != 0)
56     {
57         p = Q->front;
58         Q->front = Q->front->next;
59         free(p);
60         i--;
61     }
62     p = NULL;
63     return OK;
64 }
65 Status EmptyQueue(LinkQueue Q)
66 {
67     if (Q.front->next == NULL)
68         printf("\nThe queue is empty!\n");
69     return OK;
70 }
71 int main()
72 {
73     LinkQueue queue;
74     InitQueue(&queue);
75     int elem;
76     printf("input:");
77     while(scanf("%d", &elem) != EOF)
78     {
79         InQueue(&queue, elem);
80     }
81     PrintQueue(queue);
82     OutQueue(&queue);
83     PrintQueue(queue);
84     EmptyQueue(queue);
85     return OK;
86 }
时间: 2024-11-06 18:37:01

C语言实现链表队列(基本操作及图示)的相关文章

C语言实现链表的逆序打印

我在前面几篇博客中<C语言实现链表节点的插入><C语言实现链表节点的删除><C实现头插法和尾插法来构建链表><C语言实现链表的基本操作>实现了链表的很多增删改查操作.这里我们要来实现链表的逆序打印,使用C来实现.代码上传至 https://github.com/chenyufeng1991/ReverseLinkedList . 基本算法是: (1)使用尾插法构建原链表: (2)依次遍历原链表: (3)取出遍历中的节点使用头插法建立一个新链表: (4)打印逆

C语言实现循环队列(基本操作及图示)

-------------------------------------------- 如果使用顺序表作为队列的话,当处于右图状态则不能继续插入新的队尾元素,否则会因为数组越界而导致程序代码被破坏. 由此产生了由链表实现的循环队列,只有队列未满时才可以插入新的队尾元素. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

C语言 链队列基本操作

C语言链队列基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h> /* C语言链队列基本操作 2014年7月11日10:11:41 */ typedef int qType; typedef struct node { qType data; struct node *pNext; }Node,*pNode; typedef struct queue { pNode front; pNode re

打印菜单界面,用c语言实现二叉树的基本操作

打印菜单界面,用c语言实现二叉树的基本操作: 其代码原理和用c++实现一样,请看本人上篇博客:二叉树的先序.中序.后序遍历等基本操作c++实现,链接:http://yaoyaolx.blog.51cto.com/10732111/1783527 实现代码: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 50 //定义二叉树的二叉链表结构 typedef struct Node { char data; struct N

数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)

代码注释比较详细: #include <iostream> #include <cstdlib> using namespace std; struct Node{ int data; Node* next; }; Node* head = NULL; bool create() { head = (Node*)malloc(sizeof(Node)); if(NULL == head) return false; head->data = 0; head->next

单链表的基本操作实现

1.写这篇博文的原因 C语言有三个重要部分:流程控制.函数.指针. 对于指针,单单了解它的简单运用是远远不够的,最重要的是学习链表.所以这篇文章通过用C语言实现链表的一些基本操作和总结,希望对C语言的指针有更新的理解和认识. 2.单链表的定义 单链表是通过一组任意的存储单元来存储线性表中的数据元素,这些存储单元可以是连续的也可以是不连续的.为了建立起数据元素之间的关系,对于每个数据元素除了存放元素自身的信息外,还必须有包含指向该元素直接后继元素位置的信息,这两部分信息组成一个节点,即每个节点都有

链表队列

接下来把链表队列的代码分享给大家.因为还是链表操作,不做其他介绍. lqueue.h #ifndef _QUEUE_H #define _QUEUE_H #define MAXSIZE 10 typedef struct node { int data; struct node * next; } Node; typedef struct queue { Node * front; Node * rear; int size; } Queue; void q_init(Queue * queue

《实验课---单链表的基本操作》

//线性表---链表的基本操作#include<stdio.h>#include<stdlib.h>#include<conio.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define NULL 0typedef int Status; //函数结果状态代码typedef int ElemType; //数据元素类型//------线性表的单链表存储结构

【C/C++学院】0802-链式栈/链表队列以及优先队列/封装链表库

链式栈 // stacklinknode.h #define datatype int struct stacknode { int num;//编号 datatype data;//数据 struct stacknode *pNext;//指针域 }; typedef struct stacknode StackNode;//简化 StackNode * init(StackNode * phead);//初始化 StackNode * push(StackNode * phead, int