网易云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(); | |
} | |
} | |
} |
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; | |
} |