xml地图|网站地图|网站标签 [设为首页] [加入收藏]

正规赌博平台

当前位置:网上十大正规赌博平台 > 正规赌博平台 > 网上十大正规赌博平台C语言字符串库函数的实现

网上十大正规赌博平台C语言字符串库函数的实现

来源:http://www.nb-machinery.com 作者:网上十大正规赌博平台 时间:2019-07-11 00:10

 C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:

本文实例讲述了PHP中串行化用法。分享给大家供大家参考,具体如下:

本章介绍邻接表无向图。在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了。和以往一样,本文会先给出C语言的实现;后续再分别给出C 和Java版本的实现。实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有错误或不足的地方,请不吝指出!

目录

1. 邻接表无向图的介绍
2. 邻接表无向图的代码说明
3. 邻接表无向图的完整源码

转载请注明出处:

更多内容:数据结构与算法系列 目录

//字符串长度  int strlen(const char *str)     {         assert(str != NULL);         int len = 0;         while (*str    != '\0')                len;         return len;     }    //字符串拷贝  char *strcpy(char *to, const char *from)  {      assert((to != NULL) && (from != NULL));      char * result = to;      while( (*to   = *from  ) != '\0')          NULL;      return result;         }  //strncpy(),如果from指向的字符个数少于count,则用'\0'补齐  char *strncpy(char *to, const char *from, size_t count)  {      assert((to != NULL) && (from != NULL));      char * result = to;      while(count--)      {          if(*from != '\0')          {              *to   = *from  ;          }          else          {              *to   = '\0';          }      }      return result;         }  //memset():把指定内存区域的前count个字节设置成字符c  void * memset(void* buffer, int c, size_t count)  {      assert(buffer != NULL);      char * p = (char *)buffer;      while(count--)          *p   = (char)c;      return buffer;  }    //查找字符串s中首次出现字符c的位置     char *strchr(char *str, int c)     {         assert(str != NULL);         for (; *str != (char)c;    str)             if (*str == '\0')                 return NULL;         return str;     }     //字符串连接  char *strcat(char *strDes, const char *strSrc)     {         assert((strDes != NULL) && (strSrc != NULL));         char *address = strDes;         while (*strDes != '\0')                strDes;         while ((*strDes    = *strSrc   ) != '\0')             NULL;         return address;     }    char *strncat(char *strDes, const char *strSrc, unsigned int count)     {         assert((strDes != NULL) && (strSrc != NULL));         char *address = strDes;         while (*strDes != '\0')                strDes;         while (count -- && *strSrc != '\0' )             *strDes    = *strSrc   ;         *strDes = '/0';         return address;     }       //查找字符串第一次出现的位置  char *strstr(const char *strSrc, const char *str)     {         assert(strSrc != NULL && str != NULL);         const char *s = strSrc;         const char *t = str;         for (; *strSrc != '\0';    strSrc)         {             for (s = strSrc, t = str; *t != '\0' && *s == *t;   s,   t)                 NULL;             if (*t == '\0')                 return (char *) strSrc;         }         return NULL;     }     //将字符串拷贝到新的位置   char *strdup_(char *strSrc)  {           if(strSrc!=NULL)           {               char *start=strSrc;               int len=0;               while(*strSrc  !='\0')                   len  ;                           char *address=(char *)malloc(len 1);               assert(address != NULL);                        while((*address  =*start  )!='\0');                return address-(len 1);            }           return NULL;       }

功能:串行化用于对对象的存储或者传输,通过反串行化得到这个对象。

邻接表无向图的介绍

邻接表无向图是指通过邻接表表示的无向图。

网上十大正规赌博平台 1

上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"共7条边。

上图右边的矩阵是G1在内存中的邻接表示意图。每一个顶点都包含一条链表,该链表记录了"该顶点的邻接点的序号"。例如,第2个顶点(顶点C)包含的链表所包含的节点的数据分别是"0,1,3";而这"0,1,3"分别对应"A,B,D"的序号,"A,B,D"都是C的邻接点。就是通过这种方式记录图的信息的。

内存拷贝函数:

  1. Person.class.php:

邻接表无向图的代码说明

1. 基本定义

// 邻接表中表对应的链表的顶点  typedef struct _ENode  {      int ivex;                   // 该边所指向的顶点的位置      struct _ENode *next_edge;   // 指向下一条弧的指针  }ENode, *PENode;    // 邻接表中表的顶点  typedef struct _VNode  {      char data;              // 顶点信息      ENode *first_edge;      // 指向第一条依附该顶点的弧  }VNode;    // 邻接表  typedef struct _LGraph  {      int vexnum;             // 图的顶点的数目      int edgnum;             // 图的边的数目      VNode vexs[MAX];  }LGraph;  

(01) LGraph是邻接表对应的结构体。
vexnum是顶点数,edgnum是边数;vexs则是保存顶点信息的一维数组。

(02) VNode是邻接表顶点对应的结构体。
data是顶点所包含的数据,而first_edge是该顶点所包含链表的表头指针。

(03) ENode是邻接表顶点所包含的链表的节点对应的结构体。
ivex是该节点所对应的顶点在vexs中的索引,而next_edge是指向下一个节点的。

2. 创建矩阵

这里介绍提供了两个创建矩阵的方法。一个是用已知数据,另一个则需要用户手动输入数据

2.1 创建图(用已提供的矩阵)

/*   * 创建邻接表对应的图(用已提供的数据)   */  LGraph* create_example_lgraph()  {      char c1, c2;      char vexs[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};      char edges[][2] = {          {'A', 'C'},           {'A', 'D'},           {'A', 'F'},           {'B', 'C'},           {'C', 'D'},           {'E', 'G'},           {'F', 'G'}};       int vlen = LENGTH(vexs);      int elen = LENGTH(edges);      int i, p1, p2;      ENode *node1, *node2;      LGraph* pG;          if ((pG=(LGraph*)malloc(sizeof(LGraph))) == NULL )          return NULL;      memset(pG, 0, sizeof(LGraph));        // 初始化"顶点数"和"边数"      pG->vexnum = vlen;      pG->edgnum = elen;      // 初始化"邻接表"的顶点      for(i=0; i<pG->vexnum; i  )      {          pG->vexs[i].data = vexs[i];          pG->vexs[i].first_edge = NULL;      }        // 初始化"邻接表"的边      for(i=0; i<pG->vexnum; i  )      {          // 读取边的起始顶点和结束顶点          c1 = edges[i][0];          c2 = edges[i][1];            p1 = get_position(*pG, c1);          p2 = get_position(*pG, c2);          // 初始化node1          node1 = (ENode*)malloc(sizeof(ENode));          node1->ivex = p2;          // 将node1链接到"p1所在链表的末尾"          if(pG->vexs[p1].first_edge == NULL)            pG->vexs[p1].first_edge = node1;          else              link_last(pG->vexs[p1].first_edge, node1);          // 初始化node2          node2 = (ENode*)malloc(sizeof(ENode));          node2->ivex = p1;          // 将node2链接到"p2所在链表的末尾"          if(pG->vexs[p2].first_edge == NULL)            pG->vexs[p2].first_edge = node2;          else              link_last(pG->vexs[p2].first_edge, node2);      }        return pG;  }  

createexamplelgraph()的作用是创建一个邻接表无向图。实际上,该方法创建的无向图,就是上面图G1。

2.2 创建图(自己输入)

/*   * 创建邻接表对应的图(自己输入)   */  LGraph* create_lgraph()  {      char c1, c2;      int v, e;      int i, p1, p2;      ENode *node1, *node2;      LGraph* pG;        // 输入"顶点数"和"边数"      printf("input vertex number: ");      scanf("%d", &v);      printf("input edge number: ");      scanf("%d", &e);      if ( v < 1 || e < 1 || (e > (v * (v-1))))      {          printf("input error: invalid parameters!n");          return NULL;      }        if ((pG=(LGraph*)malloc(sizeof(LGraph))) == NULL )          return NULL;      memset(pG, 0, sizeof(LGraph));        // 初始化"顶点数"和"边数"      pG->vexnum = v;      pG->edgnum = e;      // 初始化"邻接表"的顶点      for(i=0; i<pG->vexnum; i  )      {          printf("vertex(%d): ", i);          pG->vexs[i].data = read_char();          pG->vexs[i].first_edge = NULL;      }        // 初始化"邻接表"的边      for(i=0; i<pG->vexnum; i  )      {          // 读取边的起始顶点和结束顶点          printf("edge(%d): ", i);          c1 = read_char();          c2 = read_char();            p1 = get_position(*pG, c1);          p2 = get_position(*pG, c2);          // 初始化node1          node1 = (ENode*)malloc(sizeof(ENode));          node1->ivex = p2;          // 将node1链接到"p1所在链表的末尾"          if(pG->vexs[p1].first_edge == NULL)            pG->vexs[p1].first_edge = node1;          else              link_last(pG->vexs[p1].first_edge, node1);          // 初始化node2          node2 = (ENode*)malloc(sizeof(ENode));          node2->ivex = p1;          // 将node2链接到"p2所在链表的末尾"          if(pG->vexs[p2].first_edge == NULL)            pG->vexs[p2].first_edge = node2;          else              link_last(pG->vexs[p2].first_edge, node2);      }        return pG;  }  

create_lgraph()是读取用户的输入,将输入的数据转换成对应的无向图。

//memcpy(), 拷贝不重叠的内存块   void* memcpy(void* to, const void* from, size_t count)  {      assert((to != NULL) && (from != NULL));      void * result = to;      char * pto = (char *)to;      char * pfrom = (char *)from;      assert(pto < pfrom || pto > pfrom   count -1);      while(count--)      {         *pto   = *pfrom  ;      }      return result;  }    //memmove(), 拷贝重叠或者是不重叠的内存块   void* memmove(void* to, const void* from, size_t count)  {      assert((to != NULL) && (from != NULL));      void * result = to;      char * pto = (char *)to;      char * pfrom = (char *)from;      //to与from没有重叠      if(pto < pfrom || pto > pfrom   count -1)      {         while(count--)         {             *pto   = *pfrom  ;         }      }      //to与from有重叠,从后向前move      else      {         pto = pto   count -1;         pfrom = pfrom   count -1;         while(count--)         {            *pto-- = *pfrom--;         }      }      return result;  }
<?php
/*
作者 : shyhero
*/
class Person{ //声明一个Person类
  public $age;
  private $name;
  protected $sex;
  public function __construct($age="",$name="",$sex=""){
   $this -> age = $age;
   $this -> name = $name;
   $this -> sex = $sex;
  }
  public function say(){
   return $this -> age." ".$this -> name." ".$this -> sex;
  }
  function __sleep(){ //指定串行化时能提取的成员属性,没有参数,但是必须返回一个数组
   $arr = array("age","name");
   return $arr;
  }
  function __wakeup(){ //指定反串行化时,提取出来的值
   $this -> sex = "woman";
  }
}

邻接表无向图的完整源码

点击查看:源代码


本文由网上十大正规赌博平台发布于正规赌博平台,转载请注明出处:网上十大正规赌博平台C语言字符串库函数的实现

关键词: BBIN真人娱乐