您现在的位置>>.Net中文社区>>.Net编程

创建广义表,判断广义表是否相等

浏览量: 作者:佚名 来源:CSDN博客
  1. //创建广义表 
  2. //算法思路: 从字符序列中分离出左部,右部,依次为左部和右部建立存储 
  3.  
  4. char s[61]; //设字符序列长度不超过60 
  5. //eg:  
  6. //  (a,b),(c),d,((e,f),g) 
  7. //  |    |              | 
  8. //  a    i              b 
  9. int sever(int a,int b) 
  10. {//从Sa->Sb中分离出左部,函数值为左部后面一个字符的下标 
  11.  int i,k; 
  12.  if(a>b) return 0; //a,b的大小弄错了 
  13.  k=0; 
  14.  i=a; //i是遍历的指针 
  15.  do  
  16.  { 
  17.   switch(s[i]) 
  18.   { 
  19.   case '(': k++;break//k=1 
  20.   case ')': k--;       //K=0 .这个时候while可以结束 
  21.   } 
  22.   i++; 
  23.  } while (!((k==0)&&(s[i]==',')||(i>b))); 
  24.  
  25.  return i; 
  26. //eg:  
  27. //  ((a,b),(c),d,((e,f),g)) 
  28. //  |                     | 
  29. //  i                     j 
  30. void create(node* &p,int i,int j) 
  31. {//根据Si~Sj 创建链表,返回表头指针p 
  32.  int k; 
  33.  node *q; 
  34.  if(i>j) 
  35.  { 
  36.   return NULL;//如果i,j的大小的不对. 
  37.  } 
  38.  else 
  39.  {//生成一个新的节点 
  40.   p=new node(); 
  41.   if(i==j) 
  42.   {//如果i,j指向一个原子节点,生成的节点存放原子值 
  43.    p->tag=0; 
  44.    p->atom=s[i];   
  45.   } 
  46.   else 
  47.   {//新生成的节点作表头节点 
  48.    p->tag=1; 
  49.    p->next=NULL; 
  50.    //去掉左右括号 
  51.    i++; 
  52.    j--; 
  53.  
  54.    //分离出左部和右部 
  55.    k=sever(i,j);  //k 左部的下一个字符 
  56.  
  57.    //递归处理左部 
  58.    create(p->head,i,k-1); //p->head为返回的左部建立的链表的头指针 
  59.    //递归处理右部 
  60.    q=p->head; //q为左部的指针 
  61.    while(q!=NULL) 
  62.    { 
  63.     i=k+1; 
  64.     k=sever(q->next,i,k-1); 
  65.     q=q->next; 
  66.    } 
  67.   } 
  68.  
  69.  } 
  70.  
  71.  
  72. //判断两个广义表是否相等 
  73. //算法思路:使用递归的方法,设Si是广义表S的第i个元素,Ti是广义表T的第i个元素 
  74. int equal(node* s,node* t) 
  75. {//s t是两个广义表的表头指针 
  76.  int r=0; 
  77.  if((s==NULL)&&(t==NULL)) 
  78.  {//如果两个广义表都是空的,就相等 
  79.   r=1; 
  80.  } 
  81.  else 
  82.  { 
  83.   if((s!=NULL)&&(t!=NULL)) 
  84.   {//如果两个广义表都不是空的 
  85.    if(s->tag == t->tag) 
  86.    { 
  87.     switch(s->tag) 
  88.     { 
  89.     case 0: //如果都是原始节点,并且值相等,next相等,就是相等的 
  90.      r=((s->atom==t->atom)&&(equal(s->next,t->next)==1)); 
  91.      break
  92.     case 1: //如果是子表,就判断head(它的下一级节点),next(它的同级别节点)是否相同. 
  93.      r=(equal(s->head,t->head)==1)&&(equal(s->next,t->next)==1); 
  94.     } 
  95.    } 
  96.   } 
  97.  } 
  98.  return r; 
本站部份资源来于互联网,只供学习之用,不得用于商业,如有侵犯版权请联系告知,本站将第一时间删除!
站长QQ:373638128 邮箱:navy1015@126.com
copyright © 2008 .Net中文社区 ASPXCS.NET™.All Rights Reserved 滇ICP备08102132号