今天看了点儿链表,用在我的footman上了

作者在 2006-06-11 04:26:00 发布以下内容

/*
我一直在想,像前两天我写的那个《魔兽》步兵的属性定义程序存在一个问题,虽然定义步兵的属性,比如血量,攻击力等,但是,那只是对这个游戏而言的,在游戏过程中,玩家训练步兵的数量是不一定的,那要看玩家需要训练多少,这就没办法用数组实现,因为数组声明的时候需要定义好数组元素的数量,例如魔兽100人口,如果为了给用户训练最大步兵量而把这个数组声明到最大,那样是十分耗费内存空间的。《魔兽》人口上限是100人口,每个步兵占2个,就是说,要声明到50,可是在早期的记事战略游戏,比如《帝国时代》,每个兵占1个人口,上限200,又如《红色警戒》,没有人口上限,如何声明呢?这两天看了链表,我受了点儿启发,我想应该是通过链表实现的,因为链表的结点是需要多少创建多少。所以今天我写了这样的一个程序,因为看的数据结构教材是c语言版的,所以暂且先拿c语言写了一个,过几天我将研究如何用c++实现链表,程序如下:
*/

#include <stdio.h>
struct footman      /*因为是c语言,所以只能用结构体了,不能用class*/
{
    int life;
    int attack;
    int defence;
};
typedef struct footman FTM;
struct node            /*声明节点*/
{
    FTM ftm;
    struct node *link;         /*递归式声明link指向下一结点*/
};
typedef struct node NODE;
main()
{
    int i,total;             /*total 是总人数*/
    NODE  *head,*p,*pr;
    head=NULL;               /*head指向首地址,赋值为空值*/
    printf("Please input the amount of footman you want to train:");
    scanf("%d",&total);
    for(i=0;i<total;i++)
    {
        p=(NODE *)malloc(sizeof(NODE));  /*malloc用来申请一个内存空间*/
        p->link=NULL;
        p->ftm.life=420;         /*这个地方我错过好几次了,一定要用p指向ftm*/
        p->ftm.attack=12;        /*原因就是p指向NODE,而ftm是在结点里声明的*/
        p->ftm.defence=3;
        if(i==0)                 /*当i==0时,p与pr指向首地址*/
        {
            head=p;
            pr=p;
        }
        else
        {                   /*当i!=1时,pr将下一个结点链入链表*/
            pr->link=p;
            pr=pr->link;     /*pr指向p,而下一个p在malloc语句中将这个pr引到下一个结点*/
        }                    /*p->link是用来指向链表的*/
    }
    for(p=head,i=0;p!=NULL;p=p->link)              /*循环输出*/
    {
        printf("the number %d footman''''s ",i);
        printf("life is %d",p->ftm.life);
        printf(", and atk is %d\n",p->ftm.attack);
        printf(", and def is %d\n",p-

C语言开拓 | 阅读 1525 次
文章评论,共0条
游客请输入验证码