链表--老鹰捉小鸡

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/*定义节点的结构体类型*/
struct Kid{
    char name[31];        //孩子的名字 
    char ID;            //孩子的身份 
    struct Kid *next;
}; 
typedef struct Kid Kid;
/*函数声明*/
Kid *StartGame( Kid *kidHeader, int n);
Kid *PlayOnce( Kid *pEagle, Kid *kidHeader);
void FinishGame( Kid *pEagle, Kid *kidHeader);
void ShowGame( Kid *pEagle, Kid *kidHeader);
#define N 6

/*主函数*/
int main(void){
    Kid *pEagle=NULL;
    Kid kidHen={"",'H'};
    Kid *p;
    if((pEagle=StartGame(&kidHen,N))==NULL){
        printf("Failed to allocate!\n");
        exit(1);
    }
    ShowGame(pEagle, &kidHen);        //模拟一次游戏 
    if( (p=PlayOnce( pEagle, &kidHen)) !=NULL){
        pEagle=p;
        ShowGame( pEagle, &kidHen); 
    } 
    else printf("Game failed!\n");
    FinishGame(pEagle, &kidHen);
}

/*各个函数的定义*/

/*函数1*/
Kid *StartGame( Kid *kidHeader, int n){
    Kid *pEagle=NULL;
    Kid *pChicken=kidHeader;
    int i;
    
    printf("Please enter the hen's name:");
    scanf("%s",kidHeader->name);
    printf("Please enter kid chicken's name in order:");
    for(i=0;i<n;i++){
        pChicken->next=(Kid*)malloc(sizeof(Kid));    //动态分配链表节点(小鸡)的空间 
        pChicken=pChicken->next;
        if(pChicken==NULL)return NULL;
        scanf("%s",pChicken->name);
        pChicken->ID='C';
        pChicken->next=NULL;
    }
    pEagle=(Kid*)malloc(sizeof(Kid));    //动态分配独立节点(老鹰)的空间 
    if (pEagle==NULL)return NULL;
    printf("Please enter the eagle's name:");
    scanf("%s",pEagle->name);
    pEagle->ID='E';
    pEagle->next=NULL;
    
    return pEagle;
}

/*函数2*/ 
Kid *PlayOnce( Kid *pEagle, Kid *kidHeader ){
    Kid *p, *pChicken;
    char chName[31]={};
    printf("Please enter the name of the chick who was caught:");
    scanf("%s",chName);
    p=kidHeader;
    while( p->next!=NULL && strcmp(p->next->name, chName)) p=p->next;
    if(p->next==NULL) return NULL;      //未找到以chName为名字的小鸡 
    pChicken=p->next;      //找到以chName为名字的小鸡,用pChicken指针来指向 
    p->next=pChicken->next;        //从队伍中去掉被抓住的小鸡 
    pChicken->next=NULL;
    pChicken->ID='E';      //修改小鸡身份 
    pEagle->ID='C';        //修改老鹰身份
    while(p->next!=NULL) p=p->next;
    p->next=pEagle;        //新小鸡加入队伍末尾 
    pEagle=pChicken;
    return pEagle;
} 

/*函数3*/
void FinishGame( Kid *pEagle, Kid *kidHeader){
    
    Kid *p=kidHeader->next;
    while(p!=NULL){
        kidHeader=p;
        p=p->next;
        free(kidHeader);
    }
    free(pEagle);
} 

/*函数4*/
void ShowGame( Kid *pEagle, Kid *kidHeader){
    Kid *p=kidHeader;
    printf("\t%s(%c)\t",pEagle->name,pEagle->ID);
    while(p!=NULL){
        printf("%s(%c)-",p->name,p->ID);
        p=p->next;
    }
    printf("||\n");
}

 

posted @ 2020-01-25 21:51  tkb  阅读(237)  评论(0)    收藏  举报