1. C語言二級考試循環鏈表是循環隊列的鏈式存儲結構
循環隊列本身是一種順序存儲結構,而循環列表是一種鏈式存儲結構。兩者之間是平級關系。
線性鏈表是線性表的鏈式存儲結構,包括單鏈表,雙鏈表,循環鏈表等。
隊列的順序存儲結構一般採用循環隊列的形式。
循環隊列的操作是按數組取摸運算的,所以是順序存儲,而循環鏈表本身就是收尾相連的,所以循環鏈表不是循環隊列,兩種不同的存儲結構,雖然實現的功能是一樣的,實現循環兩種方式 順序存儲就是循環隊列,鏈式存儲就是循環鏈表。
(1)鏈式隊列是什麼存儲結構擴展閱讀:
1、比順序存儲結構的存儲密度小(鏈式存儲結構中每個結點都由數據域與指針域兩部分組成,相比順序存儲結構增加了存儲空間)。
2、邏輯上相鄰的節點物理上不必相鄰。
3、插入、刪除靈活 (不必移動節點,只要改變節點中的指針)。
4、查找節點時鏈式存儲要比順序存儲慢。
5、每個節點是由數據域和指針域組成。
6、由於簇是隨機分配的,這也使數據刪除後覆蓋幾率降低,恢復可能提高。
2. 程序中的棧和隊列是什麼意思
棧(Stack)是僅限制在表的一端進行插入和刪除運算的線性表,稱插入、刪除這一端為棧頂,另一端稱為棧底。表中無元素時為空棧。棧
的修改是按後進先出的原則進行的,我們又稱棧為LIFO表(Last
In
First
Out)。通常棧有順序棧和鏈棧兩種存儲結構。
棧的基本運算有六種:
·構造空棧:InitStack(S)
·判棧空:
StackEmpty(S)
·判棧滿:
StackFull(S)
·進棧:
Push(S,x)
·退棧:
Pop(S)
·取棧頂元素:StackTop(S)
在順序棧中有"上溢"和"下溢"的現象。
·"上溢"是棧頂指針指出棧的外面是出錯狀態。
·"下溢"可以表示棧為空棧,因此用來作為控制轉移的條件。
順序棧中的基本操作有六種:·構造空棧·判棧空·判棧滿·進棧·退棧·取棧頂元素
鏈棧則沒有上溢的限制,因此進棧不要判棧滿。鏈棧不需要在頭部附加頭結點,只要有鏈表的頭指針就可以了。
鏈棧中的基本操作有五種:·構造空棧·判棧空·進棧·退棧·取棧頂元素
隊列(Queue)是一種運算受限的線性表,插入在表的一端進行,而刪除在表的另一端進行,允許刪除的一端稱為隊頭(front),允許插入的
一端稱為隊尾(rear)
,隊列的操作原則是先進先出的,又稱作FIFO表(First
In
First
Out)
。隊列也有順序存儲和鏈式存儲兩種存儲結
構。
隊列的基本運算有六種:
·置空隊:InitQueue(Q)
·判隊空:QueueEmpty(Q)
·判隊滿:QueueFull(Q)
·入隊:EnQueue(Q,x)
·出隊:DeQueue(Q)
·取隊頭元素:QueueFront(Q)
順序隊列的"假上溢"現象:由於頭尾指針不斷前移,超出向量空間。這時整個向量空間及隊列是空的卻產生了"上溢"現象。
為了克服"假上溢"現象引入循環向量的概念,是把向量空間形成一個頭尾相接的環形,這時隊列稱循環隊列。
判定循環隊列是空還是滿,方法有三種:
·一種是另設一個布爾變數來判斷;
·第二種是少用一個元素空間,入隊時先測試((rear+1)%m
=
front)?
滿:空;
·第三種就是用一個計數器記錄隊列中的元素的總數。
隊列的鏈式存儲結構稱為鏈隊列,一個鏈隊列就是一個操作受限的單鏈表。為了便於在表尾進行插入(入隊)的操作,在表尾增加一個尾指
針,一個鏈隊列就由一個頭指針和一個尾指針唯一地確定。鏈隊列不存在隊滿和上溢的問題。在鏈隊列的出隊演算法中,要注意當原隊中只
有一個結點時,出隊後要同進修改頭尾指針並使隊列變空。
3. 順序存儲和鏈式存儲屬於什麼存儲結構
一般,存儲結構分為:順序順序存儲結構和鏈式存儲結構。
常見鏈式存儲結構有:鏈表,樹,圖。
4. 鏈式存儲隊列的數據結構(邏輯結構+存儲結構)分析、鏈式存儲隊列的基本C語言結構體分析與定義
鏈式隊列
鏈式存儲結構的隊列稱作鏈式隊列。
鏈式隊列的隊頭指針指在隊列的當前隊頭結點位置,隊尾指針指在隊列的當前隊尾結點位置。不帶頭結點的鏈式隊列時可直接刪除隊頭指針所指的結點。
鏈式隊列中結點的結構體可定義如下:
typedef struct qnode
{
DataType datal;
Struct qnode *next;
}LQNode;
為了方便參數調用,通常把鏈式隊列的隊頭指針front和隊尾指針rear也定義為如下的結構體類型LQueue:
typedef struct
{
LQNode *front;
LQNode *rear;
}LQueue;
鏈式隊列操作的實現
(1) 初始化QueueInitiate(LQueue *Q)
void QueueInitiate(LQueue *Q)
{
Q->rear=NULL;
Q->front=NULL;
}
(2)非空否QueueNotEmpty(LQueue Q)
int QueueNotEmpty(LQueue Q)
/*判斷鏈式隊列Q非空否,非空返回1,否則返回0*/
{
if(Q.front==NULL)return 0;
else return 1;
}
(3)入隊列QueueAppend(LQueue *Q,DataType x)
int QueueAppend(LQueue *Q,DataType x)
/*把數據元素x插入鏈式隊列Q隊列的隊尾,入隊列成功返回1,否則返回0*/
{
LQNode *p;
if((p=(LQNode*)malloc(sizeof(LQNode)))==NULL)
{
printf(「內存不足無法插入!\n);
return 0;
}
p->data=x;
p->next=NULL;
if(Q->rear!=NULL)Q->rear->next=p;
Q->rear=p;
if(Q->front==NULL)Q->front=p;
return 1;
}
(4)出隊列QueueDelete(LQueue *Q,DataType *d)
int QueueDelete(LQueue *Q,DataType *d)
/*刪除鏈式隊列Q的隊頭數據元素值到d,出隊列成功返回1,否則返回0*/
{
LQNode *p;
if(Q->front==NULL)
{
printf(「隊列已空無數據元素出隊列!\n」);
return 0;
}
else
{
*d=Q->front->data;
p=Q->front;
Q->front=Q->front->next;
if(Q->front==NULL)Q->rear=NULL;
free(p);
return 1;
}
}
(5)取隊頭數據元素QueueGet(LQueue *Q,DataType *d)
int QueueGet(LQueue *Q,DataType *d)
/*取鏈式隊列Q的當前隊頭數據元素值到d,成功返回1,否則返回0*/
{
if(Q.front==NULL)
{
printf(「隊列已空無數據元素出隊列!\n);
return 0;
}
else
{
*d=Q.front->data;
return 1;
}
}
(6)撤銷動態申請空間Destory(LQueue *head)
int Destory(LQueue *head)
{
LQNode *p,*p1;
p=Q.front;
while(p!=NULL)
{
p1=p;
p=p->next;
free(p1);
}
}
幫你轉的,我覺得他描述的很清楚。希望對你有幫助。
5. 隊列通常採用兩種存儲結構是
應該是順序存儲和鏈接存儲,通稱順序隊列和鏈隊列,其中順序隊列一般用的是循環隊列的方式
6. 數據結構—隊列
隊列 (queue)是一種先進先出的線性表。它只允許在表的一端進行插入,在另一端進行刪除,這如同我們日常生活中的排列是一致的,最早入隊的元素最早離開。
隊尾 (rear)是隊列中允許插入的一端, 隊頭 (front)是隊列中允許刪除的一端。
隊列如同棧一樣,也同樣有兩種存儲表示,分別是順序表示和鏈式表示。
和順序棧類似,在隊列的順序存儲結構中,除了用一組地址連續的存儲單元依次存放從隊列頭到對列尾的元素之外,需要設置兩個指針front和rear分別指示隊列頭元素和尾元素的位置。
隊列的順序存儲結構表示如下:
為方便C語言描述起見,約定:初始化建空隊列時,front=rear=0,每當插入新元素至隊尾時,「尾指針增一」,每當刪除頭元素時,「頭指針增一」。因此,在非空隊列中,頭指針始終指向隊列頭元素,而尾指針始終指向隊尾元素的下一個位置。
循環對列 是將順序隊列變成一個環狀的空間,用這種方法可以解決隊列「假溢出」問題。
「假溢出」 是指隊列實際可用空間沒有占滿,但是不能向隊列中添加新的隊尾元素,否則會出現溢出的現象的情況。
在循環隊列中,頭尾指針以及隊列元素之間的關系不發生改變物皮,只是在循環隊列中頭尾態團指針「依次循環增一」的操作可用模運算實現。通過取模,頭指針和尾指針就可以在順序表空間內以頭尾銜接的方式「循環」移動。
循環隊列的基本操作演算法描述罩閉差:
鏈隊是指採用鏈式存儲結構實現的隊列。通常鏈隊用單鏈表來表示,一個鏈隊顯然需要兩個分別指示對頭和隊尾的指針(分別稱為頭指針和尾指針)才能唯一確定。為了操作方便,同線性表的單鏈表一樣,為鏈隊添加頭結點,並規定頭指針始終指向頭結點。
鏈隊列存儲結構表示如下:
鏈隊操作即為單鏈表插入和刪除操作的特殊情況,只是需要進一步修改尾指針或頭指針。
鏈隊列的基本操作演算法描述:
7. 試述隊列的鏈式存儲結構和順序存儲結構的優缺點
順序存儲結構是在內存中開辟一個連續的空間用來存儲數據,因此對於內存的需求和苛刻,必須是連續的空間.在數據查找(特別是不按照規律排列的數據),時間復雜度教少.效率高.
鏈式存儲結構是採取連表指針來指示數據的存儲位置,這就可以是在內存中隨意的存儲,沒有必須連續儲存空間的要求,對於內存的要求相對教容易.但是要是是從小到大順序排列的數據,鏈式存儲結構的時間復雜度教小,效率高.但是要是不規則排布的數據一般時間復雜度較高,效率更低
8. 數據結構隊列問題:為什麼鏈隊 要分兩個結構體來定義
因為鏈隊結構是一種運算受限的線性表,其限制是僅允許在表的一端進行插入,而在表的另一端進行刪除。每個元素必然按照進入的次序離隊,所以又把隊列稱為先進先出表芹尺塌。
鏈式隊列存儲結構也是通過由結點構成的單鏈表實現的。
在單鏈表中可以在表中的任何位置插入數據,不過在鏈隊中,只能從末尾插入數據,從起始處刪除。所以就需要一個結構來定義下一個節點的位置。
你可以將單鏈表理解為允許鬆散的隊伍,它是允許插隊的。
鏈隊是嫌圓有人管理的隊伍,它有嚴格的要求,有一個管理者,不允許插隊,管理者控制著隊伍的進出。
一個結困蔽構體是管理者,一個結構體是隊伍的起始和結束位置。
9. 簡述棧和隊列的順序存儲結構和鏈式存儲結構的優缺點
順序棧--入棧操作受數組上界的約束有可能發生棧上溢,且需要地址連續的存儲單元。
鏈棧--無須地址連續,便於多個棧共享存儲單元,且不存在棧滿上溢情況。
順序隊列--需地址連續且有假上溢現象(需改為循環隊列才可解決假上溢)
鏈式隊列--特別適合於數據元素變動比較大的情況,且不存在隊列滿而產生的溢出問題。
10. 鏈式隊列存儲結構的定義及基本操作
鏈式隊列其實很簡單的。
其實就是一個鏈表,不過這個鏈表你只能從表尾插入,從表頭刪除。(單向隊列)
鏈表你肯定會吧,定義兩個指針,分別指向表頭和表尾,作為隊頭指針和隊尾指針。封裝起來。
這就是一個鏈式隊列了。
基本操作無非是入隊,出隊,刪除這些,跟基本鏈表操作一樣的。