实验四:用可重用的链表模块来实现命令行菜单小程序

网易云ID:Nerd2dian0

GitHub源码:https://github.com/Nerd2dian0/Youcan/tree/master/lab4

遇到的问题:出现了segmentation fault错误,最后在ADD的函数发现错误。

思路:在原来的基础上编辑接口源代码LinkTable.c里面涉及到创建链表的函数以及一些简单操作 ,主函数中涉及数据的初始化放入链表,查询数据与链表内容不对输出。

截图见下:

进入GitHub:实验四:用可重用的链表模块来实现命令行菜单小程序

最终的实现图:实验四:用可重用的链表模块来实现命令行菜单小程序

下面分别是部分代码:(具体见gayhub)

menu.c

/*初始化*/
  int InitMenuData(tLinkTable **ppLinkTable)
  {
  *ppLinkTable=CreateLinkTable();/*创建一个链表*/
  tDataNode* pNode=(tDataNode*)malloc(sizeof(tDataNode));/*malloc一个节点*/
  pNode->cmd="help";
  pNode->desc="Menu List";
  pNode->handler = Help; /*把这个节点的数据放入,以及这个数据的指针*/
  AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);/*把上面这个节点添加到这个链表中*/
  pNode=(tDataNode*)malloc(sizeof(tDataNode));
  pNode->cmd="info";
  pNode->desc="Show information";
  pNode->handler=NULL;
  AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);
  pNode=(tDataNode*)malloc(sizeof(tDataNode));
  pNode->cmd="echo";
  pNode->desc="Repeat your input";
  pNode->handler=NULL;
  AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);
  pNode=(tDataNode*)malloc(sizeof(tDataNode));
  pNode->cmd="quit";
  pNode->desc="Exit this program";
  pNode->handler=Quit;
  AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);
  pNode=(tDataNode*)malloc(sizeof(tDataNode));
  pNode->cmd="time";
  pNode->desc="Show time now";
  pNode->handler=NULL;
  AddLinkTableNode(*ppLinkTable,(tLinkTableNode *)pNode);
   
  return 0;
  }
   
  tLinkTable* head=NULL;
int main()
  {
  InitMenuData(&head);
   
  printf("Program is running\n");
  while (1)
  {
  char cmd[CMD_MAX_LEN];
  printf("Input a cmd >>");
  scanf("%s",cmd);
  tDataNode *p = FindCmd(head,cmd);
  if(p == NULL)
  {
  printf("Command Not found\n");
  }
  printf("%s - %s\n", p->cmd, p->desc);
  if(p->handler != NULL)
  {
  p->handler();
  }
  }
  }
LinkTable.c

tLinkTable * CreateLinkTable()
  {
  tLinkTable *pLinkTable = (tLinkTable*)malloc(sizeof(tLinkTable));
  if(pLinkTable == NULL)
  {
  return NULL;
  }
  pLinkTable->pHead = NULL;
  pLinkTable->pTail = NULL;
  pLinkTable->SumOfNode = 0;
  pthread_mutex_init(&(pLinkTable->mutex),NULL);
  return pLinkTable;
  }
   
  int DeleteLinkTable(tLinkTable *pLinkTable)
  {
  if(pLinkTable==NULL)
  {
  return FAILURE;
  }
  while(pLinkTable->pHead != NULL)
  {
  tLinkTableNode *p =pLinkTable->pHead;
  pthread_mutex_lock(&(pLinkTable->mutex));
  pLinkTable->pHead = pLinkTable->pHead->pNext;
  pLinkTable->SumOfNode -= 1;
  pthread_mutex_unlock(&(pLinkTable->mutex));
  free(p);
  }
  /*以上的将遍历整个列表*/
  pLinkTable->pHead = NULL;
  pLinkTable->pTail = NULL;
  pLinkTable->SumOfNode = 0;
  pthread_mutex_destroy(&(pLinkTable->mutex));
  free(pLinkTable);
  return SUCCESS;
  }
   
  int AddLinkTableNode(tLinkTable *pLinkTable, tLinkTableNode *pNode)
  {
  if (pLinkTable == NULL || pNode == NULL)
  return FAILURE;
   
  if (pLinkTable->pHead == NULL)
  {
  pLinkTable->pHead = pNode;
  pLinkTable->pTail = pNode;
  pLinkTable->SumOfNode = 1;
  }
  else
  {
  pLinkTable->pTail->pNext = pNode;
  pLinkTable->pTail = pNode;
  pLinkTable->SumOfNode++;
  }
  return SUCCESS;
  }
   
  int DeleteLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode)
  {
  /*错误处理*/
  if(pLinkTable->pHead == NULL || pNode == NULL)
  {
  return FAILURE;
  }
  pthread_mutex_lock(&(pLinkTable->mutex));
  if(pLinkTable->pHead == pNode)
  {
  pLinkTable->pHead = pLinkTable->pHead->pNext;
  pLinkTable->SumOfNode -= 1;
  if(pLinkTable->SumOfNode = 0)
  {
  pLinkTable->pTail = NULL;
  }
  pthread_mutex_unlock(&(pLinkTable->mutex));
  return SUCCESS;
  }
  tLinkTableNode * pTempNode = pLinkTable->pHead;
  while(pTempNode != NULL)
  {
  if(pTempNode->pNext == pNode)
  {
  pTempNode->pNext = pTempNode->pNext->pNext;
  pLinkTable->SumOfNode -= 1;
  if(pLinkTable->SumOfNode = 0)
  {
  pLinkTable->pTail = NULL;
  }
  pthread_mutex_unlock(&(pLinkTable->mutex));
  return SUCCESS;
  }
  pTempNode = pTempNode->pNext;
  }
  pthread_mutex_unlock(&(pLinkTable->mutex));
  return FAILURE;
  }
   
  tLinkTableNode * GetLinkTableHead(tLinkTable *pLinkTable)
  {
  if(pLinkTable == NULL)
  {
  return NULL;
  }
  return pLinkTable->pHead;
  }
   
  tLinkTableNode * GetNextLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode)
  {
  if(pLinkTable == NULL || pNode == NULL)
  {
  return NULL;
  }
  tLinkTableNode * pTempNode = pLinkTable->pHead;
  while(pTempNode != NULL)
  {
  if(pTempNode == pNode)
  {
  return pTempNode->pNext;
  }
  pTempNode = pTempNode->pNext;
  }
  return NULL;
  }
实验总结:本次实验 加深了对链表的认识,更重要的是通用模块的设计及使用,收益匪浅!大家都加油~