大爱线性表 R转D删头部

在这里插入图片描述在这里插入图片描述在这里插入图片描述
以上是问题的描述
**

思路:

**
我是用双向链表做的。用flag变量标记R出现的次数,是正向还是反向。如果是正向就从头删除,反向就从尾巴删除。头和尾巴用两个指针指着。
具体写的时候

一、链表结点的定义
二、读入输入数据
三、构建双向链表
四、根据RD命令进行运算
五、输出

再具体一点的细节问题
二、
1.读入回车和字符挨着 要用getchar();吃掉
2.定义字符数组的时候要初始化 即char L1 [1000000]={’\0’}
三、
1.构建的时候要分n=0;n!=0两种情况。因为n=0是【】,n!=0是 【1,2,3】
2.当n!=0时 要把字符筛出来扔掉 我是用奇偶筛的
3.第一个结点用rear存,后面的新结点用new加循环 再和rear构建指向关系 rear一直是当前结点,当最后一个时候,rear就是尾结点了
四.
1.在D的时候分 再删越界 再删空了 再删正常三种情况 和 前后顺序
2.我用flag偶数表示正序,奇数表示逆序
T=2表示n=0一个元素没有了 2=‘’啊!‘’
T=4表示 死了 要输出error了 一般 死之前都要‘’啊!‘’一下嘛~
3.在我们学校oj写 free用不了 之后我就把free删掉了,如果用的话,再定义一个指针P,指向当前结点,再free§就好了
五.
输出根据(T=0)和 (T!=0)分两个大方向;即使正常的输出,还是花样(【】,error)输出.

贴代码了 如果有不对的地方 欢迎大家批评指正 -----

#include <stdio.h>
#include <stdlib.h>

typedef struct Node //定义节点结构
{
    long int data;
    struct Node *next,*prior;
} Linklist;

int main(void)
{
    long int num;   //num计数循环输入
    long int n,i=0,y;   //n是元素个数,i是计数单位,y是要写人链表里的数
    char l1[1000000]= {'\0'},x; //初始化操作串L1,x用来读没用的[,]
    Linklist *new,*rear,*front; //new新的结点,rear尾巴,front头
//开始读入数据 顺序是RDD 2 [1,2]
    scanf("%ld",&num);
    while(num--)
    {
        int T = 0;
        getchar();  //scanf后面有回车
        gets(l1);   //输入命令例如RRD
        scanf("%ld",&n);    //有多少元素
//开始赋值  front指向头 rear一直指向当前结点,之后走到最后一个变成尾结点的标志
        if(n == 0)
        {
            getchar();
            scanf("%c%c",&x,&x); //写入[] %c %c
            T = 2;
        }
        if(n > 0)
        {
            getchar();
            scanf("%c%ld",&x,&y); // x=[ 和 y=第一个数据
            rear = (Linklist*)malloc(sizeof(Linklist)); //第一个结点特殊化 方便与new循环
            rear->data = y;
            front = rear;
            for (i=3; i<=(2*n+1); i++) //之后的输入从第三个字符开始 到2*n+1 结束
            {
                if(i%2==1) //奇数是字符 ,]
                    scanf("%c",&x);//不加getchar();是连续输入无回车 [1 ,2,3,4]
                if(i%2==0) //偶数是数字
                {
                    scanf("%ld",&y);
                    new = (Linklist*)malloc(sizeof(Linklist));//数字留下来放表里
                    new->data = y;
                    rear -> next = new;
                    new ->prior = rear;
                    rear = new;
                }
            }//除了[1 的赋值结束括号
        }//if(n>0)的括号
//开始根据命令运算
        int flag=0; //用flag%2来判别是正向还是反向
        i = 0; //因为要遍历L1,所以i=0;
        while (l1[i]!='\0')
        {
            if(l1[i]=='R')
                flag++;
            if(l1[i]=='D')//分error,[],普通(正、反) 三种情况
            {
                if(T==2) //无元素可删了,越界了
                {
                    T = 4; //死了
                    break;//最糟糕了 没必要循环了
                }
                if(front==rear)
                    T = 2; //删掉了最后一个元素,n==0 ;
                if(flag%2==0&&T==0)
                    front = front -> next;//正向
                if(flag%2==1&&T==0)
                    rear = rear -> prior;//反向
            }
            i++;
        } //完成一次命令运算
//开始输出
        if(T==0) //普通输出
        {
            if(flag%2==0)
            {
                printf("[");
                while (front!=rear)
                {
                    printf("%ld,",front->data);
                    front = front->next;
                }
                if(front == rear)
                    printf("%ld]\n",front->data);
            }
            if(flag%2==1)
            {
                printf("[");
                while (front!=rear)
                {
                    printf("%ld,",rear->data);
                    rear = rear->prior;
                }
                if(front == rear)
                    printf("%ld]\n",rear->data);
            }
        }
        if(T!=0) //不是普通输出
        {
            if(T==4)
                printf("error\n");
            if(T==2)
                printf("[]\n");
        }
    } //循环输入结束一次
    return 0;
}
发布了8 篇原创文章 · 获赞 10 · 访问量 1946

猜你喜欢

转载自blog.csdn.net/weixin_43573750/article/details/93121810