| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 475 人关注过本帖
标题:40分求解---大一题库:循环链表,求改错
只看楼主 加入收藏
t1melost
Rank: 1
等 级:新手上路
帖 子:22
专家分:3
注 册:2010-12-6
结帖率:70%
收藏
已结贴  问题点数:40 回复次数:3 
40分求解---大一题库:循环链表,求改错
题目要求:13个人围成一圈,从第一个人开始顺序报数1,2,3;凡报到3的就退出圈子。找出最后留在圈子中的人的原来序号。


思路:1.13个人,分别是13个节点,构成一个循环列表;
      2.对13个人分别进行标号(从1,2一直到13);
      3.3个人一个小循环;报到3的人就删除链表;

程序如下:   
#include <stdio.h>
#define k 13
#define null 0

struct stu
{
    int num;                                 /////num代表每次报的号数(1,2,3);
    int origi;                               ////origi代表每个人的序号,这个序号是一直不变的
    struct stu *next;
};


struct stu *creat(void)                               ////建立循环链表,13个人手牵手,围成一圈
{
    struct stu *p1,*p2,*head;
    int i;
    head=p1=p2=(struct stu*)malloc(sizeof(struct stu));
    for(i=0;i<k;i++)
    {
        p1=(struct stu*)malloc(sizeof(struct stu));
        p2->next=p1;
        p2=p1;
    }
    p2->next=head;
    return(head);
}

struct stu giveori(struct stu *head)                       ///对13个人的编号赋值(1到13)
{
    struct stu *p1;
    int i;
    p1=head;
    for(i=1;i<=k;i++)
    {
        p1->origi=i;
        p1=p1->next;
    }
}

struct stu givenum(struct stu *head)                          /////进行报数,1到3
{
    struct stu *p1;
    int i;
    p1=head;
    for(i=1;i<=3;i++)
    {
        p1->num=i;
        p1=p1->next;
    }
}

struct stu *del(struct stu *head)                /////发现报3就删除
{
    struct stu *p1,*p2;
    p1=p2=head;

    while(p1->num!=3)
    {
        p2=p1;
        p1=p1->next;
    }

    if(p1->num==3)
    {
    p2->next=p1->next;
    free(p1);
    }
    return(p2->next);
}


void main()
{
    int count=0;
    struct stu *head;
    head=creat();
    giveori(head);
    while(count<k-1)
    {
        givenum(head);
        head=del(head);
        count++;
    }
    printf("\n%d",head->origi);
    getch();
}



[ 本帖最后由 t1melost 于 2011-3-31 12:40 编辑 ]
搜索更多相关主题的帖子: null 
2011-03-31 12:38
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
#include <stdio.h>
#define k 13
#define null 0

struct stu
{
    int num;                                 /////num代表每次报的号数(1,2,3);
    int origi;                               ////origi代表每个人的序号,这个序号是一直不变的
    struct stu *next;
};


struct stu *creat(void)                               ////建立循环链表,13个人手牵手,围成一圈
{
    struct stu *p1,*p2,*head;
    int i;
    head=p2=(struct stu*)malloc(sizeof(struct stu));
    for(i=0;i<k;i++)
    {
        p1=(struct stu*)malloc(sizeof(struct stu));
        p2->next=p1;
        p2=p1;
    }
    p2->next=head;
    return  head;
}

void giveori(struct stu *head)                       ///对13个人的编号赋值(1到13)
{
    struct stu *p1;
    int i;
    p1=head;
    for(i=1;i<=k;i++)
    {
        p1->origi=i;
        p1=p1->next;
    }
}

void givenum(struct stu *head)                          /////进行报数,1到3
{
    struct stu *p1;
    int i;
    p1=head;
    for(i=1;i<=3;i++)
    {
        p1->num=i;
        p1=p1->next;
    }
}

struct stu *del(struct stu *head)                /////发现报3就删除
{
    struct stu *p1,*p2;
    p1=p2=head;

    while(p1->num!=3)
    {
        p2=p1;
        p1=p1->next;
    }

    if(p1->num==3)
    {
    p2->next=p1->next;
    free(p1);
    }
    return  p2->next;
}


void main()
{
    int count=0;
    struct stu *head;
    head=creat();
    giveori(head);
    while(count<k-1)
    {
        givenum(head);
        head=del(head);
        count++;
    }
    printf("\n%d\n",head->origi);
    getch();
}


   唯实惟新 至诚致志
2011-03-31 13:12
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:40 
#include <stdio.h>

int k;

struct stu
{
    int origi;                               ////origi代表每个人的编号
    struct stu *next;
};


void creat(struct stu **head)                               ////建立循环链表,13个人手牵手,围成一圈
{
    struct stu *p1,*p2;
    int i;
    p2=*head;
    for(i=0;i<k;i++)
    {
        p1=(struct stu*)malloc(sizeof(struct stu));
        (*head)->next=p1;
        *head=p1;
    }
    (*head)->next=p2->next;
    *head=(*head)->next;
}

void giveori(struct stu **head)                       ///对13个人的编号赋值(1到13)
{
    int i;
    for(i=1;i<=k;i++)
    {
        (*head)->origi=i;
        *head=(*head)->next;
    }
}

void del(struct stu **head)                          /////删除报3的人
{
    struct stu *p1;
    int i=1;
    *head=(*head)->next;
    i++;
    if(i==2)
    {
        (*head)->next=(*head)->next->next;
        *head=(*head)->next;
    }
    printf("%d  ",(*head)->origi);
}

int main()
{
    int count=1;
    struct stu *head;
    head=(struct stu*)malloc(sizeof(struct stu));
    printf("请输入人数:\n");
    scanf("%d",&k);
    creat(&head);
    giveori(&head);
    while(count<k)
    {
        del(&head);
        count++;
    }
    printf("最后留下的是第%d个人\n",head->origi);
    system("pause");
    return 0;
}

我的地盘
2011-03-31 21:42
hnuhsg1226
Rank: 9Rank: 9Rank: 9
来 自:中国
等 级:蜘蛛侠
威 望:2
帖 子:314
专家分:1314
注 册:2011-3-27
收藏
得分:0 
是在你原有的基础上改的

我的地盘
2011-03-31 21:42
快速回复:40分求解---大一题库:循环链表,求改错
数据加载中...
 
   



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

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