① 隊列的鏈式插入和刪除,求高手幫我調試,改正,我改了n次就是不對。在線等,急!!!感激不盡
好多錯誤啊,這是修改後的代碼
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
// int _tmain(int argc, _TCHAR* argv[])
// {
// return 0;
// }
#include<stdio.h> //現將下面這個錯誤更正!
#include<stdlib.h>
typedef struct QNODE{
int data;
struct QNODE *next;
}QNODE,*Queueptr;
typedef struct {
Queueptr front;
Queueptr rear;
}Linkqueue;
Linkqueue initQueue(Linkqueue Q)//創建
{
Q.front=Q.rear=(Queueptr)malloc(sizeof(QNODE));
if(!Q.front) //當開辟不成功,應該直接return或{print();return},由於你沒有返回會繼續執行下去!
printf("\nerror\n");
else
Q.front->next=NULL;
return Q;
}
Linkqueue enQueue(Linkqueue Q,int e)//插入
{
Queueptr p;
p=(Queueptr)malloc(sizeof(QNODE));
if(!p)
printf("\nerror"); //原因同上!
else
{
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
return Q;
}
Linkqueue deQueue(Linkqueue Q)//刪除
{
Queueptr p; // 沒有定義p
int e; // 沒有定義e
if(Q.front==Q.rear)
printf("\nerror");
else{
p=Q.front->next;/*p=Q.fornt->next;*/
e=p->data;
printf("\nthe delete value is %d",e);
if ( p->next )
{
Q.front->next=p->next;
}else
{// 結點刪除完時
Q.rear = Q.front;
}
free(p);
}
return Q;
}
void display(Linkqueue Q) // 缺少void
{
Queueptr k,m;/*Linkqueue k,m;*/
k=Q.front;
m=Q.rear;
while(k!=m)
{
k=k->next;
printf("\n%5d",k->data);
}
printf("\n");
}
int main()//主函數
{
int n,i,e;
Linkqueue Q;
Q.rear = Q.front = NULL; // 初始化指針
Q = initQueue( Q );
printf("input the numbers you want to input:");
scanf("%d",&n);
printf("\ninput %d numbers:\n");
for(i=0;i<n;i++)
{
scanf("%d",&e);
Q=enQueue(Q,e);
}
display(Q);
Q=deQueue(Q);
printf("the delete queue result is as follows:");
display(Q);
getchar();
getchar();
}
② 計算機基礎:隊列:刪除與插入:那個加,哪個減
棧(Stack)是僅限制在表的一端進行插入和刪除運算的線性表,稱插入、刪除這一端為棧頂,另一端稱為棧底。表中無元素時為空棧。棧的修改是按後進先出的原則進行的,我們又稱棧為LIFO表(LastInFirstOut)。通常棧有順序棧和鏈棧兩種存儲結構。棧的基本運算有六種:·構造空棧:InitStack(S)·判棧空:StackEmpty(S)·判棧滿:StackFull(S)·進棧:Push(S,x)·退棧:Pop(S)·取棧頂元素:StackTop(S)在順序棧中有"上溢"和"下溢"的現象。·"上溢"是棧頂指針指出棧的外面是出錯狀態。·"下溢"可以表示棧為空棧,因此用來作為控制轉移的條件。順序棧中的基本操作有六種:·構造空棧·判棧空·判棧滿·進棧·退棧·取棧頂元素鏈棧則沒有上溢的限制,因此進棧不要判棧滿。鏈棧不需要在頭部附加頭結點,只要有鏈表的頭指針就可以了。鏈棧中的基本操作有五種:·構造空棧·判棧空·進棧·退棧·取棧頂元素隊列(Queue)是一種運算受限的線性表,插入在表的一端進行,而刪除在表的另一端進行,允許刪除的一端稱為隊頭(front),允許插入的一端稱為隊尾(rear),隊列的操作原則是先進先出的,又稱作FIFO表(FirstInFirstOut)。隊列也有順序存儲和鏈式存儲兩種存儲結構。隊列的基本運算有六種:·置空隊:InitQueue(Q)·判隊空:QueueEmpty(Q)·判隊滿:QueueFull(Q)·入隊:EnQueue(Q,x)·出隊:DeQueue(Q)·取隊頭元素:QueueFront(Q)順序隊列的"假上溢"現象:由於頭尾指針不斷前移,超出向量空間。這時整個向量空間及隊列是空的卻產生了"上溢"現象。為了克服"假上溢"現象引入循環向量的概念,是把向量空間形成一個頭尾相接的環形,這時隊列稱循環隊列。判定循環隊列是空還是滿,方法有三種:·一種是另設一個布爾變數來判斷;·第二種是少用一個元素空間,入隊時先測試((rear+1)%m=front)?滿:空;·第三種就是用一個計數器記錄隊列中的元素的總數。隊列的鏈式存儲結構稱為鏈隊列,一個鏈隊列就是一個操作受限的單鏈表。為了便於在表尾進行插入(入隊)的操作,在表尾增加一個尾指針,一個鏈隊列就由一個頭指針和一個尾指針唯一地確定。鏈隊列不存在隊滿和上溢的問題。在鏈隊列的出隊演算法中,要注意當原隊中只有一個結點時,出隊後要同進修改頭尾指針並使隊列變空。
③ 無頭指針或無尾指針的循環隊列的插入和刪除節點的演算法
無頭指針有尾指針就從尾指針找起,一個一個向前找,直至找到該隊列的頭指針為止,此時即可知道你需要插入和刪除節點的位置
有頭指針的無尾指針,從隊列頭起,一個一個向後找,直至找到該隊列的尾指針為止,此時即可知道你需要插入和刪除節點的位置
插入演算法:在某個位置插入節點後,此後的節點逐個後移,並且將移動後的尾指針保存下來
刪除演算法:將該位置後的節點逐個前移,並且移動後將刪除的節點用free函數釋放其佔用的內存空間
④ 如何用C#定義一個循環隊列,並寫出插入,刪除演算法
using System;using System.Collections.Generic;using System.Linq;using System.Text;/** 隊列是這樣一種數據結構,數據項的插入在一端(隊列尾),而數據項的取得或刪除則在另一端(隊列頭)。* 因為第一個插入的數據項也是第一個取得或刪除的數據項,開發者普遍地將隊列稱為FIFO數據結構。開發者經常使用到兩種隊列:線性隊列和循環隊列。在兩種隊列中,數據項都是在隊列尾插入,* 並從隊列頭刪除或獲取,即先進先出* 下面實現一個循環隊列*/namespace 隊列{ class Student { string name; public string Name { get { return name; } set { name = value; } } public Student(string name) { this.name = name; } public Student Next; //指示下一個隊列 } class Program { static void Main(string[] args)
⑤ 53.棧的插入和刪除只能在棧的
53.棧的插入和刪除只能在棧的____棧頂________進行,隊列的插入和刪除分別在___線性表的兩_________端進行,進行插入的一端叫做_____隊列的尾_______,進行刪除的一端叫做____隊列的頭________。
⑥ 棧和隊列的共同點是什麼
棧和隊列的共同特點是(C. 只允許在端點處插入和刪除元素)。
棧是先進後出的,所以A錯誤;隊列是先進先出的,所以B錯誤;棧和隊列都只會在兩端插入或刪除元素,所以C正確,所以D錯誤。
棧又名堆棧,它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。這一端被稱為棧頂,相對地,把另一端稱為棧底。
向一個棧插入新元素又稱作進棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素又稱作出棧或退棧,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素。
隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端進行刪除操作,而在表的後端進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。
特殊的隊列:循環隊列。
在實際使用隊列時,為了使隊列空間能重復使用,往往對隊列的使用方法稍加改進:無論插入或刪除,一旦rear指針增1或front指針增1時超出了所分配的隊列空間,就讓它指向這片連續空間的起始位置。
自己真從MaxSize-1增1變到0,可用取余運算rear%MaxSize和front%MaxSize來實現。這實際上是把隊列空間想像成一個環形空間,環形空間中的存儲單元循環使用,用這種方法管理的隊列也就稱為循環隊列。
⑦ 利用兩個棧sl、s2模擬一個隊列時,如何用棧的運算實現隊列的插入、刪除以及判隊空運算
使用兩個棧,分別依元素加入的順序和其反序保存元素,在適當的時機將元素在兩個棧中進行轉移,從而模擬隊列的操作。
令S1中元素的順序為自底向上與元素添加順序一致,S2與其相反,則:加入隊列時,若S2不空,則將S2中的元素依次出棧,每出棧一個向S1中入棧一個;將入隊元素入S1棧;
從隊列中取出時,若S1不空,則將S1中元素依次出棧,每出棧一個向S2中入棧一個;從S2棧頂出棧一個即隊列中取出的元素。
(7)隊列從哪裡插入和刪除擴展閱讀:
棧作為一種數據結構,是一種只能在一端進行插入和刪除操作的特殊線性表。它按照先進後出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂,需要讀數據的時候從棧頂開始彈出數據(最後一個數據被第一個讀出來)。棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指針。
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為先進後出表。
⑧ 隊列的刪除操作是在哪個位置處理的
隊頭
隊列是一個先進先出(First In First Out 縮寫FIFO)的線性表
隊列只允許在表的一端進行插入 另一端刪除
所以隊列是在隊尾插入 隊頭刪除
⑨ 棧和隊列的主要區別是什麼
一、插入和刪除操作不同
1、棧的插入和刪除操作都是在一端進行的。
2、而隊列的插入和刪除操作卻是在兩端進行的。
二、數據結構不同
1、棧是一種先進後出的數據結構。
2、而隊列是一種先出後進的數據結構。
三、規則不同
1、棧只允許在表尾一端進行插入和刪除。
2、而隊列只允許在表尾一端進行插入,在表頭一端進行刪除。
⑩ C語言隊列的插入與刪除
#include<stdio.h>
#include<stdlib.h>
#defineMAXQSIZE100//最大隊列長度
#defineOK1
#defineERROR0
#defineOVERFLOW-2
typedefstruct
{
int*base;
intfront;
intrear;//尾指針,若隊列不空,指向隊列尾元素的下一個位置
}SqQueue;
voidInitQueue(SqQueue*Q)
{
Q->front=Q->rear=0;
if(Q->base==NULL){
Q->base=(int*)malloc(sizeof(int)*MAXQSIZE);
}
}
voidDesQueue(SqQueue*Q){
free(Q->base);
Q->base=NULL;
Q->front=Q->rear=0;
}
intQueueLength(SqQueue*Q)
{
if(Q->base==NULL)returnERROR;
return(Q->rear-Q->front+MAXQSIZE)%MAXQSIZE;
}
voiddisplay(SqQueue*Q)
{
inti;
if(Q->base==NULL){
printf(" ERROR");
return;
}
for(i=Q->front;i!=Q->rear;i++){
i=i%MAXQSIZE;
printf("%3d",Q->base[i]);
}
printf(" ");
}
intInQueue(SqQueue*Q,inte)
{
if(Q->base==NULL)returnERROR;
if((Q->rear+1)%MAXQSIZE==Q->front)
returnOVERFLOW;
Q->base[Q->rear]=e;
Q->rear=(Q->rear+1)%MAXQSIZE;
returnOK;
}
intDeQueue(SqQueue*Q,intm)
{
inti=0;
if(Q->base==NULL)returnERROR;
if(Q->front==Q->rear)
returnERROR;
while(i!=m&&Q->front!=Q->rear)
{
printf(" %dDeleted ",Q->base[Q->front]);
Q->front=(Q->front+1)%MAXQSIZE;
i++;
}
if(i!=m){
printf(" ERROR");
returnERROR;
}
returnOK;
}
voidmain()
{
intm,n,d,i;
SqQueueQ={0,0,0};
InitQueue(&Q);
printf("請輸入要插入的元素個數:");
scanf("%d",&m);
printf("要插入的元素:");
for(i=1;i<=m;i++)
{
scanf("%d",&n);
InQueue(&Q,n);
}
printf("插入元素後,隊列中的元素為:");
display(&Q);
printf("隊列長度為:");
printf("%d ",QueueLength(&Q));
printf("輸入要刪除的元素個數:");
scanf("%d",&d);
DeQueue(&Q,d);
printf(" 刪除元素後,隊列中元素為:");
display(&Q);
printf(" ");
DesQueue(&Q);
}