回 帖 发 新 帖 刷新版面

主题:求助高手,关于数据结构课程设计(C语言版)

求助高手,关于数据结构课程设计(C语言版)

1、猴子选大王
任务:一堆猴子都有编号,编号是1,2,3 ...m ,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第N个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。
要求:
输入数据:输入m,n m,n 为整数,n<m
输出形式:中文提示按照m个猴子,数n 个数的方法,输出为大王的猴子是几号 ,建立一个函数来实现此功能 
2、建立二叉树,层序、先序遍历( 用递归或非递归的方法都可以)**
任务:
要求能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数;



请高手帮助,在此谢过了! 

回复列表 (共3个回复)

沙发

#include<stdio.h>
#include<stdlib.h>
#define M 100
#define ERROR 0
#define FALSE 0
#define TURE 1
#define OK 1

typedef  int  status;
typedef struct Bitree 
{
 char data;
 struct  Bitree *lchild, *rchild;
}Bitree,*bitree;

typedef struct 
{
 bitree a[M];
    int top ;
}stack;

status InitStack(stack *s)//初始化栈
{
 s->top = 0;

 return OK;
}

status PushStack(stack *s,bitree *T)//进栈操作


 if (s->top > 100)
 {
  return ERROR;
 }
 
   s->a[++s->top] = (*T);

 return OK;
}

status PopStack (stack *s, bitree *T)//出栈操作
{
 
 if ( s->top == 0)
 {
  return ERROR;
 }
    (*T) = s->a[s->top--];
 return OK;
}

status EmptyStack(const stack *s)//判断是否为空
{
 if ( s->top == 0)
 {
  return TURE;
 }
 else
 {
  return FALSE;
 }
}


status CreatBitree(bitree *T)//建树
{
    char ch;

 printf("请输入字符:");
 scanf("%c",&ch);
    getchar();
 printf("\n");
 if ( ch == ' ')
 {
  (*T) = NULL;
      return 0;
 }
    else
 {
  (*T) = (bitree)malloc(sizeof(Bitree));
  if(*T==NULL)
  {
   printf("memory allocation failed ,Goodbye");
   exit(1);
  }
     (*T)->data = ch;
  CreatBitree(&(*T)->lchild);
        CreatBitree(&(*T)->rchild);
 }
    return OK;
}

status PreOrderTraverse( bitree *T)//前序遍历
{
 stack s;
 InitStack(&s);
 
 while ((*T) != NULL || !EmptyStack(&s))
 {
  while (*T)
  {
   printf("%c",(*T)->data);
            PushStack(&s,&(*T));
   (*T) = (*T)->lchild;
  }
  if (!EmptyStack(&s))
  {
   PopStack(&s,&(*T));
   (*T) = (*T)->rchild;
  }
 }
    return OK;
}
status InorderTraverse( bitree *T)//中序遍历
{
 stack s;
 InitStack(&s);

 while((*T) != NULL || !EmptyStack(&s))
 {
  while (*T)
  {
   PushStack(&s,&(*T));
            (*T) = (*T)->lchild;
  }
  if (!EmptyStack(&s))
  {
   PopStack(&s,&(*T));
   printf("%c",(*T)->data);
   (*T) = (*T)->rchild;
  }
 }
 return OK;
}

status BefororderTraverse(bitree *T)//后序遍历
{
 int flag = 0;
 stack s;
 InitStack(&s);

 while((*T) != NULL || !EmptyStack(&s))
 {
  while (*T)
  {
   PushStack(&s,&(*T));
            (*T) = (*T)->lchild;
      flag = 0;
  }
       if (!EmptyStack(&s) && flag == 1)
  {
   printf("%c",(*T)->data);
  }
  if (!EmptyStack(&s))
  {
            PopStack(&s,&(*T));
         (*T) = (*T)->rchild;
            flag = 1;
  }
 }
 return OK;
}

int main(void)
{
 bitree T;

    int select ;

    CreatBitree(&T);

 do
 {
  printf("1:      进行前序遍历\n");
     printf("2:      进行中序遍历\n");
  printf("3:      进行后序遍历\n");
     printf("请选择:");
  scanf("%d",&select);
 }while( select < 1 || select > 4);
 
 switch(select)

 {
 case 1:
  printf("前序遍历:");
        PreOrderTraverse(&T);
        printf("\n");
  break;
 case 2:
        printf("\n中序遍历");
        InorderTraverse(&T);
     printf("\n");
  break;
 case 3:
        printf("\n后序遍历");
        BefororderTraverse(&T);
        printf("\n");
    default:
     break;
 }

 system("pause");
 return 0;
}

板凳

typedef struct bitnode//定义一个2叉数
{
 char data;
 struct bitnode *lchild ,*rchild;
}bitnode ,*bitree;

int CreatBitree(bitree *T)//建立一个2叉树
{
 char ch;
 
 printf("请输入字符:");
 scanf("%c",&ch);
    getchar();//吃掉残留的数据
 if ( ch ==' ')
 {
  (*T)=NULL;
         return 0;
 }
 else
 {
  (*T) = (bitree)malloc(sizeof(bitnode));
        if((*T) == NULL)
  {
   printf("memory allocation failed,goodbye");
   exit(1);
  }
  (*T)->data=ch;
  CreatBitree(&(*T)->lchild);
  CreatBitree(&(*T)->rchild);
 }

    return OK;
}

void PreOrderTraverse1(bitree T)// 前序遍历递归形式
{
 if(T)
 {
        printf("%c",T->data);
        PreOrderTraverse1((*T).lchild);
        PreOrderTraverse1((*T).rchild);
 }

}

void PreOrderTraverse2(bitree T)// 前序遍历非递归形式
{
 int top = 0;
 bitree a[M];
 
    
 while (T!=NULL||top!=0)
 {
  while ( T!=NULL)
  {
      printf("%c",T->data);
   a[++top] = T;
   T = T->lchild;
  }
  
  if(top > 0)
  {
   T = a[top--];
   T = T->rchild;
  }
 }
}

void InOrderTraverse1(bitree T)//中序递归形式访问
{
 if(T)

 {
        InOrderTraverse1(T->lchild);
  printf("%c",T->data);
  InOrderTraverse1(T->rchild);
 }
}

void InOrderTraverse2(bitree T)//中序非递归形式
{
 int top = 0;
 bitree s[M];
 

 while(T!=NULL||top!=0)
 {
  while(T!=NULL)
  {
   s[++top] = T;
   T = T->lchild;
  }
  
  if (top>0)
  {
   T = s[top--];
   printf("%c",T->data);
   T = T->rchild;
  }
 }
}

void BerforOrderTraverse1(bitree T)//后序递归形式
{

    if(T)
 {
  BerforOrderTraverse1((*T).lchild);
  BerforOrderTraverse1((*T).rchild);
  printf("%c",T->data);
 }
}

void BerforOrderTraverse2(bitree t) //
 {
    typedef struct node 
       { 
    bitree  t; 
       int tag;   
       } stack;
      stack s[100] ;
       int top=0;
      while (t!=NULL|| top!=0)
      {
    while (t!=NULL) 
          {
     s[++top].t=t;  
     s[top].tag=0; 
     t=t->lchild; 
    }
         while (top!=0 && s[top].tag==1) 
   {
    printf("%c" ,s[top--].t->data);
   }
      if (top) 
   { 
      s[top].tag=1;  
         t = s[top].t->rchild ; 
   }
  } 
}

3 楼

非常感谢大家!
猴子问题如果解决了
也请发给偶参考
谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册