1. 程式人生 > >C語言 佇列的鏈式結構的實現與表示 資料結構 佇列的實現與表示

C語言 佇列的鏈式結構的實現與表示 資料結構 佇列的實現與表示

  五一放假,也沒有什麼事情可以做的,本來想出去玩一玩或者打打球什麼的,可是天公不作美,這兩天天氣一直是在下雨,弄的人的心情溼透了。

 昨天學習了一天的棧和佇列,昨天在下午些的時候完成了棧的程式設計工作。晚上本應該是用來寫完佇列的程式的,可是晚上到寢室熄燈之前只是差一點程式就可以全部完工了,可是總是有幾個小bug除錯不過去。沒辦法,今天上午又花了一個小時才完工。

 艾,不過總算寫完了,對於資料結構中的佇列有了一個更加清新的認識。

好啦,不廢話了,還是和以前一樣把,把程式碼和大家一起分享把!

如果程式碼中有什麼錯誤,希望您不吝賜教,您可以把您的意見傳送到[email protected]

,我會盡快給您回覆的。

C語言 佇列的鏈式結構的實現與表示 資料結構 佇列的表示與實現

/****************************************/
/*Description: Link Queue*/
/*Email:[email protected]*/
/*Author:yi_landry Harbin Normal University Computer Science*/
/*Date:2008-5-1*/
/*Copyright:HNU2008.cop*/
/*Environment:turbo c 2.01 English Version*/
/****************************************/
# include<stdlib.h>
# include<stdio.h>
# define OVERFLOW 0
# define OK 1
/****************************************/
/*The node of link queue */
/****************************************/
struct LqNode
{
  int item;
  struct LqNode * next;
};

/****************************************/
/*The struct of link queue */
/****************************************/
struct LqQueue
{
  struct LqNode * front;/*the head pointer of the link queue*/
  struct LqNode * rear;/*the tail pointer of the link queue*/
  int length;/*the total number of the nodes in the queue*/
}Q;
/****************************************/
/*Initial the queue*/
/****************************************/
InitQueue(struct LqQueue * Q)
{
  Q->front=Q->rear=(struct LqNode *)malloc(sizeof(struct LqNode));
  if (!Q->front && !Q->rear) exit(OVERFLOW);
  Q->length = 0;
  printf("Initial the link queue successfully!/n");
}
/****************************************/
/*insert a node into the queue at the tail*/
/****************************************/
QueueEn(struct LqQueue * Q,int elm)
{
  struct LqNode * p,* q ;
  int count = 0;
  p = (struct LqNode *)malloc(sizeof(struct LqNode));
  q = Q->front;
  if (!p && !q) exit(OVERFLOW);
  if (Q->length == 0)
  {
    p->item = elm;
    p->next = NULL;
    Q->front=Q->rear=p;
    Q->length ++;
    printf("The new node %d was inserted into the Queue successfully!/n",elm);
  }
  else
  {
    p->item = elm;
    p->next = NULL;
    while (1)
    {
      count++;
      if (count == Q->length) break; 
      q = q->next;
    }
    q->next = Q->rear = p;
    Q->length++;
    printf("The new node %d was inserted into the Queue successfully!/n",elm);
  }
}
/****************************************/
/*Delet the first node in the queue first out*/
/****************************************/
QueueDefirst(struct LqQueue * Q)
{
  int DefirstElm=0;
  if (Q->front != NULL)
  {
    DefirstElm = Q->front->item;
  }
  if (Q->length == 0)
  {
    printf("The queue now is empty,you can not delete the first node again!/n");
  }
  else if (Q->length == 1)
  {
    Q->front = Q->rear = NULL;
    Q->length--;
    printf("Delete the first node %d  successfully!/n",DefirstElm);
  }
  else
  {
    Q->front = Q->front->next;
    Q->length--;
    printf("Delete the first node %d successfully!/n",DefirstElm);
  }
}

/****************************************/
/*Judge the queue is empty or not*/
/****************************************/
QueueEmpty(struct LqQueue * Q)
{
   if (Q->length==0)
   {
     printf("The queue now is empty!/n");
   }
   else
   {
     printf("The queue now is not empty!/n");
     PrintQueue(Q);
   }
}
/****************************************/
/*Get the length of the queue*/
/****************************************/
QueueLength(struct LqQueue * Q)
{
  printf("The length of current queue is %d/n",Q->length);
}
/****************************************/
/*Destroy the queue and free the memory distributed at first*/
/****************************************/
DestroyQueue(struct LqQueue * Q)
{
  free(Q->front);
  free(Q->rear);
  Q->length = 0;
  printf("Destroy the queue successfully!/n");
}
/****************************************/
/*Clear all the nodes in the queue*/
/****************************************/
ClearQueue(struct LqQueue * Q)
{
  free(Q->front);
  free(Q->rear);
  Q->length = 0;
  printf("Clear the queue successfully!/n");
}
/****************************************/
/*Get the node at tbe location i */
/****************************************/
GetElement(struct LqQueue * Q,int i)
{
  struct LqNode * p;
  int count = 0;
  p = Q->front;
  if (i <= 0|| i>Q->length)
  {
    printf("The location you input is not valid!/n");
  }
  while (1)
  {
    count++;
    if (count==i) break;
    p=p->next;
  }
  return p->item;
}
/****************************************/
/*Find a number if or not in the queue*/
/****************************************/
FindElement(struct LqQueue * Q,int elm)
{
    struct LqNode *p;
    int count=0,totalFind=0;
    p =Q->front;
    while (1)
    {
      if (count == Q->length) break;
      count++;
      if(p->item == elm)
      {
        totalFind++;
        printf("We find %d at the location of %d in the queue!/n",elm,count);
      }
      p = p->next;
    }
    if (totalFind == 0)
    {
     printf("We can not find %d in the queue!/n",elm);
    }
    else
    {
      printf("We totally find %d <%d> in the queue/n",totalFind,elm);
    }
}
/****************************************/
/*Get prior node of some node in the queue*/
/****************************************/
PriorElement(struct LqQueue * Q,int elm)
{
    struct LqNode *p;
    int count=0,priorNode=0,totalFind=0;
    p =Q->front;
    while (1)
    {
      if (count == Q->length) break;
      count++;
      if(p->item == elm)
      {
        if (count == 1)
        {
          printf("We can not find the prior of %d in the queue!/n",elm);
        }
        else
        {
          totalFind++;
          priorNode = GetElement(Q,count-1);
          printf("We find prior of %d is %d at the location of %d in the queue!/n",elm,priorNode,count-1);
        }
      }
      p=p->next;
    }
    if (totalFind == 0)
    printf("We can not find the prior of %d in the queue!/n",elm);
}
/****************************************/
/*Get next node of some node in the queue*/
/****************************************/
NextElement(struct LqQueue * Q,int elm)
{
  struct LqNode *p;
  int count=0,nextNode=0,totalFind=0;
    p =Q->front;
    while (1)
    {
      if (count == Q->length) break;
      count++;
      if(p->item == elm)
      {
        if (count == Q->length)
        {
          printf("We can not find the next of %d in the queue!/n",elm);
        }
        else
        {
          totalFind++;
          nextNode = GetElement(Q,count+1);
          printf("We find next of %d is %d at the location of %d in the queue!/n",elm,nextNode,count+1);
        }
      }
      p=p->next;
    }
    if (totalFind == 0)
    printf("We can not find the next of %d in the queue!/n",elm);
}

/****************************************/
/*Print the queue */
/****************************************/
PrintQueue(struct LqQueue * Q)
{
  int count;
  count = Q->length;
  if (Q->length==0)
  {
    printf("The queue now is empty!/n");
  }
  else if (Q->length == 1)
  {
    printf("The current queue:/n");
    printf("         _______ /n");
    printf("rear -->|  %3d  |/n",Q->front->item);
    printf("front-->|_______|/n");
  }
  else
  {
      printf("The current queue:/n");
      while(1)
      {
        if(count == 0) break;
        if(count ==Q->length)
        {
          printf("         _______/n");
          printf("rear -->|  %3d  |/n",GetElement(Q,count));
          printf("        |_______|/n");
          count--;
        }
        else if (count==1)
        {
          printf("        |  %3d  |/n",GetElement(Q,count));
          printf("front-->|_______|/n");
          count--;
        }
        else
        {
          printf("        |  %3d  |/n",GetElement(Q,count));
          printf("        |_______|/n");
          count--;
        }
      }
  }
}
/****************************************/
/*Show a example to the user*/
/****************************************/
QueueExample()
{
  InitQueue(&Q);
  QueueEn(&Q,1);
  QueueEn(&Q,2);
  QueueEn(&Q,3);
  QueueEn(&Q,4);
  QueueEn(&Q,5);
  QueueEn(&Q,6);
  QueueEn(&Q,5);
  QueueEn(&Q,6);
  QueueEn(&Q,60);
  QueueEn(&Q,50);
  QueueEn(&Q,7);
  QueueEn(&Q,8);
  QueueEn(&Q,9);
  FindElement(&Q,6);
  FindElement(&Q,7);
  FindElement(&Q,10);
  PriorElement(&Q,6);
  PriorElement(&Q,10);
  NextElement(&Q,6);
  NextElement(&Q,10);
  GetElement(&Q,3);
  PrintQueue(&Q);
  QueueLength(&Q);
  DestroyQueue(&Q);
  return 0;
}
/****************************************/
/*Show the help information to the user*/
/****************************************/
void help()
{
  printf("      /*****************************************************************//n");
  printf("      /*****************************************************************//n");
  printf("      /*        The link queue Operation Version 1.0                *//n");
  printf("      /*             View the example information             1         *//n");
  printf("      /*       insert a node into the queue at the tail       2         *//n");
  printf("      /*        delete the head  number from the queue        3         *//n");
  printf("      /*          Find a number if or not in the queue        4         *//n");
  printf("      /*       Get the prior of some number from the queue    5         *//n");
  printf("      /*       Get the next  of some number from the queue    6         *//n");
  printf("      /*                Get the size of queue                 7         *//n");
  printf("      /*               Show the help information              8         *//n");
  printf("      /*             View current  queue information          9         *//n");
  printf("      /*                    Exit link  queue                  Q         *//n");
  printf("      /*****************************************************************//n");
}
main()
{
  char userInput;
  int insertItem,findItem,priorItem,nextItem;
  help();
  InitQueue(&Q);
  while(1)
  {
    printf("Slect the operation you want to do: input the correspond number!you can enter 1 to view the example ,and enter 8 to view the help./n");
    scanf("%c",&userInput);
    switch(userInput)
    {
      case '1':QueueExample();break;
      case '2':
             for(;;)
             {
              printf("Please input a integer  you want to push into the queue:/n");
                 printf("Forexample 1 . if you do not want to push a number into the queue again,you can input -1/n");
              scanf("%d",&insertItem);
                 if (insertItem == -1)
                 break;
              QueueEn(&Q,insertItem);
              PrintQueue(&Q);
              }
           break;
      case '3':
              QueueDefirst(&Q);
              PrintQueue(&Q);
           break;
      case '4':
             for(;;)
             {
              printf("Please input a integer  you want to find from the queue:/n");
                 printf("Forexample 1 . if you do not want to find a number from the queue again,you can input -1/n");
           scanf("%d",&findItem);
                 if (findItem == -1)
                 break;
              FindElement(&Q,findItem);
              PrintQueue(&Q);
              }
           break;
      case '5':
             for(;;)
             {
         printf("Please input a integer  you want to get the prior from the queue:/n");
         printf("Forexample 1. if you do not want to get the prior form the queue again,you can input -1/n");
         scanf("%d",&priorItem);
         if (priorItem == -1) break;
         PriorElement(&Q,priorItem);
            PrintQueue(&Q);
              }
           break;
      case '6':
            for(;;)
             {
         printf("Please input a integer  you want to get the next from the queue:/n");
         printf("Forexample 1. if you do not want to get the next form the queue again,you can input -1/n");
         scanf("%d",&nextItem);
         if (nextItem == -1) break;
         NextElement(&Q,nextItem);
            PrintQueue(&Q);
              }
           break;
      case '7':QueueLength(&Q);break;
      case '8':help();break;
      case '9':PrintQueue(&Q);break;
      case 'Q':break;
      case 'q':break;
    }
    if (userInput == 'q'|| userInput == 'Q')
    break;
  }
  return 0;
}

如果程式碼中有什麼錯誤,希望您不吝賜教,您可以把您的意見傳送到[email protected],我會盡快給您回覆的。

相關推薦

C語言正向棧

《C語言》鏈式正向棧 Main.c Stack.h Stack.h Main.c #include "Stack.h" void main() { /*****************先進後出(逆序)*************

C語言 佇列結構實現表示 資料結構 佇列實現表示

  五一放假,也沒有什麼事情可以做的,本來想出去玩一玩或者打打球什麼的,可是天公不作美,這兩天天氣一直是在下雨,弄的人的心情溼透了。  昨天學習了一天的棧和佇列,昨天在下午些的時候完成了棧的程式設計工作。晚上本應該是用來寫完佇列的程式的,可是晚上到寢室熄燈之前只是差一點程式就

資料結構之單鏈佇列(儲存佇列)的實現(C語言)

學習參考: 嚴蔚敏: 《資料結構-C語言版》 基本操作 入隊 出隊 建空佇列 判隊空 獲取隊首元素 獲取佇列長度 清空佇列 程式碼實現 佇列結點定義 typedef stru

C++實現隊類——合肥工業大學資料結構實驗5:佇列

實驗5 5.1 實驗目的 熟練掌握佇列的順序鏈式儲存結構。 熟練掌握佇列的有關演算法設計,並在鏈佇列上實現。 根據具體給定的需求,合理設計並實現相關結構和演算法。 5.2 實驗要求 5.2.1鏈佇列實驗要求 本次實驗中的鏈佇列結構指不帶頭結點的單鏈表; 鏈佇列結構和運算定義,演算法的實現以庫檔

資料結構c語言)——佇列儲存結構實現

是佇列鴨,FIFO,先進先出! 對於帶頭節點的和不帶頭節點的鏈佇列的操作有個小小的區別: 不帶頭結點的鏈佇列在入佇列的時候,第一個元素時要先判斷是否為空,再插入。而帶頭結點不需要,操作更方便些;  我是分割線-----------------------------

佇列儲存結構一貨物上架問題

#include <iostream> #include<string.h> static int n;                       //用於輸入

資料結構c語言)——棧儲存結構實現

鏈棧:就是一種特殊的單鏈表,FILO(先進後出) 通常對於連結串列來說: 1.是不需要頭節點的。 2.基本不存在滿棧的情況,除非記憶體已沒有可用的空間。   不多bibi你們都懂哈,直接上程式碼:  鏈棧結構: typedef struct Stock

C語言實現(摘自資料結構演算法分析 C語言描述)

一、概述: 棧(stack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧的頂(top)。對棧的基本操作有Push(進棧)和Pop(出棧),前者相當於插入,後者則是刪除最後插入的元素。 棧有時又叫做LIFO(後進先出)表。在圖1中描述的模型只象徵著Pus

棧的結構表示實現——自己寫資料結構

今天給大家介紹棧的鏈式結構,用dev-c++4.9.9.2除錯通過,少廢話直接上程式碼: 資料結構體存放檔案stacklist.h檔案如下 #ifndef _STACKLIST_H_ #define _STACKLIST_H_ typedef struct _No

佇列(五)佇列(結構)

佇列(以鏈式為主) 定義:是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表 與棧(後進先出)不同,佇列是先進先出 隊頭(刪除的一端)(指頭結點):出佇列 隊尾(插入的一端)(指an):入佇列

迴圈佇列的應用——舞伴配對問題(資料結構 C語言

迴圈佇列的應用——舞伴配對問題:      在舞會上,男、女各自排成一隊。舞會開始時,依次從男隊和女隊的隊頭各出一人配成舞伴。如果兩隊初始人數不等,則較長的那一隊中未配對者等待下一輪舞曲。假設初始男、女人數及性別已經固定,舞會的輪數從鍵盤輸入。試模擬解決上述舞伴

雙端佇列的物理實現(順序雙端佇列+雙端佇列

說明 基於順序表實現的順序雙端佇列 基於連結串列實現的鏈式雙端佇列 一、說明 思路大致與佇列相同,增添了從頭部入隊、尾部出隊等操作。 再次感嘆delete的耗時 二、基於順序表實現的順序雙端佇列 1、Deque.h #include<iostream>

C語言單向表的實現

fff 伸縮 style Language meta 分配 str next chm 一個簡單結點的結構體表示為: struct note { int data; /*數據成員可以是多個不同類型的數據*/

C語言實現簡單的資料結構迷宮實驗

分析:迷宮實驗主要有兩部分操作,其一是對迷宮的生成,其二是尋路使用棧的操作。 步驟: 一、.h檔案 1、首先是迷宮的生成,可以使用隨機數種子生成,但主要邏輯部分並不在此,所以在這裡直接寫死,固定下來。 定義一個座標型別的結構體,和二維陣列迷宮: typedef

佇列的物理實現(順序佇列+佇列

說明 基於順序表實現的順序佇列 基於連結串列實現的鏈式佇列 一、說明 本文基於順序表實現的順序佇列中,陣列的大小為n+1,但只儲存n個元素,方便區分滿佇列和空佇列;基於連結串列實現的鏈式佇列中,front始終指向頭結點(資料域為空),rear指向佇列的尾結點(資料域不為

資料結構---佇列---儲存

#include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; #define OK 1 #define ERROR 0 #define TRUE

C語言實現List的資料結構(很詳細的註釋)

新建一個list.c檔案 #include <stdio.h> #include <malloc.h> //動態分配記憶體 #include <stdlib.h> //exit 函式 #include <std

C語言 資料結構排序查詢 資料結構實驗之排序三:bucket sort

資料結構實驗之排序三:bucket sort Time Limit: 250MS Memory Limit: 65536KB Submit Statistic Problem Description 根據人口普查結果,知道目前淄博市大約500萬人口,你的

c語言佇列

1.佇列的連結儲存結構稱為鏈列表,通常用單鏈表表示,因此此節點結構與單鏈表的節點結構相同。為了使空佇列和非空佇列,=的操作一致,鏈佇列也加上了頭結點。 2.為了操作上的方便,設定隊頭指標指向鏈佇列的頭結點,隊尾指標指向終端節點。 3.連結串列示意圖 4

用連結串列實現佇列--佇列

/* 一、關於鏈式佇列的約定(目的是在C語言中描述方便) 1.定義: (1)佇列是一種先進先出的線性表; (2)它只允許在表的一端進行入隊,在另一端進行出隊操作。在佇列中,允許插入的一端 叫隊尾,允許刪除的一端較隊頭,即入隊只能從隊尾入,出隊只