李淳罡


私信TA

用户名:21020140218

访问量:2056

签 名:

一起刷题,一起变强

等  级
排  名 1381
经  验 2933
参赛次数 1
文章发表 7
年  龄 0
在职情况 学生
学  校 HNIT
专  业

  自我简介:

TA的其他文章

贪心+for+if求解
浏览:107

解题思路:
        这里提供都插法。

        所谓头插法就是我们建立一个空的节点来充当头部。这样建立的好处有利于本题的插入与删除。具体思路看我代码的注释

注意事项:
         我们要注意的是但插入与删除节点是否在我们链表的范围。
参考代码:

        

#include<stdio.h>

#include<stdlib.h>

typedef struct

{

    int num;

    //这里pnext,pfront分别代表该节点指向后一个节点和前一个节点

    struct stu *pnext,*pfrond;    

}stu;


int creat(int n,int a,int k,stu *phead,int length)

{

    stu *pnew=NULL,*pend=NULL,*pm;

    //同样的在这里我们分n的三种情况

    if(n==0){

        //当n=0时,我们只需要遍历输出就好了

        pnew=phead->pnext;

        while(pnew!=phead){

            printf("%d ",pnew->num);

            pnew=pnew->pnext;

        }

        printf("\n");

        //因为我们输出length没变所以返回length就好了

        return length;

    }else if(n==1){

        if(a>length+1)return length;

        //当我们插入一个节点时,是不是插入的位置最大只能在最大长度的后一个位置

        pnew=phead;

        int m=1,j;

        while(1){

            //这里我们遍历到插入节点的位置

            //这里我们同样分为两种情况,第一种就是当第一次插入节点时和第二次插入

            if(m==a){

                pm=(stu*)malloc(sizeof(stu));

                pm->num=k;

                if(pnew->pnext==NULL){

                    pm->pfrond=pnew;      //第一次

                    pnew->pfrond=pm;

                    pnew->pnext=pm;

                    pm->pnext=pnew;                  

                }else{

                    pm->pfrond=pnew;

                    pm->pnext=pnew->pnext;   //第二次及第二次以上

                    pend=pnew->pnext;

                    pend->pfrond=pm;

                    pnew->pnext=pm;

                }

                return length+1;      //我们没成功插入一个节点length的长度加一

            }

            pnew=pnew->pnext;

            m++;

        }

    }else if(n==2){

        //这里删除节点同样分为两种情况

        //第一种,就是删除的节点在我们链表的范围之内

        //第二种,就是不在我们链表的范围,此时就不需要删除节点了

        if(n>length)return length;   //没成功删除长度不变

        int i;

        pnew=phead;

        for(i=1;i<=a;i++){

            pnew=pnew->pnext;

        }

        pm=pnew->pfrond;

        pend=pnew->pnext;

        pm->pnext=pend;

        pend->pfrond=pm;

        free(pnew);

        return length-1;    //成功删除长度减一

    }

}


int main()

{

    int n,a,k,length=0;

    a=0,k=0;

    stu *phead;

    //定义一个头部的地址

    phead=(stu*)malloc(sizeof(stu));

    phead->pfrond=phead->pnext=NULL;

    //这里输入n,依题目可分为三种情况。1、n=0, 2、n=1, 3.n=2

    while(scanf("%d",&n)!=EOF){

        if(n==1){

            scanf("%d%d",&a,&k);

        }else if(n==2){

            scanf("%d",&a);

        }

        length=creat(n,a,k,phead,length);

        //这里函数creat的参数大致是这样设定的

        //当n=1时,我们这后面的a,k就代表了题目中的情况

        //当n=0时,我们虽然传了值进去,但在这里根据题目要求我们不使用它

        //当n=2是,我们k就没有用处就和n=0是a,k不使用类似

        //phead代表头部地址,length代表我们现在链表的单位长度,这里头部不计长度

    }

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »