鱼C论坛

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

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

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

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

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

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

#define CardNumber 13

typedef struct Node{
        
        int data;
        struct Node *next;                // 这里少了分号;
} sqlList,*LinkList;


LinkList CreateList(){
        
        int i;
    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;        
        }
        
        p->next=head;
        
        return head;        
}


void Mangic(LinkList *head)
{
    int Number=2;
    int i;
    LinkList p;
    p= *head;                // head是二次指针,p是一次,解引用后再赋值
    p->data=1;
        
    while(1)
        {
                for(i=0;i<Number;i++)
                {
                        p=p->next;
                        if(p->data!=0)
                        {
                                //p->next;
                                i--;
                        }
                }
                
                if(p->data==0)
                {
                        p->data=Number;
                        Number++;
                        
                        if(Number==14)
                        {        
                                break;
                        }
                }        
        }        
}

int main(){
        
        int i;
    LinkList l;
    l=CreateList();
        
    Mangic(&l);
        
    for(i=0;i<CardNumber;i++)
        {
                printf("%d ", l->data);
                l=l->next;
        }
        
    return  0;
}

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

Mangic.zip

556 Bytes, 下载次数: 6

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

使用道具 举报

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

#define CardNumber 13

typedef struct Node{
        
        int data;
        struct Node *next;                // 这里少了分号;
} sqlList,*LinkList;


LinkList CreateList(){
        
        int i;
    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;        
        }
        
        p->next=head;
        
        return head;        
}


void Mangic(LinkList *head)
{
    int Number=2;
    int i;
    LinkList p;
    p= *head;                // head是二次指针,p是一次,解引用后再赋值
    p->data=1;
        
    while(1)
        {
                for(i=0;i<Number;i++)
                {
                        p=p->next;
                        if(p->data!=0)
                        {
                                //p->next;
                                i--;
                        }
                }
                
                if(p->data==0)
                {
                        p->data=Number;
                        Number++;
                        
                        if(Number==14)
                        {        
                                break;
                        }
                }        
        }        
}

int main(){
        
        int i;
    LinkList l;
    l=CreateList();
        
    Mangic(&l);
        
    for(i=0;i<CardNumber;i++)
        {
                printf("%d ", l->data);
                l=l->next;
        }
        
    return  0;
}

有问题点“回复”,没问题麻烦点一下“最佳答案”
想知道小甲鱼最近在做啥?请访问 -> 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-11-24 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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