标题:关于联赛赛程蛇形排阵的程序指导
只看楼主
歌舞伎町
Rank: 2
等 级:论坛游民
帖 子:30
专家分:38
注 册:2013-8-7
结帖率:66.67%
已结贴  问题点数:25 回复次数:3 
关于联赛赛程蛇形排阵的程序指导
(1楼求助内容,2楼贴代码)
小弟足球迷一枚,最近突发奇想,想编写代码实现如下功能:
输入若干个球队名称,输出每轮联赛的对阵情况
(ps:假设有20支球队,比如意甲,每支球队分别与其余19支球队各赛一场,那么就有19轮联赛)
在网上搜了一下蛇形排阵的算法简介,然后自己一晚上编写代码,成功实现,代码见2楼(需求助的地方已用红色标出)
(调试中有错误,共计修改5处,其中3处逻辑错误——指针不知道指哪去了,1处拼写错误,1处语法错误)
现求助如下:
1、在输入数据时,因为不知道怎么动态定义数组大小,因此采用结构体的方式,输入一个就开辟一块内存空间,小弟基础不牢,写的有些繁琐,请问有没有更好的方法,或者请各位帮忙指点一二,让代码更清晰点
2、代码中实现了算法,不过是采用结构体中加标识位,然后通过循环修改标识位实现匹配,感觉这样很繁琐,请问各位,有木有更好点的实现方法,或者对小弟的代码进行指导,使其更精简点
————————————————————————分割线———————————————————————————————————————————
小弟已阅读求助版规,也思考过,也调试过,不过还是有点不是很明白,求高手指点,代码稀烂,求轻喷……
搜索更多相关主题的帖子: 突发奇想 结构体 足球迷 动态 
2013-09-05 00:46
歌舞伎町
Rank: 2
等 级:论坛游民
帖 子:30
专家分:38
注 册:2013-8-7
得分:0 
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define Length sizeof(struct team)
//定义结构体用于存放球队名称,同时加上serial变量用于存放球队序号,用于后续蛇形排阵的标识;
struct team
{
    char name[20];
    int serial;
    struct team *next;
};

//当球队数量是奇数时,用Odd_Num函数;
void Odd_Num(struct team *p,struct team *q)
{
    struct team *temp1,*temp2;
    int i,j,k,quantity,swap;
    temp1=p;
    temp2=p;
    q->next=p;
    quantity=q->serial;
    for(i=1;i<quantity+1;i++)
    {
        printf("第%d轮比赛对阵情况\n",i);
        for(j=1;j<quantity/2+1;j++)
        {
            while(temp1->serial!=quantity-j)
            {
                temp1=temp1->next;
            }
            while(temp2->serial!=j)
            {
                temp2=temp2->next;
            }
            printf("%20s  vs  %-20s\n",temp2->name,temp1->name);
        }
        while(temp1->serial!=quantity)
        {
            temp1=temp1->next;
        }
        printf("%20s本轮轮空\n",temp1->name);
        temp2=p;
        temp1=q;
        swap=temp2->serial;
        for(k=1;k<quantity;k++)
        {
            temp2=temp2->next;
            temp1=temp1->next;
            temp1->serial=temp2->serial;
        }
        temp2->serial=swap;
    }
}

//当球队数量是偶数时,用Even_Num函数;
void Even_Num(struct team *p,struct team *q)
{
    //为保持循环转换标识位serial后,q、p指针不丢失,因此重新定义r指针指向第二支球队,同时定义temp1、temp2指针用于循环转换标识位;
    struct team *r,*temp1,*temp2;
    int i,j,k,quantity,swap;
    quantity=q->serial;//担心操作中会丢失q指针,因此将球队数量值赋给quantity变量;
    for(i=1;i<quantity;i++)//有quantity支球队,所以就有quantity-1轮比赛;
    {
        r=p->next;//r指向第二支球队
        q->next=r;//q指向r,这样除开第一支球队,后续的几个结构体形成了一个循环,便于操作;
        temp1=r;//temp1变量用于转换标识符使用;
        temp2=p;//temp2变量用于匹配j的值使用;
        printf("第%d轮对阵情况\n",i);
        for(j=1;j<=quantity/2;j++)
        {
            while(temp1->serial!=quantity+1-j)//按serial标识符匹配,两支标识符相加等于quantity+1的球队进行比赛;
            {
                temp1=temp1->next;
            }
            while(temp2->serial!=j)//依次匹配j,输出该轮其余场次比赛对阵情况;
            {
                temp2=temp2->next;
            }
            printf("%20s  vs  %-20s\n",temp2->name,temp1->name);
            temp2=p;//因为结尾处q的next指针指向第二支球队,因此让temp2变量回到最开头处(貌似不会来也行,毕竟j=1已经输出);
        }
        temp1=q;//将temp1变量指向结尾,即r的身后;
        swap=r->serial;
        for(k=1;k<quantity-1;k++)//r和temp1变量依次向前移动,依次挪动标识符;
        {
            r=r->next;
            temp1=temp1->next;
            temp1->serial=r->serial;
        }
        r->serial=swap;
    }
}

int main(int argc,char *argv[])
{
    int flag;
    struct team *first,*middle,*last;
    printf("请输入球队名称,以回车键分隔,以end结束\n");
    first=(struct team *)malloc(Length);
    gets(first->name);
    flag=1;
    first->serial=flag;
    flag++;
    first->next=NULL;
    middle=first;
    if(strcmp(middle->name,"end")!=0)
    {
        do
        {
            last=middle;
            middle->next=(struct team *)malloc(Length);
            middle=middle->next;
            gets(middle->name);
            middle->serial=flag;
            flag++;
        }while(strcmp(middle->name,"end")!=0);
        if(last->serial%2!=0)
        {
            Odd_Num(first,last);
        }
        else
        {
            Even_Num(first,last);
        }
    }
    getch();
    return(0);
}
2013-09-05 00:47
jg658237
Rank: 7Rank: 7Rank: 7
来 自:青藏高原
等 级:黑侠
帖 子:224
专家分:529
注 册:2013-8-8
得分:25 
代码太长,你问的问题又不明确,谁有时间看你这么长的代码啊,你在处理一下.

武功再高也怕菜刀.
2013-09-05 09:11
歌舞伎町
Rank: 2
等 级:论坛游民
帖 子:30
专家分:38
注 册:2013-8-7
得分:0 
回复 3楼 jg658237
是的,问题不明确,主要是基本功不到位,已经在网上自己找类似的代码研究了,谢谢指教……
2013-09-08 02:39



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




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

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