开天辟地的卷毛 2022-10-27 17:25 采纳率: 85.4%
浏览 32
已结题

C语言队列,入队的时候出现指针冲突


#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#define SIZE 66         //明示常量定义10,可以自行修改

typedef int datatype;

//设计结构体,定义用户相关信息
typedef struct client
{
    datatype id;        //用户id序号
    char name[SIZE];    /*定义字符数组存储用户名字,可考虑用字符指针,
    但是字符指针不能逐个打印字符,暂且先用字符数组*/
}nclient;

//设计队列节点类型(即节点的内容)
typedef struct node
{
    nclient data;       //队列节点的数据域具有nclient类型
    struct node* next;  //队列节点的next指针域
}ND, * PND;

//设计队列基本操作的指针
typedef struct linkqueue
{
    PND front;          //队头指针
    PND rear;           //队尾指针
}lq, * plq;

//构造函数,用于建立链式队列
plq initqueue(void)
{
    plq queue = (plq)malloc(sizeof(lq));  //定义一个队列,并且申请大小为队列操作本身lq的空间
    if (queue == NULL)                    //判断代码健壮性是否良好
        return NULL;

    queue->front = NULL;//队列头尾开始都指向NULL
    queue->rear = NULL;

    return queue;       //将*plq类型的queue返回
}

bool emqueue(plq queue)
{
    datatype id = 0;
    PND pnew = (PND)malloc(sizeof(ND));    //定义一个node类型新节点用于存放新用户信息
    if (pnew == NULL)                      //判断代码健壮性好坏
        return false;
    printf("please enter the client name: ");
    scanf_s("%s", pnew->data.name,SIZE);       /*atttion: 表达data的name,需要用.结构成员运算符。否则
                                          出现E3364错误, 结构体变量是用"."*/
    id++;                                  //插入用户名后,用户获得一个id,id+1
    pnew->data.id = id;                    
    pnew->next = NULL;                     //pnew指向空
    
    queue->rear->next = pnew;              //将rear的next指向新节点,完成节点的连接
    queue->rear = pnew;                    //将rear的位置移到最新节点位置,保证始终为队尾
    return false;
}

bool is_empty(plq queue)
{
    if (queue->front == queue->rear)
        return true;
    else
        return false;
}

bool dequeue(plq queue)
{
    if (is_empty(queue))
    {
        printf("the linkqueue is empty\n");
        return false;
    }
    PND ptamp = queue->front->next;
}

bool showqueue(plq queue)
{
    if (is_empty(queue))
    {
        printf("the linkqueue is empty\n");
        return false;
    }
    PND ptamp = queue->front->next;
    while (ptamp != queue->rear)
    {
        printf("%d", ptamp->data.id);
        printf("%s", ptamp->data.name);
        ptamp = ptamp->next;
    }
    return true;
}

int main(void)
{
    plq queue = initqueue();
    emqueue(queue);
    //showqueue(queue);
}

想问一下,这个是C语言的队列,在程序运行到第56行的时候发生了内存冲突,想问一下,是什么原因呀,该怎么解决?

  • 写回答

3条回答 默认 最新

  • 快乐鹦鹉 2022-10-27 17:39
    关注

    queue->rear->next = pnew;
    刚开始rear都是空的啊,你就操作next啊。得先判断rear是否为空,为空则rear就是新加入的节点

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月9日
  • 已采纳回答 11月1日
  • 创建了问题 10月27日

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line