鱼C论坛

 找回密码
 立即注册
查看: 3129|回复: 8

[已解决]魔术师发牌的问题

[复制链接]
发表于 2017-10-18 11:13:28 | 显示全部楼层 |阅读模式

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

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

x
刚学数据结构与算法,在魔术师发牌问题遇到一个问题,编译没有错,但是运行程序时报错,请各位帮我看一下问题所在,不胜感激,
最佳答案
2017-10-18 11:46:02
  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. #define CardNumber 13

  4. typedef struct Node{
  5.        
  6.         int data;
  7.         struct Node *next;                // 这里少了分号;
  8. } sqlList,*LinkList;


  9. LinkList CreateList(){
  10.        
  11.         int i;
  12.     LinkList head=NULL;
  13.     LinkList p,q;
  14.     p=head;
  15.   
  16.     for(i=1;i<=CardNumber;i++)
  17.         {
  18.                 q=(LinkList)malloc(sizeof(sqlList));
  19.                 q->data=0;
  20.         /*       
  21.                 head=q;       
  22.                 p->next=q;               
  23.                 这是要头插还是尾插?前一步头结点指向新结点,又让尾结点指向新结点
  24.         */
  25.                 if ( !head )                // 头结点空就放头结点后面
  26.                         head = q;
  27.                 else                                // 不空就放尾结点后面
  28.                         p->next = q;
  29.        
  30.                 p=q;       
  31.         }
  32.        
  33.         p->next=head;
  34.        
  35.         return head;       
  36. }


  37. void Mangic(LinkList *head)
  38. {
  39.     int Number=2;
  40.     int i;
  41.     LinkList p;
  42.     p= *head;                // head是二次指针,p是一次,解引用后再赋值
  43.     p->data=1;
  44.        
  45.     while(1)
  46.         {
  47.                 for(i=0;i<Number;i++)
  48.                 {
  49.                         p=p->next;
  50.                         if(p->data!=0)
  51.                         {
  52.                                 //p->next;
  53.                                 i--;
  54.                         }
  55.                 }
  56.                
  57.                 if(p->data==0)
  58.                 {
  59.                         p->data=Number;
  60.                         Number++;
  61.                        
  62.                         if(Number==14)
  63.                         {       
  64.                                 break;
  65.                         }
  66.                 }       
  67.         }       
  68. }

  69. int main(){
  70.        
  71.         int i;
  72.     LinkList l;
  73.     l=CreateList();
  74.        
  75.     Mangic(&l);
  76.        
  77.     for(i=0;i<CardNumber;i++)
  78.         {
  79.                 printf("%d ", l->data);
  80.                 l=l->next;
  81.         }
  82.        
  83.     return  0;
  84. }
复制代码


有问题点“回复”,没问题麻烦点一下“最佳答案”

Mangic.zip

556 Bytes, 下载次数: 6

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-18 11:46:02 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdlib.h>
  2. #include <stdio.h>

  3. #define CardNumber 13

  4. typedef struct Node{
  5.        
  6.         int data;
  7.         struct Node *next;                // 这里少了分号;
  8. } sqlList,*LinkList;


  9. LinkList CreateList(){
  10.        
  11.         int i;
  12.     LinkList head=NULL;
  13.     LinkList p,q;
  14.     p=head;
  15.   
  16.     for(i=1;i<=CardNumber;i++)
  17.         {
  18.                 q=(LinkList)malloc(sizeof(sqlList));
  19.                 q->data=0;
  20.         /*       
  21.                 head=q;       
  22.                 p->next=q;               
  23.                 这是要头插还是尾插?前一步头结点指向新结点,又让尾结点指向新结点
  24.         */
  25.                 if ( !head )                // 头结点空就放头结点后面
  26.                         head = q;
  27.                 else                                // 不空就放尾结点后面
  28.                         p->next = q;
  29.        
  30.                 p=q;       
  31.         }
  32.        
  33.         p->next=head;
  34.        
  35.         return head;       
  36. }


  37. void Mangic(LinkList *head)
  38. {
  39.     int Number=2;
  40.     int i;
  41.     LinkList p;
  42.     p= *head;                // head是二次指针,p是一次,解引用后再赋值
  43.     p->data=1;
  44.        
  45.     while(1)
  46.         {
  47.                 for(i=0;i<Number;i++)
  48.                 {
  49.                         p=p->next;
  50.                         if(p->data!=0)
  51.                         {
  52.                                 //p->next;
  53.                                 i--;
  54.                         }
  55.                 }
  56.                
  57.                 if(p->data==0)
  58.                 {
  59.                         p->data=Number;
  60.                         Number++;
  61.                        
  62.                         if(Number==14)
  63.                         {       
  64.                                 break;
  65.                         }
  66.                 }       
  67.         }       
  68. }

  69. int main(){
  70.        
  71.         int i;
  72.     LinkList l;
  73.     l=CreateList();
  74.        
  75.     Mangic(&l);
  76.        
  77.     for(i=0;i<CardNumber;i++)
  78.         {
  79.                 printf("%d ", l->data);
  80.                 l=l->next;
  81.         }
  82.        
  83.     return  0;
  84. }
复制代码


有问题点“回复”,没问题麻烦点一下“最佳答案”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 12:51:57 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-18 11:46
有问题点“回复”,没问题麻烦点一下“最佳答案”

非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 13:15:18 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-18 11:46
有问题点“回复”,没问题麻烦点一下“最佳答案”

LinkList head=NULL;
    LinkList p,q;
    p=head;

    for(i=1;i<=CardNumber;i++)
        {
                q=(LinkList)malloc(sizeof(sqlList));
                q->data=0;
        /*
                head=q;
                p->next=q;
                这是要头插还是尾插?前一步头结点指向新结点,又让尾结点指向新结点
        */
                if ( !head )                // 头结点空就放头结点后面
                        head = q;
                else                                // 不空就放尾结点后面
                        p->next = q;

                p=q;
        }

两个问题:1:这个header初始值位NULL,为什么下面那一步还要判断  2:头结点空就放头结点后面,这不是把q作为头结点吗?不空就放尾结点后面,p不是头结点吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 13:36:22 | 显示全部楼层
寻找思考的意义 发表于 2017-10-18 13:15
LinkList head=NULL;
    LinkList p,q;
    p=head;

好像楼主链表、头插法和尾插法没搞清楚,要好好看看哦,后面基本都用这些的。首先先声明一下,这个链表没有头结点,p是定位链表最后元素位置,q是生成的新元素链表。
问题1:看问题2
问题2:举个例子,小朋友春游,依次在班级牌(head指针)所在位置排队(元素)。每一个要加入队伍的小朋友是不是要看一下牌子后面有没有人(判断链表是否为空),没人直接站牌子后面(head = q),有人就站在队伍的后面。(到这里问题1就已经有答案了。)然后队伍的最后一名变成了新加入的那个小朋友(p = q),要是再来一个小朋友,那队伍最后一直都会是新来的(p = q)。最后所有小朋友都排好队了,让最后一个小朋友去拉第一个小朋友的手,形成一个环(圈),p->next = head
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 14:05:13 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-18 13:36
好像楼主链表、头插法和尾插法没搞清楚,要好好看看哦,后面基本都用这些的。首先先声明一下,这个链表没 ...

这一部分确实没有学好,谢谢大神的解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 14:10:44 | 显示全部楼层
寻找思考的意义 发表于 2017-10-18 14:05
这一部分确实没有学好,谢谢大神的解答

讲真,别往下学,后面差不多都是需要用到线性表的内容,先搞懂线性表。
这个算法是很费脑子的,绕来绕去的,所以前几章基础的要理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-18 15:10:23 | 显示全部楼层
丶忘却的年少o 发表于 2017-10-18 14:10
讲真,别往下学,后面差不多都是需要用到线性表的内容,先搞懂线性表。
这个算法是很费脑子的,绕来绕去 ...

谢谢提醒,我打算重新学前面的,重新敲一下代码,打好基础,在往下学,方便加个联系方式吗,有问题的话还要请教你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-18 15:54:02 | 显示全部楼层
寻找思考的意义 发表于 2017-10-18 15:10
谢谢提醒,我打算重新学前面的,重新敲一下代码,打好基础,在往下学,方便加个联系方式吗,有问题的话还 ...

论坛就可以了,我基本都在,你看我回复解答的频率就知道了。微信、QQ都不怎么用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 11:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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