标题:约瑟夫环的相关问题以及void修饰的函数如何用指针返回链表地址 问题
只看楼主
nikobelic
Rank: 2
等 级:论坛游民
帖 子:37
专家分:30
注 册:2012-5-26
结帖率:25%
 问题点数:0 回复次数:13 
约瑟夫环的相关问题以及void修饰的函数如何用指针返回链表地址 问题
我自己写的程序有好多问题  虽然编译没事 可是我调试发现 我Creat完链表后 他没有将链表的地址返回 请大家帮忙看一下  谢谢了
 #include <stdio.h>
 #include <malloc.h>
 #include <string.h>
 typedef struct
 {
     int num;
     int passwd;
 }data;
 typedef struct LNode
 {
     data Data;
     struct LNode *next;
     
}LNode,*LinkList;  //LNode == *LinkList == struct LNode
 
void CreatList_L(LinkList *L,int n)
 {
     int i = 1;
     LNode *p,*q,*head;
     head = p = (LinkList)malloc(sizeof(LNode) ); //Head Node
     for(i = 1 ; i <= n ; i++)
     {
         p->Data.num = i;
         printf("Put int the passwd :");
         scanf("%d",&p->Data.passwd);
         q = (LinkList)malloc(sizeof(LNode) );
         p->next = q;
         p = p->next;
     }
     p->next = head; //Circle Link
}
 void Print_L(LinkList L)  //Print the circle link   Use to debug
{
     LNode *p;
     p = L;
     while(p->next != L)
     {
         printf("%d : %d\n",p->Data.num,p->Data.passwd);
         p = p->next;
     }
 }
 int Delete_L(LinkList *L,int m)   //@param is m , return is next m.
 {
     LNode *p,*q;
     int i = 1,m_new;
     p = L;
     while(i != m - 1)
     {
         p = p->next;
         i++;
     }
     q = p->next;
     p->next = q->next;
     printf("%d ",q->Data.num);
     m_new = q->Data.passwd;
     free(q);
     return m_new;
 }
 int GetLen_L(LinkList L)
 {
     LNode *p;
     int len = 1;
     p = L;
     while(p->next != L)
     {
         len++;
     }
     return len;
 }
 void main()
 {
     int n,m,temp;
     LinkList *L;   
   
    printf("Put in the n : ");
     scanf("%d",&n);
     
    CreatList_L(L,n); //此处L的地址为啥没被带回?
     Print_L(L);        //因为没有L的地址 所以根本无法打印出链表
 
    printf("Put in the m : ");
     scanf("%d",&m);
     while(GetLen_L(L) > 0)
     {
         temp = Delete_L(L,m);
         m = temp;
     }
 }
 
还有就是 请问我在定义函数时候  那个*L什么时候加*什么时候不加*
 
问题描述:
 约瑟夫(Joseph)问题的一种描述是:编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码〈正整数〉,一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。
 基本要求:
 利用单向循环链表存储结构模拟此过程,按照出列的顺序打印出各人的编号。
 实现提示:
 程序运行后首先要求用户指定初始报数上限值,然后读取各人的密码(小于30)。
 选作内容:
 在顺序存储结构上实现上述问题的操作。
 Input
 输入包括两行,第一行包括报数上限值m和人数n,第二行为n个人的密码,所有数据之间由空格分隔。
 Output
 输出一行,共n个整数,表示各编号人的出列顺序。各数之间由空格分隔。
 Sample Input
 20 7
 3 1 7 2 4 8 4
 Sample Output
 6 1 4 7 2 3 5
 
搜索更多相关主题的帖子: 如何 约瑟夫 include void 
2012-10-13 22:37
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
程序代码:
void CreatList_L(LinkList *L,int n)

 {
      int i = 1;
      LNode *p,*q,*head;
      head = p = (LinkList)malloc(sizeof(LNode) ); //Head Node
      for(i = 1 ; i <= n ; i++)
      {
          p->Data.num = i;
          printf("Put int the passwd :");
          scanf("%d",&p->Data.passwd);
          q = (LinkList)malloc(sizeof(LNode) );
          p->next = q;
          p = p->next;
      }
      p->next = head; //Circle Link
}
函数传入参数L干嘛用?
2012-10-13 23:46
nikobelic
Rank: 2
等 级:论坛游民
帖 子:37
专家分:30
注 册:2012-5-26
得分:0 
想带回一个链表地址
2012-10-13 23:55
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
回复 3楼 nikobelic
参数L 在函数中没有被使用

它怎么给你带值回去

[ 本帖最后由 寒风中的细雨 于 2012-10-14 00:11 编辑 ]
2012-10-14 00:09
nikobelic
Rank: 2
等 级:论坛游民
帖 子:37
专家分:30
注 册:2012-5-26
得分:0 
您看我改了下  还剩下的问题就是那个m了..#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct
{
    int num;
    int passwd;
}data;
typedef struct LNode
{
    data Data;
    struct LNode *next;
   
}LNode,*LinkList;  //LNode == *LinkList == struct LNode

void CreatList_L(LinkList L,int n)
{
    int i = 1;
    LNode *p,*q;
    q = L;//Head Node
    for(i = 1 ; i <= n ; i++)
    {
        p = (LNode *)malloc(sizeof(LNode) );
        p->Data.num = i;
        scanf("%d",&p->Data.passwd);
        q->next = p;
        q = p;
    }
    p->next = L->next; //Circle Link
}
void Print_L(LinkList L)  //Print the circle link   Use to debug
{
    LNode *p;
    p = L;
    do
    {
        p = p->next;        
        printf("%d : %d\n",p->Data.num,p->Data.passwd);

    }while(p->next != L->next);
}
void Delete_L(LinkList L,int m,int n)   //@param is m , return is next m.
{
    LNode *p,*q;
    int i = 1,j = 1;
    q =    p = L->next;
    while(j <= n)
    {
        while(i != m - 1)  //当m=1时就悲剧了
        {
            p = p->next;
            i++;
        }
        q = p->next;
        p->next = q->next;
        printf("%d ",q->Data.num);
        m = q->Data.passwd;
        free(q);
        p = p->next;
        i = 1;
        j++;
    }
}
void main()
{
    int n,m,temp;
    LinkList L;   

    scanf("%d",&m);
    scanf("%d",&n);

    L = (LinkList)malloc(sizeof(LNode));
    CreatList_L(L,n);
    Delete_L(L,m,n);
}
2012-10-14 00:19
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
断网了  不方便贴代码     delete_l   函数写错了  处理方式!
2012-10-14 01:14
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
程序代码:
 void Delete_L(LinkList L,int m/*,int n*/)   //@param is m , return is next m.
 {
     if (!L || !L->next || m <= 0)
     {
         return;
     }
     LinkList tmp = L->next, fp;
     while (tmp->next != tmp)
     {
         --m;
         if (1 == m)
         {//标记父结点
             fp = tmp;
         }
         if (0 == m)
         {
             fp->next = tmp->next;
             m = tmp->Data.passwd;
             printf ("%d ", tmp->Data.num);
             free(tmp);
             tmp = NULL;
             tmp = fp;
         }
         tmp = tmp->next;
     }
     if (tmp->next == tmp)
     {
         printf ("%d ", tmp->Data.num);
         free(tmp);
     }

 /*    LNode *p,*q;
     int i = 1,j = 1;
     q =    p = L->next;
     while(j <= n)
     {
         while(i != m - 1)  //当m=1时就悲剧了
         {
             p = p->next;
             i++;
         }
         q = p->next;
         p->next = q->next;
         printf("%d ",q->Data.num);
         m = q->Data.passwd;
         free(q);
         p = p->next;
         i = 1;
         j++;
     }*/

 }

 void main()

 {
     int n,m;
     LinkList L;   

    scanf("%d",&m);
     scanf("%d",&n);

    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;
     CreatList_L(L,n);
     Delete_L(L,m/*,n*/);
     printf("\n");

 }
2012-10-14 11:04
nikobelic
Rank: 2
等 级:论坛游民
帖 子:37
专家分:30
注 册:2012-5-26
得分:0 
sad

[ 本帖最后由 nikobelic 于 2012-10-14 15:46 编辑 ]
2012-10-14 14:09
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
得分:0 
回复 8楼 nikobelic
有问题
2012-10-16 19:20
nikobelic
Rank: 2
等 级:论坛游民
帖 子:37
专家分:30
注 册:2012-5-26
得分:0 
嗯  当m = 1时就出问题了  我加了一句话好像就可以了  不过老师非让我把那个Delete_L函数拆成两个函数  一个查找 一个删除 没弄出来。。

然后我又想弄个循环双链表试试做  没头绪啊  写成这样、、、大牛版主 求教
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
    int num;
    int passwd;
    struct LNode *next;
    struct LNode *prior;
}LNode,*LinkList;

LinkList Creat_L(int n)
{
    LNode *head,*p,*q;
    int i;
    head = NULL;
    for(i = 1;i <= n;i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d",&p->passwd);
        p->num = i;
        if(head == NULL)
        {
            head = q = p;
        }
        else
        {
            q->next = p;
            p->prior = q;
            q = p;
        }
        p->next = head;
        head->prior = p;
    }
    return head;
}
void Print_L(LinkList L)
{
    LNode *p;
    p = L;
    printf("%d ",p->passwd);
    p = p->next;
    while(p != L)
    {
        printf("%d ",p->passwd);
        p = p->next;
    }
}
void Delete_L(LinkList L,LNode *m)
{
    LNode *p;
    p = L;
    if(!L)
    {
        printf("Error!\n");
        exit(0);
    }
    while(p != m)
    {
        p = p->next;
    }
    L = p->next;  //&Iacute;·&Ouml;&cedil;&Iuml;ò&Iuml;&Acirc;&Ograve;&raquo;&cedil;&ouml;&frac12;&Uacute;&micro;&atilde;
    p->prior->next = p->next;
    p->next->prior = p->prior;
    printf("%d ",p->passwd);
    free(p);
}
LNode *Search_L(LinkList L,int m)
{
    LNode *p;
    int i;
    p = L;
    if(!L)
    {
        printf("Error!\n");
        exit(0);
    }
    for(i = 1;i != m ;i++)
    {
        p = p->next;
    }
    return p;//·&micro;&raquo;&Oslash;&ETH;è&Ograve;&ordf;&Eacute;&frac34;&sup3;&yacute;&micro;&Auml;&micro;&Oslash;&Ouml;·
}
void main()
{
    int n,m;
    LNode *head,*sp;
    scanf("%d%d",&m,&n);
    head = Creat_L(n);
//    Print_L(head);
    m %= n;
    while(m)
    {
        sp = Search_L(head,m);
        Delete_L(head,sp);
        m--;
    }

}
2012-10-16 20:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-383135-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.441395 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved