动态游标for循环_数据结构系列循环链表

23609a8372a26a7506a74808ec0231ff.png

前面留的一个问题,后文更跟新回答

    单链表可以表示任意的线性关系,有些线性关系是循环的,既没有队尾元素。

    将单链表中的终端结点指针端由空指针改为指向头结点,这时的单链表形成国恒一个环,改为循环链表。

e42d061a5edb72ae9c17123ed3897407.png

b156d00db1ef84e5f91fa3a4f87021ce.png

    插入与删除与单链表的原理甚至一模一样,工程CircleListPro,将单链表改成循环链表。

CircleList.h文件

ifndef _CIRCLELIST_H_#define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNote;struct _tag_CircleListNode{  CircleListNode* next;  }CircleList* CircleList_Creat(int capacity);void CircleList_Destory(CircleList* list);void CircleList_Clear(CircleList* list);int CircleList_Length(CircleList* list);int CircleList_Insert(CircleList* list,CircleListNode* node,int pos);CircleListNode* CircleList_Get(CircleList* list,int pos);CircleListNode* CircleList_Delete(CircleList* list,int pos);#endif

CiecleList.c

#include #include #include "CircleList.h"#define AVAILABLE -1//空闲位置的宏//静态链表结构体定义typedef struct _tag_CircleList{  CircleListNode header;//链表头  int length;}TCircleList;  CircleList* CircleList_Create()//o(1){  TCircleList* ret = (TCircleList*)malloc(sizeof(TCircleList));    if(ret != NULL)//指针不为0时可以继续赋值操作    {      ret->length = 0;      ret->header.next = NULL;    }  return ret;}void CircleList_Destory(CircleList* list){  free(list);}void CircleList_Clear(CircleList* list) //o(1){  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换    if(sList != NULL)//链表不为空是合法的,可以继续清空操作    {      sList->length = 0;      sList->header.next  = NULL;//第一个元素下标没有了    }}int CircleList_Length(CircleList* list)//o(1){  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   int ret = -1;//定义一个返回值  if(sList !=NULL)//链表不为空是合法的,可以继续清空操作    {    ret = sList->length;    }      return ret;}// 插入时,如果表头是空的指向NULL,元素是空的,进行单链表元素插入时,现将插入元素// 尾结点与NULL相连,再把插入元素数据与前结点相连,再把该节点next与自己相连,去除原来NULL,构成循环链表int CircleList_Insert(CircleList* list,CircleListNode* node,int pos)//o(n)n是插入元素的位置·{  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   int ret =(sList !=NULL)&& (pos >=0) && (node != NULL);//单链表方法完成判断  int i=0;   if(ret)//在数组中找空闲位置index  {  CircleListNode* current = (CircleListNode*)sList;    for(i = 0;(inext != NULL); i++)  {    current = current->next;  }    node->next = current->next;  current->next = node;    if(sList->length == 0)// 插入的元素是第一个,length的值为0  {    node->next =  node;// 新元素node的next指针指向自己  }    sList->length++ ;}return ret;}CircleListNode* CircleList_Get(CircleList* list,int pos)// o(n){TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换 CircleListNode* ret = NULL;//定义一个返回值int i = 0;if((sList != NULL) &&(0 <= pos)//链表不为空是合法的,长度正常,与单链表不同的是不需要pos  {    CircleListNode* current = (CircleListNode*)sList;      for(i=0;i  {    current = current->next;//第一个元素所在下标  }   ret = current->next;  }return ret;}//获取第pos个元素,将第pos个元素从链表里删除//特殊的删除第一个元素,除了将表头next移到第二个元素之外,还要将最后一个next移到第二个nextCircleListNode* CircleList_Delete(CircleList* list,int pos)//o(n){  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   CircleListNode* ret = NULL;//定义一个返回值  int i = 0;  if( (sList !=NULL) && (0 <= pos) )//链表不为空是合法的,长度正常  {    CircleListNode* current = (CircleListNode*)sList;    CircleListNode* first = sList->header.next;// 标记第一个元素    CircleListNode* last = (CircleListNode*)CircleList_Get(sList,sList->length - 1);    // 由get函数得到最后一个元素    for(i=0;i      {        current = current->next;//第一个元素所在下标      }    ret = current->next;    current->next = ret->next;        sList->length--;        if(first == ret)// 判断删除元素是否是原来表头,first指针与原来ret指针是否是同一个      {        sList->header.next = ret->next;// 将表头指向ret        last->next = ret->next;// 指针移动到原来的第二个元素      }            if(sList->length == 0)// 如果链表空了则前面操作没有意义      {        sList->header.next = NULL;// 复原      }  }  return ret;}

main.c

#include #include #include  "CircleList.h"//自己创建的文件,而不是系统文件用双引号struct Value{  CircleListNode header;// 定义域  int v;// 真正保存数据的域}int main(int argc,char *argv[]){  int i = 0;  CircleList*  list = CircleList_Create();    struct Value v1;  struct Value v2;  struct Value v3;  struct Value v4;  struct Value v5;  struct Value v6;  struct Value v7;  struct Value v8;    v1.v = 1 ;  v2.v = 2 ;  v3.v = 3 ;  v4.v = 4 ;  v5.v = 5 ;  v6.v = 6 ;  v7.v = 7 ;  v8.v = 8 ;  // 尾插法,插入到最后一个元素后面  CircleList_Insert(list,( CircleListNode*)&V1, CircleList_Length(list));             CircleList_Insert(list,( CircleListNode*)&V2, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V3, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V4, CircleList_Length(list));     CircleList_Insert(list,( CircleListNode*)&V5,5);  CircleList_Delete(list,0);  // 证明是循环链表,删除第一个元素,循环两遍    for(i=0;i 2*CircleList_Length(    {      struct Value* pv = (struct Value*) CircleList_Get(list,i)      printf("%d\n",pv->v);    }    printf("\n");    while( CircleList_Length(list) > 0)// 循环链表还有元素从头开始删    {      struct Value* pv = (struct Value*) CircleList_Delete(list,0);      printf("%d\n",pv->v);    }   CircleList_Destory(list);     return 0;}

e0305915ba6c4a73cb6c4cac7f519fb2.png

    为了体现循环链表的威力,引入游标:在循环链表中定义一个“当前”指针,这个指针通常称为游标,可以通过这个游标来遍历链表中所有元素。

cad7b1f97202c8aa93c4293e2181b7e8.png

加了游标新操作CircleList.h文件

#ifndef _CIRCLELIST_H_#define _CIRCLELIST_H_typedef void CircleList;typedef struct _tag_CircleListNode CircleListNote;struct _tag_CircleListNode{  CircleListNode* next;  }CircleList* CircleList_Creat(int capacity);void CircleList_Destory(CircleList* list);void CircleList_Clear(CircleList* list);int CircleList_Length(CircleList* list);int CircleList_Insert(CircleList* list,CircleListNode* node,int pos);CircleListNode* CircleList_Get(CircleList* list,int pos);CircleListNode* CircleList_Delete(CircleList* list,int pos);// 加入游标新操作// 获取当前游标指向的数据元素,可以删除链表里某个数据元素,不需要先得到所要删除的数据下标CircleListNode* CircleList_DeleteNode(CircleList* list,CircleListNode* node);// 将游标重置指向链表中的第一个元素CircleListNode* CircleList_Resert(CircleList* list);// 将游标移动到链表的下一个数据元素CircleListNode* CircleList_Current(CircleList* list);// 直接删除链表中某个数据元素CircleListNode* CircleList_Next(CircleList* list);#endif
#include #include #include "CircleList.h"#define AVAILABLE -1//空闲位置的宏//静态链表结构体定义typedef struct _tag_CircleList{  CircleListNode header;//链表头  CircleListNode* sLidrer;// 定义游标  int length;}TCircleList;  CircleList* CircleList_Create()//o(1){  TCircleList* ret = (TCircleList*)malloc(sizeof(TCircleList));    if(ret != NULL)//指针不为0时可以继续赋值操作    {      ret->length = 0;      ret->header.next = NULL;      ret->slider  = NULL;// 在循环链表创建的时候,没有元素,游标定义为空    }  return ret;}void CircleList_Destory(CircleList* list){  free(list);}void CircleList_Clear(CircleList* list) //o(1){  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换    if(sList != NULL)//链表不为空是合法的,可以继续清空操作    {      sList->length = 0;      sList->header.next  = NULL;//第一个元素下标没有了      sList->slider  = NULL;// 循环链表重置为复原状态。游标也重置为空    }}int CircleList_Length(CircleList* list)//o(1){  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   int ret = -1;//定义一个返回值  if(sList !=NULL)//链表不为空是合法的,可以继续清空操作    {    ret = sList->length;    }      return ret;}// 插入时,如果表头是空的指向NULL,元素是空的,进行单链表元素插入时,现将插入元素// 尾结点与NULL相连,再把插入元素数据与前结点相连,再把该节点next与自己相连,去除原来NULL,构成循环链表int CircleList_Insert(CircleList* list,CircleListNode* node,int pos)//o(n)n是插入元素的位置·{  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   int ret =(sList !=NULL)&& (pos >=0) && (node != NULL);//单链表方法完成判断  int i=0;   if(ret)//在数组中找空闲位置index  {    CircleListNode* current = (CircleListNode*)sList;    for(i = 0;(inext != NULL); i++)  {    current = current->next;  }    node->next = current->next;  current->next = node;    if(sList->length == 0)// 插入的元素是第一个,length的值为0  {    slider->slider = node;// 游标指向插入的第一个结点    node->next =  node;// 游标默认初始位置为0,新元素node的next指针指向自己      }    sList->length++ ;}return ret;}CircleListNode* CircleList_Get(CircleList* list,int pos)// o(n){  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   CircleListNode* ret = NULL;//定义一个返回值  int i = 0;    if((sList != NULL) &&(0 <= pos)//链表不为空是合法的,长度正常,与单链表不同的是不需要pos    {      CircleListNode* current = (CircleListNode*)sList;          for(i=0;i    {      current = current->next;//第一个元素所在下标    }       ret = current->next;    }  return ret;}//获取第pos个元素,将第pos个元素从链表里删除//特殊的删除第一个元素,除了将表头next移到第二个元素之外,还要将最后一个next移到第二个nextCircleListNode* CircleList_Delete(CircleList* list,int pos)//o(n){  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   CircleListNode* ret = NULL;//定义一个返回值  int i = 0;  if( (sList !=NULL) && (0 <= pos) )//链表不为空是合法的,长度正常  {    CircleListNode* current = (CircleListNode*)sList;    CircleListNode* first = sList->header.next;// 标记第一个元素    CircleListNode* last = (CircleListNode*)CircleList_Get(sList,sList->length - 1);    // 由get函数得到最后一个元素    for(i=0;i      {        current = current->next;//第一个元素所在下标      }    ret = current->next;    current->next = ret->next;        sList->length--;        if(first == ret)// 判断删除元素是否是原来表头,first指针与原来ret指针是否是同一个      {        sList->header.next = ret->next;// 将表头指向ret        last->next = ret->next;// 指针移动到原来的第二个元素      }      if(slider->slider == ret)// SLIDER指向的元素和要删除的元素指针一致      {        sList->slider = ret->next ;// slider指向ret的下一个元素      }      if(sList->length == 0)// 如果链表空了则前面操作没有意义      {        sList->header.next = NULL;// 复原        sList->slider = NULL;// 删除的元素刚好为链表最后一个元素,游标复原为空      }  }  return ret;}// 获取当前游标指向的数据元素,删除对应的CircleListNode* node这个元素o(n0CircleListNode* CircleList_DeleteNode(CircleList* list,CircleListNode* node){// 该做的检测正常做  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   CircleListNode* ret = NULL;//定义一个返回值  int i = 0;     if (sList != NULL)   {    CircleListNode* current = (CircleListNode*)sList;// 做移动,查找node在循环链表的逻辑位置       for(i=0;ilength;i++)      {          if(current->next == node)          {              ret =current->next;              break;          }            current = current->next;          }           if(ret != NULL )// 找不到,非法元素           {               circleList_Delete(sList,i);// i就是所找到的删除位置,调用delete删除即可           }     }  return ret;}CircleListNode* CircleList_Resert(CircleList* list)// o(1)将游标重置指向链表中的第一个元素{// 该做的检测正常做  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   CircleListNode* ret = NULL;//定义一个返回值    if(sList != NULL )  {     slist->slider = sList->header.next;// slider重置到第一个元素     ret = sList->slider ;// 返回判断重置是否成功   }   return ret;}CircleListNode* CircleList_Current(CircleList* list)//  o(1)将游标移动指向到链表中的下一个数据元素{// 该做的检测正常做  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   CircleListNode* ret = NULL;//定义一个返回值      if(sList != NULL )  {     ret = sList->slider ;   }   return ret;  }CircleListNode* CircleList_Next(CircleList* list)//  o(1)直接删除链表中的某个数据元素 {// 该做的检测正常做  TCircleList* sList = (TCircleList*)list;//用到了数据封装,所以强制类型转换   CircleListNode* ret = NULL;//定义一个返回值  // 当前游标指向下一个元素    if((sList != NULL ) && (sList->slider != NULL ))  {     ret = sList->slider ;// 在移动之前把当前值保存作为返回值返回     sList->slider = ret->next;// 真正移动   }   return ret;}

循环链表的应用:约瑟夫问题

    n个人围成一个圆圈,首先从第一个人从1开始报数,报到第m个人,令其出列;然后再从下一个人继续报数,报到第m个人,再另其出列……如此下去,求其出列顺序。 

main.c

#include #include #include  "CircleList.h"//自己创建的文件,而不是系统文件用双引号struct Value{  CircleListNode header;// 定义域  int v;// 真正保存数据的域}int main(int argc,char *argv[]){  int i = 0;  CircleList*  list = CircleList_Create();    struct Value v1;  struct Value v2;  struct Value v3;  struct Value v4;  struct Value v5;  struct Value v6;  struct Value v7;  struct Value v8;    v1.v = 1 ;  v2.v = 2 ;  v3.v = 3 ;  v4.v = 4 ;  v5.v = 5 ;  v6.v = 6 ;  v7.v = 7 ;  v8.v = 8 ;  // 尾插法,插入到最后一个元素后面  CircleList_Insert(list,( CircleListNode*)&V1, CircleList_Length(list));             CircleList_Insert(list,( CircleListNode*)&V2, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V3, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V4, CircleList_Length(list));     CircleList_Insert(list,( CircleListNode*)&V5,5);  CircleList_Delete(list,0);  // 证明是循环链表,删除第一个元素,循环两遍    for(i=0;i 2*CircleList_Length(    {      struct Value* pv = (struct Value*) CircleList_Get(list,i)      printf("%d\n",pv->v);    }    printf("\n");    while( CircleList_Length(list) > 0)// 循环链表还有元素从头开始删    {      struct Value* pv = (struct Value*) CircleList_Delete(list,0);      printf("%d\n",pv->v);    }     printf("\n");       CircleList_Insert(list,( CircleListNode*)&V1, CircleList_Length(list));             CircleList_Insert(list,( CircleListNode*)&V2, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V3, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V4, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V5, CircleList_Length(list));             CircleList_Insert(list,( CircleListNode*)&V6, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V7, CircleList_Length(list));   CircleList_Insert(list,( CircleListNode*)&V8, CircleList_Length(list));   for(i=0;i < CircleList_Length(list);i++)// 查看八个人是否在循环链表中    {        struct Value* pv = (struct Value*) CircleList_Next(list)        // 先将当前的返回再移动        printf("%d\n",pv->v);      }       printf("\n");       CircleList_Resert(list); // 重置游标       // 解决约瑟夫问题       while( CircleList_Length(list) > 0)// 当链表中没有元素的时候停止出列     {         struct Value* pv = NULL;         for(i = 1;i < 3;i++)         {             CircleList_Next (list);// 这里的移动用游标来移动,所以很高效         }        pv = (struct Value*) CircleList_Current(list);        printf("%d\n",pv->v);         CircleList_DeleteNode(list,(CircleListNode*) pv );     }   CircleList_Destory(list);     return 0;}

小结;

循环链表只是在单链表的基础上做了一个加强

循环链表完全可以代替单链表

循环链表的Next和Current操作可以高效的遍历链表中的每个元素

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550358.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sas sql 读取最后一行数据_SAS基础编程和数据处理

前几天讲了数据分析中SQL的基本使用方法以及具体案例分析思路&#xff0c;接下来会继续讲统计基础以及在SAS软件内的应用&#xff0c;在这之前&#xff0c;本文先进行SAS基础使用编程的基础介绍&#xff0c;后续会主要阐述SAS软件内的统计数学的应用&#xff0c;如分析或初步建…

代码合并工具_分享几款比较常用的代码比较工具

俗话说&#xff1a;三句不离本行&#xff0c;对于程序员这个可爱的群体来说也是一样&#xff0c;即使面对无休无止的编程工作&#xff0c;程序员们依旧任劳任怨的埋头苦干&#xff0c;梦想着用自己码下的代码改变世界。工欲善其事,必先利其器&#xff0c;每一位程序员都有自己私…

循环控制

循环控制 定义 Python 循环语句是通过一条或多条语句的执行结果&#xff08;True 或者 False&#xff09;来决定执行的代码块。 并在符合条件的情况下跳出该段循环。 类似于控制语句。 如下图所示。 WHILE 循环 while 判断条件&#xff1a; 语句 求1~100的和 n 0 sum 0 while…

rest风格的get加密字符串怎么接收_RESTful Api的设计与风格,你该学一下咯

REST的重要概念REST全称是Representational State Transfer&#xff0c;中文意思是表征性状态转移。RESTful是指具有REST表征的web架构风格&#xff0c;并非必须遵守的规则。REST分离了API的结构和逻辑&#xff0c;主要应用于客户端和服务器交互类的软件。基于这种风格设计的软…

接口批量同步数据_千手接口平台+电商ERP,助德嵘大药房征战拼多多

拼多多对C端经营者来说&#xff0c;是一个处于红利期的第三方C端电商平台&#xff0c;进驻费比天猫低很多&#xff0c;而且流量成本也低&#xff0c;很多商家都跃跃欲试。但对于没有C端平台运营经验的商家&#xff0c;进驻后会发现几个"坑"&#xff1a;客单价低、退货…

php 接口有几种,【后端开辟】php接口有哪些范例?

接口是什么&#xff1f;运用接口(interface)&#xff0c;能够指定某个类必需完成哪些要领&#xff0c;但不须要定义这些要领的具体内容。接口是经由过程 interface 关键字来定义的&#xff0c;就像定义一个规范的类一样&#xff0c;但个中定义一切的要领都是空的。接口中定义的…

java是编译型语言还是解释型语言?

首先拿python和C说明&#xff0c;python运行速度慢&#xff0c;和C程序相比非常慢&#xff0c;因为Python是解释型语言&#xff0c;你的代码在执行时会一行一行地被python解释器翻译成CPU能理解的机器码&#xff0c;这个翻译过程非常耗时&#xff0c;所以很慢。而C/C程序是编译…

typedef函数指针_C语言函数指针之回调函数

1 什么是回调函数&#xff1f;首先什么是“回调”呢&#xff1f;我的理解是&#xff1a;把一段可执行的代码像参数传递那样传给其他代码&#xff0c;而这段代码会在某个时刻被调用执行&#xff0c;这就叫做回调。如果代码立即被执行就称为同步回调&#xff0c;如果过后再执行&a…

fedora 安装oracle 12c,Fedora 12下安装Oracle 11客户端

目标&#xff1a;将oracle-client(v11)安装到rdquo;/opt/oracle/rdquo;下准备好如下三个安装包&#xff0c;放在某个目录下&#xff0c;如&#xff1a;/root/software/ora目标&#xff1a;将Oracle-client(v11)安装到”/opt/oracle/”下准备好如下三个安装包&#xff0c;放在某…

轨迹跟踪主要方法_DELMIA教程:基于指令形式的机器人TCP轨迹局部跟踪方法

上一期为大家介绍了基于工具条中的“TCP Trace”命令按钮的全局TCP轨迹跟踪&#xff0c;之所以称之为全局轨迹跟踪&#xff0c;是因为只要命令被打开&#xff0c;机器人运行的全部轨迹都将实现跟踪。既然有全局TCP轨迹跟踪&#xff0c;那么就一定有局部TCP轨迹跟踪&#xff0c;…

[转帖]开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别

开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别 https://www.geek-workshop.com/thread-1860-1-1.htmlliamjeal电梯直达1# 发表于 2012-9-10 13:41:43 | 只看该作者 |只看大图 因CooCox用户数及影响力越来越大&#xff0c;CooCox团队也逐渐提高了对软件及代码协议的重…

qt 定时器累加值_零基础入门单片机定时器详解

一、基本定时器介绍在STM32中&#xff0c;基本定时器有TIM6、TIM7等。基本定时器主要包含时基单元&#xff0c;提供16位的计数&#xff0c;能计数0~65535。基本定时器除了计数功能以外&#xff0c;还能输出给DAC模块一个TRGO信号。基本定时器框图如下&#xff1a;二、时基单元介…

jvm 安装位置_简单了解JVM

1、JVM的位置&#xff1a;JVM是在操作系统上面的应用软件JVM虚拟机有三种如下&#xff1a;① Sun公司的HotSpot&#xff1b;    ② BEA公司的JRockit&#xff1b;    ③ IBM公司的J9 JVM&#xff1b;java虚拟机属于第一种&#xff1a;2、JVM的体系结构&#xff1a;3、类…

前端安全之 XSS攻击

参看&#xff1a; XSS的原理分析与解剖 前端安全 -- XSS攻击 web大前端开发中一些常见的安全性问题 1、前言 XSS 是面试时&#xff0c;hr提出来给我的&#xff0c;然后大体的浏览一遍&#xff0c;今天才查阅资料大体了解了它。 XSS 攻击&#xff1a;攻击者向HTML页面传入恶意的…

图片

转载于:https://www.cnblogs.com/water-1/p/11138418.html

idea 调节背景护眼_夜间用电脑亮瞎眼睛?这份夜间护眼指南来帮你。

题图&#xff1a;来自 Unsplash文/彭宏豪&#xff0c;笔名/安哥拉不知从什么时候起&#xff0c;「头秃」成了网友和周围人口中的一个高频词汇&#xff0c;似乎很多事情都离不了头秃——学到头秃、工作到头秃、熬夜到头秃等等&#xff0c;就连「突然」也渐渐演变成「秃然」。但对…

编写有效用例电子版_剖析用例设计方法的使用

今天给大家讲解的是用例设计方法的使用&#xff0c;在设计用例时该如何应用用例设计方法、设计出覆盖率高的测试用例呢&#xff1f;场景简介&#xff1a;普遍登录页面测试用例设计分析拿到需求&#xff0c;首先要做需求分析。我们看到登录界面有三个测试点&#xff1a;1.账号2.…

一个参数大小写引发的uploadify报错 Syntax error, unrecognized expression: #

上传控件uploadify 报错"Syntax error, unrecognized expression: #" 版本为 uploadify3.2 报错原因&#xff1a;参数ID【hidInfoId】小写错写成了大写。debug过程&#xff1a; ①&#xff1a;报错 "Syntax error, unrecognized expression: #" ②&#xf…

linux7 dns正向,Centos 7 搭建DNS正向解析和反向解析

Centos 7 搭建DNS正向解析和反向解析服务的三要素:安装-配置-启动1.使用yum安装DNSyum install bind -y2.修改配置文件vi /etc/named.conf修改以下内容&#xff1a;listen-on port 53 { any; };allow-query { any; };vi /etc/named.rfc1912.zones在末尾添加以下内容:zone "…

个人pkm软件 pim软件_个人申请软件著作权需要走哪些流程

软件著作权是企业的无形资产之一&#xff0c;它与商标权、专利权一起构成企业的知识产权&#xff0c;是企业投资、入股、融资等的有效无形资产&#xff0c;那么个人申请软件著作权需要走哪些流程&#xff1f;阅读完以下上海知识产权律师咨询为您整理的内容&#xff0c;一定会对…