| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1648 人关注过本帖
标题:求高手解决一条很难的指针问题
只看楼主 加入收藏
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
收藏
得分:0 
有意思的问题,不过这种报法不论有多少人,第一个报数的人好象都不会是最后留下的那个,那位大大可以编个程序验证一下啊
2010-08-08 13:21
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
托尔环问题,以前研究过
2010-08-08 19:17
sinoautom
Rank: 2
等 级:论坛游民
帖 子:13
专家分:24
注 册:2010-8-9
收藏
得分:0 
单链表比较直观~~用数组作也比较容易~~
2010-08-09 14:54
以中
Rank: 3Rank: 3
来 自:长沙
等 级:论坛游侠
帖 子:108
专家分:129
注 册:2010-4-13
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

struct student
{
    int num;
    struct student *next;
};

#define LEN sizeof(struct student)

//int n;

struct student *creat(int n)        //创建循环链表
{
    struct student *head = NULL;
    struct student *p1,*p2;
    int j;
    for(j=0;j<n;j++)
    {
            p1=(struct student *)malloc(LEN);
            p1->num=j;

         if(NULL == head)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
    }
   
    p1->next = head;
    return(head);
}

struct student *del(struct student *head, int n)        //删除满足要求的结点
{
    struct student *p1,*p2,*pfree;
    int i = 0;
   
    if(head==NULL)
    {
        printf("\nlist null!\n");
        return(head);
    }
   
    p1=head;

    while(p1->next != p1)            
    {
        ++i;
        p2 = p1;
        p1 = p1->next;
        if(i % 3 == 0)
        {
            pfree = p1;
            printf("%d\n",p1->num);
            p2->next = p1->next;
            free(pfree);
            p1 = p2;
        }
        
    }
    return p1;
}

void print(struct student *head, int n)        //因为是循环链表所以只能借助i来控制
{
    struct student *p;
    int i = 0;
    printf("\nNow,These %d records are:\n",n);
    p=head;
    if(head!=NULL)
    for(i = 0; i < n; i++ )
    {
        printf("%d",p->num);
       p=p->next;
     }
}

int main()
{
    int n;
    struct student *head;
   
    printf("input  n:\n");
    scanf("%d",&n);
   
    head =creat(n);
    print(head, n);
    printf("\nnow begin to delete number three.\n");
    head=del(head,n);
      printf("\nnow begin to show the last number.\n");  
      printf("The last num is %d!\n",head->num);
    free(head);
    return 0;
}

道之所存,师之所存。
2010-08-09 17:37
以中
Rank: 3Rank: 3
来 自:长沙
等 级:论坛游侠
帖 子:108
专家分:129
注 册:2010-4-13
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

struct student
{
    int num;
    struct student *next;
};

#define LEN sizeof(struct student)

//int n;

struct student *creat(int n)        //创建循环链表
{
    struct student *head = NULL;
    struct student *p1,*p2;
    int j;
    for(j=1;j<=n;j++)
    {
            p1=(struct student *)malloc(LEN);
            p1->num=j;

         if(NULL == head)
            head = p1;
        else
            p2->next = p1;
        p2 = p1;
    }
   
    p1->next = head;
    return(head);
}

struct student *del(struct student *head, int n)        //删除满足要求的结点
{
    struct student *p1,*p2,*pfree;
    int i = 1;
   
    if(head==NULL)
    {
        printf("\nlist null!\n");
        return(head);
    }
   
    p1=head;

    while(p1->next != p1)   /*如果这不是一个结点链表*/         
    {
        ++i;
        p2 = p1;
        p1 = p1->next;
        if(i % 3 == 0)
        {
            pfree = p1;
            printf("%d\n",p1->num);
            p2->next = p1->next;
            free(pfree);/*释放pfree所指的内存区*/
            p1 = p2;
        }
        
    }
    return p1;
}

void print(struct student *head, int n)        //因为是循环链表所以只能借助i来控制
{
    struct student *p;
    int i = 0;
    printf("\nNow,These %d records are:\n",n);
    p=head;
    if(head!=NULL)
    for(i = 0; i < n; i++ )
    {
        printf("%d",p->num);
       p=p->next;
     }
}

int main()
{
    int n;
    struct student *head;
   
    printf("input  n:\n");
    scanf("%d",&n);
   
    head =creat(n);
    print(head, n);
    printf("\nnow begin to delete number three.\n");
    head=del(head,n);
      printf("\nnow begin to show the last number.\n");  
      printf("The last num is %d!\n",head->num);
    free(head);
    return 0;
}

道之所存,师之所存。
2010-08-10 09:55
星舞突击者
Rank: 2
等 级:论坛游民
帖 子:15
专家分:68
注 册:2010-7-30
收藏
得分:0 
看了楼上的各位,差不多都是一样的,因为本人暑假数据结构学的差不多了,也来凑一下热闹,这学期我主要是把精力放在ACM算法和汇编上,希望下学期可以顺利进行编译原理的学习,lz的就是一个约瑟夫问题,我的思路是这样的哈,我定义了一个结构体数组,其实就是顺序表,每个结构体里存放两个变量,一个就是number(人的编号)另一个就是flag(判断是否被丢下水了),因为每次数到3的那个人我都把他的flag定位1,在经历一系列的循环后,我只要在最后输出的时候判断flag是否等于1,如果等于1就说明这个编号的人已经被丢下水了,如果不为1就输出它的number,只是在这个过程中遇到了一个问题,假如说n设为30,那么数到啊a【29】后下一个就是a【0】了,为了解决这个问题,不使用i=i+1,而是用i(i+1)%30,即求余,代码如下:数据被我换了。
程序代码:
#include<stdio.h>

#include<memory.h>
#define MAX_SIZE 30
typedef struct
{
    int number;
    int flag;
}People ;
People a[MAX_SIZE];

int main(void)
{
    int i=0;
    int j=0;//j表示被投入大海的人数
    memset(a,0,MAX_SIZE*sizeof(People));//清空数组
    for(i=0;i<MAX_SIZE;i++)
    a[i].number=i+1;//初始化结构体数组
    printf("开始扔人啦.\n");
   
     while(j<=14)//这个大的循环是为了按照123的顺序将数到3的人投入大海中
     {
         while(1)
         {
             if(a[i].flag==0)
             {
                 i=(i+1)%MAX_SIZE;
                 break;
            }
            else i=(i+1)%MAX_SIZE;
        }
       
        while(1)
         {
             if(a[i].flag==0)
             {
                 i=(i+1)%MAX_SIZE;
                 break;
            }
            else i=(i+1)%MAX_SIZE;
        }
       
        while(1)
        {
            if(a[i].flag==0)
            {
                a[i].flag=1;
                i=(i+1)%MAX_SIZE;
                j++;
                break;
            }
            else i=(i+1)%MAX_SIZE;
        }
       
       
    }
    printf("幸运者如下.\n");
    for(i=0;i<30;i++)
    {
        if(a[i].flag==0)
        printf("\n%d\n",a[i].number);
    }
    return 0;
}
ps:等我用链表再写一个约瑟夫,我再上传上来哈,呵呵,大家一起加油哈
2010-08-10 16:46
yuanfeng1129
Rank: 2
等 级:论坛游民
帖 子:62
专家分:31
注 册:2010-8-7
收藏
得分:0 
#include<stdio.h>
#include<stdlib.h>
main()
{
    int k,m,n,i,j,r,s,t,*p,b;
    scanf("%d%d",&n,&m);
    p=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;i++)
        *(p+i)=i+1;
    for(k=0,r=m,t=n,i=1;i<=n;i++)
    {
        s=(m%t?m%t:t)-1;
        b=*(p+s);
        for(j=s;j<t-1;j++)
            *(p+j)=*(p+j+1);
        t--;
        m=s+r;
    }
    free(p);
    printf("%d",b);
}
很早以前编的了,现在找出来了
2010-10-25 20:01
快速回复:求高手解决一条很难的指针问题
数据加载中...
 
   



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

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