单链表尾指针越界问题怎么解决


/*如果采用带尾指针的单循环链表(带头结点)作为队列的存储结构,设计算法以实现队列的各运算。
*/
#include 
using namespace std;
#include
#include< stdio.h>

#define max 100
typedef int element;
typedef struct LNode {
    element data;
    struct LNode* next;
}node;
typedef struct {
     node* rear;//队尾指针
}linkQueue;
void iniQueue(linkQueue* Q) {
    Q->rear = new node;
    Q->rear->next = Q->rear;
}
//判断队空
bool queueEmpty(linkQueue* Q) {
    return (Q->rear = Q->rear->next);
}
//取队头元素
void queueFront(linkQueue* Q, element x) {
    if (queueEmpty(Q))
        cout << "队列为空,不可取队头元素" << endl;
    else
        node*p=Q->rear->next;
        x = Q->rear->next->next->data;
}
//入队
bool enQueue(linkQueue* Q, element x) {
    node* p = new node;
    if (p == NULL)
        return false;
    else {
        p->data = x;
        p->next = Q->rear->next;
        Q->rear->next = p;
        Q->rear = p;
        return true;
    }
}
//出队
void outQueue(linkQueue* Q, element x) {
    node* u,*p;
    if (queueEmpty(Q))
        cout << "队列为空,不可出队" << endl;
    else {
        p = Q->rear->next;
        x = p->next->data;
        u = p->next;
        p->next = u->next;
        delete u;
        if (p->next == NULL)
            Q->rear = Q->rear->next;
    }
}
int main() {
    linkQueue* Q = new     linkQueue;
    char a[100]="a", b[100] = "a";
    int m ;
    cout << "输入入队元素个数 " << endl;
    cin >> m  ;
    cout << "输入入队元素:";
    gets_s( a);
    for (int i = 0; i < m; i++) {
        enQueue(Q, a[i]);
    }
    for (int i = 0; i " ";
    }

}

img


运行结果是这样,想问一下该怎么解决Q->rear越界问题

iniQueue初始化函数你在main函数里没有调用,还有好几处错误,已修改:

/*如果采用带尾指针的单循环链表(带头结点)作为队列的存储结构,设计算法以实现队列的各运算。
*/
#include <iostream>
using namespace std;
#include<stdlib.h>
#include< stdio.h>
 
#define max 100
typedef char element;   //明明元素是字符啊!
typedef struct LNode {
    element data;
    struct LNode* next;
}node;
typedef struct {
     node* rear;//队尾指针
}linkQueue;
void iniQueue(linkQueue* Q) {
    Q->rear = new node;
    Q->rear->next = Q->rear;
}
//判断队空
bool queueEmpty(linkQueue* Q) {
    return (Q->rear == Q->rear->next);  //是==,不是=
}
//取队头元素
void queueFront(linkQueue* Q, element x) {
    if (queueEmpty(Q))
        cout << "队列为空,不可取队头元素" << endl;
    else
        node*p=Q->rear->next;
        x = Q->rear->next->next->data;
}
//入队
bool enQueue(linkQueue* Q, element x) {
    node* p = new node;
    if (p == NULL)
        return false;
    else {
        p->data = x;
        p->next = Q->rear->next;
        Q->rear->next = p;
        Q->rear = p;
        return true;
    }
}
//出队
void outQueue(linkQueue* Q, element &x) {   //x要用引用类型,是返回参数啊
    node* u,*p;
    if (queueEmpty(Q))
        cout << "队列为空,不可出队" << endl;
    else {
        p = Q->rear->next;
        x = p->next->data;
        u = p->next;
        p->next = u->next;
        delete u;
        if (p->next == NULL)
            Q->rear = Q->rear->next;
    }
}
int main() {
    linkQueue* Q = new     linkQueue;
    iniQueue(Q);  //队列初始化
    char a[100]="a", b[100] = "a";
    int m ;
    cout << "输入入队元素个数 " << endl;
    cin >> m  ;
    getchar();  //gets函数前,要接收掉前面的换行符
    cout << "输入入队元素:";
    gets_s( a);
    for (int i = 0; i < m; i++) {
        enQueue(Q, a[i]);
    }
    for (int i = 0; i <m; i++) {
        outQueue(Q, b[i]);
        cout << b[i] << " ";
    }
    system("pause");
}

你的队尾结构体在分配完空间后,里面的rear没有指向任何一块内存空间