① 队列的链式插入和删除,求高手帮我调试,改正,我改了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);
}