回 帖 发 新 帖 刷新版面

主题:[讨论]求助...这个简单问题却调了很久

要求:假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点,建立顺序链式存储循环队列,输入N个字符型数据,编写相应的队列入队和出队的算法,并显示该队列。

整个程序:

#include<stdio.h>
#include<iostream.h>
#define max 100
struct node{
    char data;
    node *next;
};
node *set()
{
    node *head,*p,*s;
    char ch[max];
    head=new node;
    p=head;
    scanf("%s",&ch);
    for(int i=0;ch[i]!='\0';i++)
    {s=new node;s->data=ch[i];p->next=s;p=s;}
    p->next=head;
    return p;
}
void insert(node *p,char x)
{
    node *s;
    s=new node;
    s->data=x;
    s->next=p->next;
    p->next=s;
    p=s;
}
void del(node *p)
{
    node *h,*t;
    if(p->next==p) cout<<"队列为空"<<endl; 
    else {h=p->next;
    t=h->next;
    if(p==t) {p=h;p->next=p;}/*如果只有头节点和尾节点,就把尾指针指向头节点*/
    else h->next=t->next;
    cout<<t->data<<"已出队"<<endl;
    delete t;}
}
void get(node *p)
{
    if(p->next==p) cout<<"队列为空"<<endl; 
    else cout<<"队首元素为"<<p->next->next->data<<endl;
}
void display(node *p)
{
    node *l;
    if(p->next==p) cout<<"队列为空"<<endl; 
    else {l=p->next->next;
    while(l!=p->next)
    {cout<<l->data<<" ";l=l->next;}cout<<endl;}
}
void menu()
{
    cout<<"1插入,2取队首,3出队,4显示"<<endl;
}
main()
{
    int choice;
    node *queue;
    cout<<"建立队列:"<<endl; 
    queue=set();
    while(1)
    {
        menu();
        cin>>choice;
        switch(choice)
        {
            case 1:cout<<"输入要插入的数据:"<<endl;char x;cin>>x;insert(queue,x);break;
            case 2:get(queue);break;
            case 3:del(queue);break;
            case 4:display(queue);
        }
    }
}      



如上...插入一个元素后显示就有错误了.还有如果出队完了,判断队空的条件好像没用...请高手帮助...

回复列表 (共3个回复)

沙发

主要是在插入时,p的位置发生了变化,返回时,应该是接受位置已经变化的p,
void inser(node*&p,char c)或者node * insert(node *p,char c);
在删除时if(p==t),此时队列就已经为空,就应该退出了。
在main()里while(1),这样永远也退出不了循环,while(choice){}

板凳

感谢回复,插入问题已经解决.可是判断队列为空的条件应该怎样写呢?循环队列在删除最后一个元素的时候有一句p->next=p; 但是判断条件中的p->next==p却无法执行而继续出队 为什么呢?

3 楼

main函数里本来是while(1)里有个case 0:return 0;的  后来重新打的时候没有写上去

我来回复

您尚未登录,请登录后再回复。点此登录或注册