猫仔嘎嘎可爱 2022-03-30 21:29 采纳率: 100%
浏览 222
已结题

PTA段错误,链表,指针

题目:在清华举办美食节的某一天的早上10点钟,有N个人试图去生煎包处排队,10点前发生了M个事件,事件大概分为以下4种

有人从队尾进入队伍
有人插队
有人等不及了从队伍中离开
要求10点钟时整个队伍的情况

输入格式:
输入第一行有两个用空格隔开的数N,M

接下来有M行,按时间先后顺序每行表述一个事件

I x:表示编号为x的人从队尾进入队伍

C x y:表示编号为x的人插队,排在y前一位

L x:表示编号为x的人从队伍中离开(这个人有可能还会回来)

我们保证同一时刻队伍里不会出现两个编号相同的人,也不会让没有进入队伍的人离开队伍且数据合法。

输出格式:
输出1行,表示队首到队尾所有人的编号,用空格隔开;如果队伍没有人输出“Bai Ren Zhan”(不含引号)

输入样例:
4 4
I 1
I 2
C 3 2
C 4 1
输出样例:
注意末尾有空格!

4 1 3 2
数据规模和约定
N<=100000,M<=100000

错误答案:

#include "stdio.h"
#include <stdlib.h>
struct Node
{
int data;
struct Node * next;
};
int main()
{
int N,c,d,M,i=0,k=0,j;
char type;
struct Node * head,*newnode,*L,*L1,*L3;
scanf("%d",&N);//数据数量
j=N;//记录n个数
head=(struct Node *)malloc(sizeof(struct Node));
head->next=NULL;//第一个结点为空

scanf("%d",&M);//m个操作
while(M>0)
{
    getchar();

    scanf("%c",&type);//操作指示符
    if(type=='I'||type=='C')//插入操作
    {
        if(type=='I'){
            scanf("%d",&d);
            newnode=(struct Node *)malloc(sizeof(struct Node));//新节点
            newnode->data=d;//赋值
            L=head->next;//指向第一个结点
            if(L==NULL){//插入第一个结点
                k++;
                newnode->next=head->next;
                head->next=newnode;
                L=newnode;
            }
            else {
                while(L->next!=NULL)//从第一个结点遍历链表
                {
                    
                    L=L->next;
                }
                k++;//结点数++
                L->next=newnode;//新节点指向该结点的后继结点
                newnode->next=NULL;
                newnode->data=d;//赋值
                L=newnode;
            }
        }
       
        if(type=='C'){
            L=head->next;
            scanf("%d %d",&d,&c);
            newnode=(struct Node *)malloc(sizeof(struct Node));//新节点
            newnode->data=d;//赋值
            if(c==1){
                newnode->next=head->next;
                head->next=newnode;
                L=newnode;
                k++;
            }

            else if(c>0&&c<=j+k)//j+K=老结点+新建结点数
            {
                
                while(L!=NULL)//从第一个结点遍历链表
                {
                    
                    i++;//记录到第几个了
                    if(i==c-1)//找到了
                        break;
                    
                    L=L->next;
                }
                newnode->next=L->next;//新节点指向该结点的后继结点
                newnode->data=d;//赋值
                L->next=newnode;
                L=newnode;//新节点变为新的后继节点
                    k++;//长度加一
                    i=0;//归零,下次重新查找
            }
        }
    }
    if(type=='L')//删除
    {
        scanf("%d",&d);
        L=head; 
        L1=L->next; 
       while(L1!=NULL){
           if(L1->data==d){
               L->next=L1->next;
               free(L1);
               break;
           }
            L=L1;
            L1=L1->next;
          
       }
    }
    M--;
}
L3=head->next;
while(L3!=NULL)
{
    printf("%d ",L3->data);
    L3=L3->next;
}
return 0;

}

img

运行这个测试用例是对的,但是pta报段错误,为什么啊

img

  • 写回答

2条回答 默认 最新

  • 关注

    type == 'C'的时候逻辑有问题啊,不是找的第c个,而是找编号为c的前一个节点,而且你的代码写的太繁琐了,代码修改如下:

    img

    #define _CRT_SECURE_NO_WARNINGS 1
    #include "stdio.h"
    #include <stdlib.h>
    struct Node
    {
        int data;
        struct Node* next;
    };
    int main()
    {
        int N, c, d, M, i = 0, k = 0, j;
        char type;
        struct Node* head, * newnode, * L, * L1, * L3;
        scanf("%d", &N);//数据数量
        j = N;//记录n个数
        head = (struct Node*)malloc(sizeof(struct Node));
        head->next = NULL;//第一个结点为空
    
        scanf("%d", &M);//m个操作
        while (M > 0)
        {
            getchar();
    
            scanf("%c", &type);//操作指示符
            if (type == 'I') //插入队尾
            {
                scanf("%d", &d);
                newnode = (struct Node*)malloc(sizeof(struct Node));//新节点
                newnode->data = d;//赋值
                L = head;//指向第一个结点
                //找到最后一个节点,并把新节点插入最后一个节点后面
                while (L->next)
                    L = L->next;
                L->next = newnode;
                newnode->next = NULL;
    
            }
            else if (type == 'C') //插入编号为c的前面
            {
                L = head;
                scanf("%d %d", &d, &c);
                newnode = (struct Node*)malloc(sizeof(struct Node));//新节点
                newnode->data = d;//赋值
                newnode->next = NULL;
                //查找编号为c的节点的前一个节点
                while (L->next->data != c)
                    L = L->next;
                if (L)
                {
                    newnode->next = L->next;
                    L->next = newnode;
                }
            }
            else if (type == 'L')//删除
            {
                scanf("%d", &d);
                L = head;
                L1 = L->next;
                while (L1 != NULL) {
                    if (L1->data == d) {
                        L->next = L1->next;
                        free(L1);
                        break;
                    }
                    L = L1;
                    L1 = L1->next;
    
                }
            }
            M--;
        }
        L3 = head->next;
        while (L3 != NULL)
        {
            printf("%d ", L3->data);
            L3 = L3->next;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型