赞
踩
利用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 1
typedef 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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。