⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 leihanghang.c

📁 用链表编写的自动机程序
💻 C
字号:
/*  checkp-lei.C -- check dfa */

#include "stdio.h"
#include "conio.h"
# include <stdlib.h>
#define Q0 0
#define Q1 1
#define Q2 2
#define Q3 3
#define ERROR 4
/*四种状态用数字来标表示
q0----0
q1----1
q2----2
q3----3
错误标识:
输入错----4
调用一个函数进行判断当前的数据是否是符合语法
*/
typedef char DataType;
typedef struct node
{
 DataType cdata;
 struct node *next;
}ListNode;

typedef ListNode *LinkList;  
ListNode *p;
LinkList head; 


/*创建链表*/
LinkList CreateList()
{
 char ch;
 ListNode *s,*r;
 head=(LinkList)malloc(sizeof(ListNode));
 r=head;
 head->cdata='*';
 while((ch=getchar())!='\n')
 {
  s=(LinkList)malloc(sizeof(ListNode));
  s->cdata=ch;
  r->next=s;
  r=s;
 }
 r->next=NULL;
 return head;
}

/*取得第i个结点*/
ListNode * getNode(int i)
{
 int j=0;
 ListNode *p;
 p=head;
 while(p->next!=NULL)
 {
  p=p->next;
  j++;
  if(j==i)
  {
   return p;
  }
 }
 return NULL;
}

/*清除链表*/
void freeList()
{
 int j=0;
 ListNode *p,*r;
 p=head;
 while(p->next!=NULL)
 {
  r=p->next;
  free(p);
  p=r;
 }
 free(p);
}

/*打印链表*/
void printList()
{
 ListNode *p;
 int i=0;
 if(head!=NULL)
 {
  p=head;
  while(p->next!=NULL)
  {
   p=p->next;
   printf("node[%d]=%c\n",i,p->cdata);
   i++;
  }
  
 }
}

/*检查输入*/
long checkq(char a,int q)
{
  long lflag=ERROR;
  if(a=='0')
  {
    switch(q)
    {
    case Q0: lflag=Q2;break;
    case Q1: lflag=Q3;break;
    case Q2: lflag=Q0;break;
    case Q3: lflag=Q1;break;
    default: lflag=ERROR;break;
    }
  }
  else if(a=='1')
  {
    switch(q)
    {
    case Q0: lflag=Q1;break;
    case Q1: lflag=Q0;break;
    case Q2: lflag=Q3;break;
    case Q3: lflag=Q2;break;
    default: lflag=ERROR;break;
    }
  }
  return lflag;
}
void checks()
{
    long lflag,lstate,i;
    ListNode *p;
    lstate=Q0;/*开始状态:5*/
    i=1;
    p=head;
    while((p=getNode(i))!=NULL)
    {
      lflag=checkq(p->cdata,lstate);
      lstate=lflag;
/*      printf("%c,%d\n",p->cdata,lflag);*/
      if(lflag<Q0||lflag>Q3)
      {
        lflag=ERROR;
        break;
      }
      i++;
    }
    if(lflag==Q0)
      printf("data input can be received\n");
    else
      printf("data input can not be received\n");
}
main()
{
    char ch;
    printf("please input data such as 0 or 1,input enter is over\n");
    do{
      CreateList();
      /*printList();*/
      checks();
      printf("\n\n\n\n");
      printf("please input q or Q for quit,anyone else will be checked again!\n");
      ch=getch();
      if(ch=='q'||ch=='Q')
        break;
      clrscr();
      printf("please input data such as 0 or 1,input enter is over\n");
      freeList();
    }while(1);
    free(p);
    printf("\n\n");
    printf("press any key to quit\n");
    getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -