zyz 发表于 2017-11-22 20:29

C语言-VS2008-约瑟夫问题

本帖最后由 zyz 于 2017-11-22 21:14 编辑

是西电2016和2017年计算机科学与技术专业的考研题,约瑟夫问题,能单步调试得到正确结果,试卷挖了几个空,题目中pNode removeNode(pNode currentNode)函数中free()函数是没有注释的


经过测试问题出在pNode removeNode(pNode currentNode)请大佬们分析一下这个函数,尤其是free那里
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
      int id;
      struct node *next;
      struct node *pre;
}Node, *pNode;

pNode RingConstruct(int n){
      int i;
      pNode head,p,q;
      head=(pNode)malloc(sizeof(Node));
      head->id=1;
      p=head;
      for(i=2;i<=n;i++){
                q=(pNode)malloc(sizeof(pNode));
                q->id=i;
                p->next=q;
                q->pre=p;
                p=q;
      }
      p->next=head;
      head->pre=p;
      return head;
}

int boundMachine(int order)
{
      int boundlist={3,7,11,19};
      return boundlist[(order-1)%4];
}

pNode count(pNode first,int bound){
      pNode q=first;
      for(int i=2;i<=bound;i++)
                q=q->next;
      return q;
}

pNode removeNode(pNode currentNode){
      pNode first=currentNode->next;

      pNode p=currentNode;
      while(currentNode !=p->next) p=p->next;
      p->next=first;
      first->pre=p;

      printf("%d->",currentNode->id);
      //free(currentNode);
      return first;
}

int main()
{
      pNode first,toRemove;
      int i;
      first=RingConstruct(20);
      for(i=1;i<=20;i++){
                toRemove=count(first,boundMachine(i));
                first=removeNode(toRemove);
      }
      return 0;
}

6767 发表于 2017-11-22 22:32

18行,pNode
典型手贱的错误
没有良好的类型检查的问题

冀中平原 发表于 2017-11-22 20:47

一脸懵逼

zyz 发表于 2017-11-22 20:31

有学长学姐会吗?

zyz 发表于 2017-11-22 20:32

西电连续两年考这个,跪求修改后的代码

zyz 发表于 2017-11-22 20:53

冀中平原 发表于 2017-11-22 20:47
一脸懵逼

{:1_937:}可怜啊,好多分呢

zyz 发表于 2017-11-22 20:54

我写的这个如果不注释free那句就是这种错误

ftmovie 发表于 2017-11-22 21:06

分解了1.1点测试一下

zyz 发表于 2017-11-22 21:12

ftmovie 发表于 2017-11-22 21:06
分解了1.1点测试一下

单步调试没有任何问题,直到运行完出现正确的结果也没出错

万远方 发表于 2017-11-22 22:17

很久没来了,前排帮你顶一下,很久没碰C语言了
页: [1] 2
查看完整版本: C语言-VS2008-约瑟夫问题