鱼C论坛

 找回密码
 立即注册
查看: 4141|回复: 25

循环链表如何实现逆向输出

[复制链接]
发表于 2017-9-4 07:51:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 qq783369750 于 2017-9-4 16:05 编辑

在这里贴上相关部分的代码,1为初始化,7为逆向输出。现在问题是逆向输出第一个元素并不能有效逆向。逆向输出代码我在网上找的,没看懂求大神解释一下谢谢~帮忙运行一下感激涕零了。
  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. typedef struct Linklist
  4. {
  5.         int n;
  6.         struct Linklist *next;
  7. }node;


  8. void list_init(node **p)
  9. {
  10.         node *temp;
  11.         node *target;
  12.        
  13.         int item;
  14.        
  15.         printf("输入结点的值,输入0完成初始化\n");
  16.        
  17.         while(1)
  18.         {
  19.                 printf("输入结点:");
  20.                 scanf("%d",&item);
  21.                 fflush(stdin);
  22.                
  23.                         if(item)
  24.                         {
  25.                                 if((*p)==NULL)
  26.                                 {
  27.                                         *p=(node*)malloc(sizeof(node));
  28.                                         /*if(!(*pNode))
  29.                                                 exit(0);*/
  30.                                         (*p)->n=item;
  31.                                         (*p)->next=*p;
  32.                                 }
  33.                                 else
  34.                                 {
  35.                                
  36.                                        
  37.                                         for(target=(*p);target->next!=(*p);target=target->next);//这句忘写了,扫描指针用来确定最后一个元素在哪里,不然无法确定最后一个元素
  38.                                        
  39.                                         temp=(node*)malloc(sizeof(node));
  40.                                        
  41.                                         temp->n=item;
  42.                                        
  43.                                         target->next=temp;
  44.                                         temp->next=*p;
  45.                                 }
  46.                                
  47.                         }
  48.                        
  49.                         else
  50.                         {
  51.                                 return;
  52.                         }       
  53.         }
  54. }

  55. void list_add(node **p,int i)
  56. {
  57.         int j;
  58.         int item;
  59.         node *target;
  60.         node *temp;
  61.         node *q;
  62.        
  63.         printf("输入你想要插入的值:");
  64.         scanf("%d",&item);
  65.        
  66.         if(i==1)
  67.         {
  68.                 temp=(node*)malloc(sizeof(node));
  69.                 temp->n=item;
  70.                
  71.                 for(target=*p;target->next!=*p;target=target->next);
  72.                
  73.                 temp->next=*p;
  74.                 target->next=temp;
  75.                 *p=temp;
  76.         }
  77.        
  78.         else if(i>1)
  79.         {
  80.                 temp=(node*)malloc(sizeof(node));
  81.                 temp->n=item;
  82.                
  83.                 target=*p;
  84.                
  85.                 for(j=1;j<(i-1);j++)
  86.                 {
  87.                        
  88.                         target=target->next;
  89.                 }
  90.                
  91.                
  92.                 q=target->next;
  93.                 target->next=temp;
  94.                 temp->next=q;
  95.                
  96.         }
  97.        
  98.         else
  99.         {
  100.                 printf("输入错误");
  101.                 return;
  102.         }
  103.        
  104. }

  105. void list_del(node **p, int i)
  106. {
  107.         node *target;
  108.         node *temp;
  109.         int j;
  110.        
  111.         temp=*p;
  112.        
  113.         if(i==1)
  114.         {
  115.                
  116.                 for(target=*p;target->next!=*p;target=target->next);
  117.                 target->next=target->next->next;
  118.                 *p=target->next;
  119.                 free(temp);
  120.         }
  121.        
  122.         else if (i>1)
  123.         {
  124.                 target=*p;
  125.                 for(j=1;j<i;j++)
  126.                 {
  127.                         temp=target;
  128.                         target=target->next;
  129.                  }
  130.                  if(target->next==*p)
  131.                  {
  132.                          temp->next=*p;
  133.                          free(target);
  134.                  }
  135.                  else
  136.                  {
  137.                          temp->next=target->next;
  138.                          free(target);
  139.                  }
  140.                  
  141.         }
  142. }

  143. void Traverse(node *p)
  144. {
  145.         int i;
  146.         node *target;
  147.         printf("链表为:");
  148.        
  149.        
  150.         if(p!=NULL)
  151.         {
  152.                 target=p;
  153.                 do                                                                //for(target->next!=p;target=target->next)
  154.                 {
  155.                         printf("%d ", target->n);                       
  156.                 }
  157.                 while((target=target->next)!=p);
  158.                
  159.         }
  160.         else
  161.         {
  162.                 printf("链表还未创建");
  163.         }
  164. }

  165. void list_suchen(node *p,int i)
  166. {
  167.         node *target;

  168.         int j=1;
  169.        
  170.        
  171.         //for(target=p;target->next!=p;target=target->next)
  172.         target=p;
  173.         do
  174.         {
  175.                 if(target->n==i)
  176.                 {
  177.                         printf("找到该元素在第%d个结点",j);
  178.                        
  179.                 }
  180.                
  181.                 j++;
  182.                
  183.         }
  184.         while((target=target->next)!=p);
  185.        
  186.         /*if(target->n==i)
  187.         {
  188.                 printf("找到该元素在第%d个结点",j);
  189.         }*/
  190. }

  191. void list_loesen(node **p)
  192. {
  193.         node *temp;
  194.         node *target;
  195.        
  196.         for(target=*p;target->next!=*p;target=target->next);
  197.        
  198.         target->next=NULL;
  199.        
  200.         free(*p);
  201. }

  202. int list_count(node *p)
  203. {
  204.         int j=1;
  205.         node *target;
  206.         for(target=p;target->next!=p;target=target->next)
  207.         {
  208.                 j++;
  209.         }
  210.         return j;
  211. }

  212. void list_l_print(node *p)
  213. {
  214.         node *target;
  215.        
  216.         for (target=p;target->next!=p;target=target->next)
  217.         {
  218.                 printf("%d ",target->n);
  219.         }

  220. }

  221. void list_r_print(node **p)
  222. {
  223.         node *current, *temp;
  224.         current=(*p)->next;
  225.         if(current!=(*p))
  226.         {
  227.                 temp=current;
  228.                 current=current->next;
  229.                 temp->next=(*p);
  230.         }
  231.              
  232.         while(current!=(*p))
  233.         {
  234.                 temp=current;
  235.                 current=current->next;
  236.                 temp->next=(*p)->next;
  237.                 (*p)->next=temp;
  238.         }
  239.        
  240. }



  241. int main()
  242. {
  243.         node *p=NULL;

  244.         char opp;
  245.         int find;
  246.         int count;
  247.        
  248.         while(opp!='0')
  249.         {
  250.                 scanf("%c",&opp);
  251.                 switch(opp)
  252.                 {
  253.                 case '1':
  254.                         list_init(&p);
  255.                         printf("\n");
  256.                         Traverse(p);
  257.                         break;
  258.                 case '2':
  259.                         printf("输入你想要插入节点的位置:");
  260.                         scanf("%d",&find);
  261.                         list_add(&p, find);
  262.                         printf("\n");
  263.                         Traverse(p);
  264.                         break;
  265.                 case '3':
  266.                         printf("输入你想要删除节点的位置:");
  267.                         scanf("%d",&find);
  268.                         list_del(&p, find);
  269.                         printf("\n");
  270.                         Traverse(p);
  271.                         break;
  272.                 case '4':
  273.                         printf("输入你想要查找的值:");
  274.                         scanf("%d",&find);
  275.                         list_suchen(p,find);
  276.                         break;
  277.                 case '5':
  278.                         list_loesen(&p);
  279.                         break;
  280.                 case '6':
  281.                         count=list_count(p);
  282.                         printf("链表一共有%d个元素",count);
  283.                         break;
  284.                 case '7' :
  285.                         list_r_print(&p);
  286.                         break;
  287.                        
  288.         }
  289. }
  290.         return 0;
  291. }
复制代码

输出之后就是这样的

输出之后就是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-4 09:15:15 | 显示全部楼层

回帖奖励 +5 鱼币

代码运行不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-4 16:04:37 | 显示全部楼层

现在可以运行了,我都贴上来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-4 18:40:58 | 显示全部楼层
qq783369750 发表于 2017-9-4 16:04
现在可以运行了,我都贴上来了

在输出时候,新建一个临时联表tmp,把原来的联表插入到tmp中,输出tmp就可,
倒插应该会吧?,就是每次都是在头节点处添加就行了
还有一种是递归。我也没有时间研究,你自己实现下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-9-5 00:33:15 | 显示全部楼层
本帖最后由 qq783369750 于 2017-9-5 00:35 编辑
ba21 发表于 2017-9-4 18:40
在输出时候,新建一个临时联表tmp,把原来的联表插入到tmp中,输出tmp就可,
倒插应该会吧?,就是每次都是在 ...


倒插会的,是不是要写一个倒插的初始化函数?那个怎样建立临时链表啊,可以一次建立两个链表的吗
我也想过这个方法,就是不知道怎样建立两个链表。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-5 08:30:40 | 显示全部楼层
qq783369750 发表于 2017-9-5 00:33
倒插会的,是不是要写一个倒插的初始化函数?那个怎样建立临时链表啊,可以一次建立两个链表的吗
我也 ...

读取的时候建立个临时表,边读边头插入临时表,最后直接读取临里表
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-10 23:08:14 | 显示全部楼层
已经解决,贴上自己的解决答案。

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

  3. int main(void)
  4. {
  5.         int temp,tempzahl,*lauf=NULL,*zahlen=NULL;
  6.         int i;
  7.         printf("Wie viele Zahlen moechten Sie eingeben?");
  8.         scanf("%d",&temp);
  9.        
  10.         zahlen=(int*)malloc(sizeof(int)*temp);
  11.         lauf=zahlen;
  12.        
  13.         for(i=0;i<temp;i++)
  14.         {
  15.                 printf("geben Sie die %d zahlen ein:",i+1);
  16.                 scanf("%d",&tempzahl);
  17.                 getchar();
  18.                 *lauf=tempzahl;
  19.                 lauf++;
  20.         }


  21.        
  22.         for(i=0;i<temp;i++)
  23.         {
  24.                 lauf--;
  25.                 printf("%d ", *lauf);

  26.         }
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-10 23:09:34 | 显示全部楼层
已经解决,贴上自己的解决答案。

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

  3. int main(void)
  4. {
  5.         int temp,tempzahl,*lauf=NULL,*zahlen=NULL;
  6.         int i;
  7.         printf("Wie viele Zahlen moechten Sie eingeben?");
  8.         scanf("%d",&temp);
  9.        
  10.         zahlen=(int*)malloc(sizeof(int)*temp);
  11.         lauf=zahlen;
  12.        
  13.         for(i=0;i<temp;i++)
  14.         {
  15.                 printf("geben Sie die %d zahlen ein:",i+1);
  16.                 scanf("%d",&tempzahl);
  17.                 getchar();
  18.                 *lauf=tempzahl;
  19.                 lauf++;
  20.         }


  21.        
  22.         for(i=0;i<temp;i++)
  23.         {
  24.                 lauf--;
  25.                 printf("%d ", *lauf);

  26.         }
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 15:36:41 | 显示全部楼层
                      加油把
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 15:36:56 | 显示全部楼层
我们一起研究               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-13 15:37:33 | 显示全部楼层
                                         我要鱼币去学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-14 14:16:47 | 显示全部楼层
拿了鱼币去学习!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-15 03:38:02 | 显示全部楼层

已经解决了额
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-15 03:38:34 | 显示全部楼层

没啦没啦,冲会员吧哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-16 11:10:50 | 显示全部楼层
顶楼主,希望你早日解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-17 15:49:51 | 显示全部楼层
谢谢楼主分享,加油↖(^ω^)↗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-17 15:51:15 | 显示全部楼层
加油↖(^ω^)↗,顶楼主喽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-17 15:54:34 | 显示全部楼层
我也想中奖,啊,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-17 15:55:23 | 显示全部楼层
谢谢楼主的分享喽,谢谢楼主大大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-17 15:56:01 | 显示全部楼层
为什么我就中不了奖呢,伤心&#128549;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 14:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表