C语言实现一个队列

来源:互联网 发布:知乎 法国 实力 编辑:程序博客网 时间:2024/05/29 12:57

利用C语言实现一个简单的有简单功能的队列(只有输入输出用的C++),其中对指针的调试还是比较麻烦,这里总结一些关于segmentation faults(段错误)的常见错误:
<1>定义了指针后记得初始化,在使用的时候记得判断是否为NULL,向NULL指针写入数据会引起段错误。
<2>在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等,访问了非法的内存。
<3>在变量处理的时候变量的格式控制是否合理等,int a; printf("%s",a ), 会访问地址为a的内存空间,也会引发这种段错误。

下面附上代码

#include <stdio.h>#include <iostream>#include <stdlib.h>using namespace std;#define FALSE 0#define TRUE 1typedef int elemtype;struct Node{    elemtype data;    Node *next;};struct Queue{    Node *front;    Node *rear;};void initQueue(Queue *q){    q->front = q->rear = (Node *)malloc(sizeof(Node));    if (!q->front)    {        return;    }    q->front->next = NULL;}int isEmpty(Queue *q){    if (q->front == q->rear)    {        return TRUE;    }    else    {        return FALSE;    }}void Enqueue(Queue *q, elemtype data){    Node *repareInsert = (Node *)malloc(sizeof(Node));    if (repareInsert == NULL)    {        exit(0);    }    q->rear->data = data;    q->rear->next = repareInsert;    q->rear = repareInsert;}elemtype Dequeue(Queue *q){    if (isEmpty(q))    {        exit(0);    }    Node *FrontTmp = q->front;    elemtype data = q->front->data;    q->front = q->front->next;    free(FrontTmp);    return data;}void MakeEmpty(Queue *q){    while (!isEmpty(q))    {        Dequeue(q);    }}void DisposeQueue(Queue *q){    Node *FrontTmp = q->front;    while (FrontTmp != q->rear)    {        cout << FrontTmp->data << endl;        FrontTmp = FrontTmp->next;    }}int main(){    Queue q;    initQueue(&q);    for (int i = 1; i <= 5; i++)    {        Enqueue(&q, i);    }    cout << "Dispose queue: " << endl;    DisposeQueue(&q);    cout << "dequeue: " << endl;    while (!isEmpty(&q))    {        cout << Dequeue(&q) << endl;    }    return 0;}
0 0