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)它只允許在表的一端進行入隊,在另一端進行出隊操作。在佇列中,允許插入的一端 叫隊尾,允許刪除的一端較隊頭,即入隊只能從隊尾入,出隊只