weixin_40377939
weixin_40377939
2020-11-29 17:23
采纳率: 50%
浏览 3

c语言链表相关问题,跪求大佬解惑

 #include <stdio.h>
 #include <string.h>
 #define MAXLEN  16
 struct arashi {
         char    name[MAXLEN];
         int     nenrei;
         double  shincho;
         struct arashi *next;
         struct arashi *prev;
 };
 void print(struct arashi *);
 void dattai(struct arashi);
 int
 main()
 {
         struct arashi a, r, s, h, i;

         strcpy(a.name, "Aiba");
         strcpy(r.name, "Ninomiya");
         strcpy(s.name, "Matsumoto");
         strcpy(h.name, "Oono");
         strcpy(i.name, "Sakurai");
         a.nenrei = 37;
         r.nenrei = 37;
         s.nenrei = 37;
         h.nenrei = 39;
         i.nenrei = 38;
         a.shincho = 176.0;
         r.shincho = 168.3;
         s.shincho = 173.8;
         h.shincho = 166.5;
         i.shincho = 171.2;
         /**************** 10 lines */
         a.next=&r;
         r.next=&s;
         s.next=&h;
         h.next=&i;
         i.next=NULL;
         i.prev=&h;
         h.prev=&s;
         s.prev=&r;
         r.prev=&a;
         a.prev=NULL;
         /****************/

         printf("hitori nuketa\n");
         dattai(r);
         print(&a);

         printf("\nfutari nuketa\n");
         dattai(h);
         print(&a);
         return 0;
 }
 print(struct arashi *f)
 {
         struct arashi   *b;

         while (f!=NULL) {
                 printf("%-9s [%d, %.3f]\n", f->name, f->nenrei, f->shincho); 
                     b=f;
                     f=f->next;
         }
         putchar('\n');
          while (b) {
                 printf("%-9s [%d, %.3f]\n", b->name, b->nenrei, b->shincho); 
                     b=b->prev;
         }
 }
  void dattai(struct arashi){
      
  } 

dattai是删除数据的函数

要求除了dattai任何地方都不能修改,最后输出如图

跪求大佬解惑

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • JmanCryTears
    鲛人泣珠 2020-12-01 18:54
    已采纳

    void dattai(struct arashi  z)
    {
       struct arashi * pz,*pzz;
       struct arashi * nz,*nzz;
       if(((z.prev)->prev)==NULL)
            {
               (z.prev)->next=z.next;
               nz=z.next;
               nzz=z.prev;
               nz->prev=nzz;
            }
       else
          {
            (z.next)->prev=z.prev;
            z.prev->next=z.next;
          }
    }

     

    点赞 评论
  • JmanCryTears
    鲛人泣珠 2020-11-29 21:11

    看起来并不复杂,你的问题是:dattai函数具体应该怎么实现?

    点赞 评论
  • JmanCryTears
    鲛人泣珠 2020-11-30 21:21

    void dattai(struct arashi * z)
    {
      struct arashi *pz,*pzz;
      struct arashi * nz,*nzz;
      if(((z->prev)->prev)==NULL)
       {
         (z->prev)->next=z->next;
          (z->next)->prev=z->prev;
        }
      else
       {
         (z->next)->prev=(z->prev);
         (z->prev)->next=(z->next);      
       }

    }

    点赞 评论
  • JmanCryTears
    鲛人泣珠 2020-12-02 12:56

    void dattai(struct arashi  z)
    {
       struct arashi * pz,*pzz;
       struct arashi * nz,*nzz;
       if(((z.prev)->prev)==NULL)
            {
      /************************以输入参数为数据结构r为例。************************/
               (z.prev)->next=z.next;/*z.prev所引用的就是z的上一条数据机构,当输入为r时,也就是引用的a。(z.prev)->next修改的也就是a的下一条数据结构的地址。其值为z.next,也就是r.next,也就是h。*/
               nz=z.next;/*nz经过赋值之后,所引用的是h,即nz=h*/

               nzz=z.prev;/*nzz=a*/
               nz->prev=nzz;/*nz->prev所修改的是h的上一条数据结构的地址,即h->prev=a*/
    /*第一条指令处理的是在进行正向遍历输出时(a——>i)将r抹除;剩下的指令处理的是在进行反向遍历输出时(i->a)将r抹除。else块中的代码的意义与本处注释含义完全相同。*/
            }
       else
          {
            (z.next)->prev=z.prev;
            z.prev->next=z.next;
          }
    }

     

    点赞 评论

相关推荐