打印
[嵌入式linux]

单链表(linux c)

[复制链接]
784|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
  因为之前对链表反转这一块一直**不清,现在复习总结一下,只要还是要了解复习指针地址操作,结构体定义。
  方法1:采用前插得方法,把节点从前边取出来然后再插到前边;分三步(具体看分解图)
  <一>先将第一个数字节点和头断开,然后接到链表最后
  <二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边
  <三>直到将所有的节点插完,然后将新的头结点和head相连
  先上完整的反转代码。。链表中存入了15个数


  
void fanxu(list *plist)
  {
  //标记首先需要的三个节点
  list *pwei=plist;
  list *per=plist->pnext;
  list *ptemp=NULL;
  while(pwei->pnext!=NULL)
  {
  pwei=pwei->pnext;
  }
  while(pwei!=per)
  {
  ptemp=per; //永远标记第二个节点
  per=per->pnext;
  //第一次要把链表头断掉
  if(pwei->pnext==NULL)
  {
  pwei->pnext=ptemp;
  ptemp->pnext=NULL; //断掉
  }
  else
  {
  ptemp->pnext=pwei->pnext; //前插
  pwei->pnext=ptemp; //然后再一块接到尾指针
  }
  plist->pnext=per; //为了打印显示,可以省
  printf("per-jietou--****************************************************************************************\n");
  showlist(plist);
  plist->pnext=pwei; //为了打印显示,可以省
  printf("pwei-jietou--***************************************************************************************\n");
  showlist(plist);
  printf("\n\n\n");
  }
  plist->pnext=per;
  }



  第一步:<一>先将第一个数字节点和头断开,然后接到链表最后


  第二步:<二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边


  ………
  第三步: <三>直到将所有的节点插完,然后将新的头结点和head相连


  ########################################################################################
  方法2:在方法1的基础上改进简化(创建新标志位) 主要理解while(p)是判断节点p的地址,p=q 是地址之间的重新赋值
  <一>定义三个新的节点标志位p q pr 将链表的前一个节点插下来;
  <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点
  <三>插完之后将新的标志位连接到之前的头结点打印
  ****************************************************************************************************************


  
void fanxu_gao(list *plist)
  {
  list *pr;
  list *p=plist->pnext;
  list *q=NULL;
  plist->pnext =NULL;
  while(p)
  {
  pr=p->pnext; //记录第二个地址
  p->pnext=q;
  q=p; //可以理解成给q和p重新赋值新地址
  p=pr; //标记第二个地址
  plist->pnext=q; //打印显示,可以没有
  printf("qqqqqqqqqqqqqqqqqg#############################################\n");
  showlist(plist);
  plist->pnext=p; // 打印显示可以没有
  printf("ppppppppppppppppppppz#############################################\n");
  showlist(plist);
  printf("\n\n\n");
  }
  plist->pnext=q;
  }



  ************************************************************************************************************************
  <一>定义三个新的节点标志位p q pr 将链表的前一个节点插下来;


  <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点


  <三>插完之后将新的标志位连接到之前的头结点打印


  ***************************************************************************************************************************
  最后在给大家分享些关于链表的资料可以进一步参考
  单链表
   makeru.com.cn/live/5413_1924.html?s=45051
  C语言玩转链表
  makeru.com.cn/live/1392_338.html?s=45051
  指针
  makeru.com.cn/live/1392_238.html?s=45051

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

12

帖子

0

粉丝