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

来源:互联网 发布:2017淘宝加权重刷法 编辑:程序博客网 时间:2024/04/19 15:08

定义一个节点,里面包含元素类型,指向下一个节点的指针。然后定义一个结构体,里面两个指针,指向队头和队尾

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;}


阅读全文
1 0