C语言链队的相关操作

说实话顺序队列并不是很难,但是链队却比较花时间,辛苦写了一个队列,编译无压力通过,但是执行起来却总是Segmentation fault (core dumped),找了很久的bug无果,最后无奈又重写了一个,把复杂度往下降了一个等级,总算是成功了。不过在调试过程中依然发现有些许问题(在程序注释中有提到),若有幸得到大神指点,小弟感激不尽。
PS:今天上传图片时,总是提示Object reference not set to an instance of an object,所以图片就不上传了。

/************************************************************************* * > File Name: queue.c * > Author:heathcliff * > Mail:------------------- * > Created Time: 2016年04月01日 星期五 14时45分50秒 * ************************************************************************/
/*队列,队尾入队,队头出对*/
#include<stdio.h>
#include<stdlib.h>

typedef char ElemType; //ElemType相当于char
typedef struct QNode{
    ElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct 
{
    QueuePtr front; //创建对头指针
    QueuePtr rear; //创建队尾指针
}LinkQueue;

int length = 0;//计算队列的长度

/*初始化空队列*/
initQueue(LinkQueue *q)
{
    /*在这里可以建立一个head节点, * q->front = q->rear = head = (QueuePtr) malloc (sizeof(QNode)) 队头、队尾指针指向头节点 * head->next = NULL;头节点指向空值 * q->front = head; * q->rear = head; */
    q->front = q->rear = (QueuePtr) malloc (sizeof(QNode));

    if(!q->front) exit(0);//创建头节点失败
    q->front->next = NULL;//头节点指向空值
}

/*入队操作*/
EnQueue(LinkQueue *q,ElemType e)
{
    QueuePtr p;

    p = (QueuePtr) malloc (sizeof(QNode)); //为p指针分配空间

    if(!q->front) exit(0);//创建头节点失败

    /*在队尾插入值*/
    p->data = e;
    p->next = NULL;
    q->rear->next = p;
    q->rear = p;//队尾向后移动一位

    /*检校函数,目的是正确判断是否传入新值*/
    /*但是这里不知道为何在打印时打印两遍*/
    printf("q->rear->data = %c\n",q->rear->data);
    length++;//每传入一个新值,长度+1
}

/*出对操作*/
DeQueue(LinkQueue *q,ElemType *e)
{
    QueuePtr p;
    if(q->front == q->rear) return ;//队列为空

    p = q->front->next;
    *e = p->data;//保存出对指针的信息
    q->front->next = p->next;//头指针向后移动一位

    if(q->rear == p) q->rear = q->front;

    length --;//每出对一个值,长度-1
    free(p);
}

int main(void)
{
    ElemType e;
    LinkQueue q;
    initQueue(&q);

    printf("Please input a string into queue:\n");
    scanf("%c",&e);

    while(e!='@'){
        EnQueue(&q,e);
        scanf("%c",&e);
        printf("length = %d\n",length);
    }
    printf("The string into the queue is\n");

    while(q.front !=q.rear){
        DeQueue(&q,&e);
        printf("%c\n",e);
        printf("length = %d\n",length);
    }

    return 0;
}

你可能感兴趣的:(C语言)