cici# 2023-03-13 14:00 采纳率: 100%
浏览 70
已结题

关于#c语言#的问题:但我的输出是运行错误,而且是段错误(可能是指针的地址问题,但我一直找不到哪个指针错了)

我用C语言写了一个银行排队系统,用了链队列。但我的输出是运行错误,而且是段错误(可能是指针的地址问题,但我一直找不到哪个指针错了)。这个问题困惑了我好几天了,能帮我看看是哪个错了吗。。

img

img

 输入样列
      OUT
     IN 1000001 Ordinary
      IN 2000003 VIP
      IN 2000009 VIP
      OUT
     OUT
      IN 2000008 VIP
     LIST
     QUIT
 输出样例
      FAILED:
      IN:1 1000001 Ordinary 0
      IN:2 2000003 VIP 1
      IN:32000009 VIP 2
     OUT:1 1000001 Ordinary
      OUT:22000003VIP
      IN:42000008VIP1
      LIST:
     32000009VIP
     42000008VIP
      GOOD BYE!
 #include <bits/stdc++.h>
using namespace std;
#define M 30

//创建客户信息数据类型
typedef struct
{
    int num;//取号的号码(客户编号)
    char guestnumber[M];//客户银行卡号码
    char guesttype[M];//客户类型
    int pre;//该客户前的客诉数就是rear-front-1;//因为链表中的元素不是在同一块空间中,所以该方法是不可行的
}ElementType;

//创建包含指针的结构体
typedef struct Node
{
    ElementType data;
    struct Node* next;
}Node;

//队列结构体
typedef struct
{
    Node *front;
    Node *rear;
}LinkQueue;

//创建一个空队列
LinkQueue *createQueue()
{
    LinkQueue *Q = (LinkQueue *)malloc(sizeof(LinkQueue));
    //创建头结点
    Q->front = (Node *)malloc(sizeof(Node));
//    printf("create headNode id: %p\n",Q->front);
    Q->front->next = NULL;
    Q->rear = Q->front;
    Q->front->data.num = 0;
    Q->rear->data.num = Q->front->data.num;
    Q->front->data.pre = 0;
    Q->rear->data.pre = Q->front->data.pre;

    return Q;
}

//判空
int empty(LinkQueue *Q)
{
    if(Q->front==Q->rear)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

//入队
int push(LinkQueue *Q, ElementType x)
{
    Node *p = (Node *)malloc(sizeof(Node));
//    printf("createNode id: %p\n",p);
    if(p==NULL)
    {
        return 0;
    }
    else
    {
    p->next = NULL;
    p->data = x;
    
    Q->rear->next = p;
    Q->rear = p;
    return 1;
    }
}

//出队
/*int pop(LinkQueue *Q)
{
    if(empty(Q))
    {
        return 0;
    }
    else 
    {
        Node *temp = Q->front->next;
        Q->front->next = temp->next;
        free(temp);
        return 1;
    }
}*/

//find输出队列长度
int find(LinkQueue *Q)
{
    int k = 0;
    Node *temp = Q->front;
    while(temp->next!=NULL)
    {
        k++;
        temp = temp->next;
    }
    temp = NULL;
    return k;
}


//VIP插队


//IN
void IN(LinkQueue *Q, int num)
{
    //读取数据
    ElementType p;
    scanf("%s %s",p.guestnumber,p.guesttype);
    p.num = num;
    p.pre = find(Q);
    push(Q, p);
    //将节点连入队列
    
    
    printf("IN:");
    printf("%d %s %s %d\n",p.num,p.guestnumber,p.guesttype,p.pre);    
    
}

//LIST//遍历队列元素
void LIST(LinkQueue *Q)
{
    printf("LIST:\n");
    //通过临时指针遍历队列
    Node *temp = Q->front->next;
    for(temp; temp!=NULL; temp=temp->next)
    {
        printf("%d %s %s\n",temp->data.num,temp->data.guestnumber,temp->data.guesttype);
    }
}

//OUT
void OUT(LinkQueue *Q)
{
    //空队列则返回0
    if(empty(Q))
    {
        printf("FAILED:\n");
    }
    else//队头出列
    {
        printf("OUT:");
        Node *temp = Q->front->next;
//        printf("head Ndoe id: %p\n",Q->front);
//        printf("first Ndoe id: %p\n",Q->front->next);
        Q->front->next = temp->next;
//        printf("second Node id: %p\n",Q->front->next);
        printf("%d %s %s\n",temp->data.num,temp->data.guestnumber,temp->data.guesttype);
        free(temp);
        temp = NULL;
//        printf("temp id: %p\n",temp);
    }
}

//QUIT
void QUIT(LinkQueue *Q)
{
    printf("GOOD BYE!\n");
    //队列的销毁
    while(Q->front)
    {
        Q->rear = Q->front->next;
//        printf("tail Node id: %p\n",Q->rear);
//        printf("will be DELETE Node id: %p\n",Q->front);
        free(Q->front);
        Q->front = Q->rear;
    }
//    free(Q->rear);
    free(Q);
    Q = NULL;
    exit(0);//退出程序
}


int main()
{
    int a = 0;//记录客户编号
    LinkQueue * Q = createQueue();
    char cmd[M];
    while(1)
    {
        scanf("%s",cmd);
        switch(cmd[0])
        {
            case'I':
            {
                a++;
                IN(Q,a);
                break;
            }
            case'L':
                LIST(Q);
                break;
            case'O':
                OUT(Q);
                break;
            case'Q':
                QUIT(Q);
                break;                    
        }
    }    
    return 0;
}
  • 写回答

3条回答 默认 最新

  • 快乐鹦鹉 2023-03-13 14:05
    关注

    输出前你执行了哪些操作啊,增删改查都执行了哪几个?

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

报告相同问题?

问题事件

  • 系统已结题 3月21日
  • 已采纳回答 3月13日
  • 创建了问题 3月13日

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分