读书人

关于约瑟夫环的有关问题

发布时间: 2012-02-17 17:50:42 作者: rapoo

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

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");} 

读书人网 >C语言

热点推荐