首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于约瑟夫环的有关问题

2012-02-17 
关于约瑟夫环的问题谁帮我看下这个程序,关于约瑟夫环的,只给出了部分答案,是在找不到错误在哪里啊!C/C++ c

关于约瑟夫环的问题
谁帮我看下这个程序,关于约瑟夫环的,只给出了部分答案,是在找不到错误在哪里啊!

C/C++ code
#include  <stdio.h> 
#include <stdlib.h>

typedef struct Node
{
    int data;
    struct Node* link;
}linkNode;


linkNode* CreatLink(int len)
{
    int i;
    linkNode *head, *s, *p;
if ((head = (linkNode*)malloc(sizeof(linkNode))) == NULL)
{
printf("分配内存空间失败!");
exit(1);
}
head->data = 0;
head->link = NULL;
p = head;
    for (i = 0; i < len; i++)
    {
        if ((s = (linkNode*)malloc(sizeof(linkNode))) == NULL)
        {
            printf("分配空间失败\n");
            exit(1);
        }
        s->data = i + 1;
        s->link = NULL;
        p->link = s;
        p = s;
    }
    s->link = head->link;
    return head;
}

void delNode(linkNode* node)
{
    linkNode *temp;

    temp = node->link;
    node->data = temp->data;
    node->link = temp->link;

    free(temp);
}

int main()
{
    linkNode* head;
    linkNode *p, *q;
    int i = 0;
    head = CreatLink(10);
    p = head->link;
    while (p->link != p)
    {
      i++;
      q = 0;
      if (i % 3 == 0)
      {
          q = p;
          p = p->link;
          printf("%3d", q->data);
          delNode(q);
      }
      else
      {
          p = p->link;
      }
    }
    return 0;
}



[解决办法]
C/C++ code
#include <stdio.h>#include <stdlib.h>typedef struct Node{    int data;    struct Node* link;}linkNode;linkNode* CreatLink(int len){    int i;    linkNode *head, *s, *p;    if ((head = (linkNode*)malloc(sizeof(linkNode))) == NULL)    {        printf("分配内存空间失败!");        exit(1);    }    head->data = 0;    head->link = NULL;    p = head;    for (i = 0; i < len; i++)    {        if ((s = (linkNode*)malloc(sizeof(linkNode))) == NULL)        {            printf("分配空间失败\n");            exit(1);        }        s->data = i + 1;        s->link = NULL;        p->link = s;        p = s;    }    s->link = head->link;    return head;}void delNode(linkNode* pre,linkNode*p)//mark{    pre->link=p->link;    p=p->link;}int main(){    linkNode* head;    linkNode *p, *q;    int i = 1;//mark    head = CreatLink(10);    p = head->link;    while (p->link != p)    {        q = p;//mark        p = p->link;        i++;        if (i % 3 == 0)        {            printf("%3d", p->data);            delNode(q,p);        }    }    return 0;}
[解决办法]
删除节点不够彻底.
C/C++ code
#include <stdio.h>#include <stdlib.h>typedef struct Node{    int data;    struct Node* link;} linkNode;linkNode* CreatLink(int len){    int i;    linkNode *head, *s, *p;    if ((head = (linkNode*)malloc(sizeof(linkNode))) == NULL)    {        printf("分配内存空间失败!");        exit(1);    }    head->data = 0;    head->link = NULL;    p = head;    for (i = 0; i < len; i++)    {        if ((s = (linkNode*)malloc(sizeof(linkNode))) == NULL)        {            printf("分配空间失败\n");            exit(1);        }        s->data = i + 1;        s->link = NULL;        p->link = s;        p = s;    }    /*s->link = head->link;*/    p->link = head;    return head;}void delNode(linkNode* node){    linkNode *temp;    temp = node->link;    node->data = temp->data;    node->link = temp->link;        free(temp);}int main(){    linkNode *head;    linkNode *p, *q, *pre;    int i = 0;    head = CreatLink(10);    p = head->link;    while (p->link != p)    {       //printf("head=%p, p=%p\n", head, p);       if(head == p) { /*跳过头结点*/           p = p->link;           continue;       }       i++;       //q = 0;       q = NULL;       if (i % 3 == 0)       {           q = p;           p = p->link;           printf("%3d", q->data);           //delNode(q);           pre->link = p;           free(q);           q = NULL;       }       else       {       pre = p;           p = p->link;       }    }    return 0;} 


[解决办法]
《C++数据结构与经典问题》这本书上有个完整的例子,你可以研究下
或者自己试着调试下,找到错误
[解决办法]
我原来编过的一个程序,希望对你有帮助

C/C++ code
#include<stdio.h>#include<malloc.h>typedef struct Node//节点定义,包含序号num及密码code{    int num,code;    struct Node *next;}Node,*Linklist;Linklist initCycList()//初始化单循环链表(带头结点){    Linklist L;    L=(Linklist)malloc(sizeof(Node));    L->code=-1;    L->num=0;    L->next=L;//L->next指向头结点    return L;}void CreatCycList(Linklist L)/*输入数据创建约瑟夫环表*/{    int num,n;    int j;    Node *p,*r;    r = L;    j = 1;        scanf("%d",&n);        printf("请输入成员的密码:");    while(j <= n)    {            scanf("%d",&num);        p=(Node *)malloc(sizeof(struct Node));        p->code=num;        p->num= j;        r->next=p;        r=p;                j++;    }    r->next=L;}void main(){    Linklist L0;    int i=0,m;        Node *p,*f,*q;    L0=initCycList();    printf("这是一个约瑟夫环问题\n");    printf("请输入成员数:\n");    CreatCycList(L0);    printf("请输入第一个m的值: \n");    scanf("%d",&m);    printf("出列顺序为:\n");    p=L0;//p指向头结点    while(p->next!=p)    {        f=p;//f始终指向p的前驱        p=p->next;        if(p==L0)         {             f=p;            p=p->next;        }        i++;        if(i==m)        {             printf("%d ",p->num);            m=p->code;            f->next=p->next;            q=p;            free(q);            p=f;            i=0;        }    }    printf("\n");} 

热点排行