寻找思考的意义 发表于 2017-10-18 11:13:28

魔术师发牌的问题

刚学数据结构与算法,在魔术师发牌问题遇到一个问题,编译没有错,但是运行程序时报错,请各位帮我看一下问题所在,不胜感激,

丶忘却的年少o 发表于 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;
        }
       
    return0;
}

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

寻找思考的意义 发表于 2017-10-18 12:51:57

丶忘却的年少o 发表于 2017-10-18 11:46
有问题点“回复”,没问题麻烦点一下“最佳答案”

非常感谢

寻找思考的意义 发表于 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不是头结点吗?

丶忘却的年少o 发表于 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

寻找思考的意义 发表于 2017-10-18 14:05:13

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

这一部分确实没有学好,谢谢大神的解答{:5_109:}

丶忘却的年少o 发表于 2017-10-18 14:10:44

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

讲真,别往下学,后面差不多都是需要用到线性表的内容,先搞懂线性表。
这个算法是很费脑子的,绕来绕去的,所以前几章基础的要理解

寻找思考的意义 发表于 2017-10-18 15:10:23

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

谢谢提醒,我打算重新学前面的,重新敲一下代码,打好基础,在往下学,方便加个联系方式吗,有问题的话还要请教你{:5_109:}

丶忘却的年少o 发表于 2017-10-18 15:54:02

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

论坛就可以了,我基本都在,你看我回复解答的频率就知道了。微信、QQ都不怎么用了
页: [1]
查看完整版本: 魔术师发牌的问题