[嵌入式linux] 单链表(linux c)

[复制链接]
432|0
 楼主 | 2019-9-25 13:15 | 显示全部楼层 |阅读模式
  因为之前对链表反转这一块一直记忆不清,现在复习总结一下,只要还是要了解复习指针地址操作,结构体定义。
  方法1:采用前插得方法,把节点从前边取出来然后再插到前边;分三步(具体看分解图)
  <一>先将第一个数字节点和头断开,然后接到链表最后
  <二>然后按照上边的方法把剩下的链表中的节点一个接一个的插到前边
  <三>直到将所有的节点插完,然后将新的头结点和head相连
  先上完整的反转代码。。链表中存入了15个数


  
  1. void fanxu(list *plist)
  2.   {
  3.   //标记首先需要的三个节点
  4.   list *pwei=plist;
  5.   list *per=plist->pnext;
  6.   list *ptemp=NULL;
  7.   while(pwei->pnext!=NULL)
  8.   {
  9.   pwei=pwei->pnext;
  10.   }
  11.   while(pwei!=per)
  12.   {
  13.   ptemp=per; //永远标记第二个节点
  14.   per=per->pnext;
  15.   //第一次要把链表头断掉
  16.   if(pwei->pnext==NULL)
  17.   {
  18.   pwei->pnext=ptemp;
  19.   ptemp->pnext=NULL; //断掉
  20.   }
  21.   else
  22.   {
  23.   ptemp->pnext=pwei->pnext; //前插
  24.   pwei->pnext=ptemp; //然后再一块接到尾指针
  25.   }
  26.   plist->pnext=per; //为了打印显示,可以省
  27.   printf("per-jietou--****************************************************************************************\n");
  28.   showlist(plist);
  29.   plist->pnext=pwei; //为了打印显示,可以省
  30.   printf("pwei-jietou--***************************************************************************************\n");
  31.   showlist(plist);
  32.   printf("\n\n\n");
  33.   }
  34.   plist->pnext=per;
  35.   }
复制代码



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

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

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

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


  
  1. void fanxu_gao(list *plist)
  2.   {
  3.   list *pr;
  4.   list *p=plist->pnext;
  5.   list *q=NULL;
  6.   plist->pnext =NULL;
  7.   while(p)
  8.   {
  9.   pr=p->pnext; //记录第二个地址
  10.   p->pnext=q;
  11.   q=p; //可以理解成给q和p重新赋值新地址
  12.   p=pr; //标记第二个地址
  13.   plist->pnext=q; //打印显示,可以没有
  14.   printf("qqqqqqqqqqqqqqqqqg#############################################\n");
  15.   showlist(plist);
  16.   plist->pnext=p; // 打印显示可以没有
  17.   printf("ppppppppppppppppppppz#############################################\n");
  18.   showlist(plist);
  19.   printf("\n\n\n");
  20.   }
  21.   plist->pnext=q;
  22.   }
复制代码



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

  <二> 然后将节点插到一个新的标志位后边,同样的方法插后边的节点
单链表5.png

  <三>插完之后将新的标志位连接到之前的头结点打印
单链表6.png

  ***************************************************************************************************************************
  最后在给大家分享些关于链表的资料可以进一步参考
  单链表
   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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /3 下一条

在线客服 快速回复 返回顶部 返回列表