数据结构与算法:单向链表实现与封装
概述
单向链表分为单向有头链表和单线无头链表,本文针对单向有头链表使用C语言来实现并进行封装。
实现
list_head.h文件
#ifndef_LIST_H_ #define_LIST_H_ typedefintdatatype; #defineSUCC #defineMALLOC_FAIL1 #defineNOHEADNODE2 #defineINDEXFAIL3 #defineLIST_EMPTY4 #defineLIST_NOEMPTY5 #defineFAIL10 typedefstructList_Node { datatypedata; structList_Node*pNext; }list; list*list_create(); intlist_insert_at(list*pHead,inti,datatype*pData); intlist_order_insert(list*pHead,datatype*pData); intlist_delete_at(list*pHead,intindex); intlist_delete(list*pHead,datatype*pData); intlist_isempty(list*pHead); voidlist_display(list*pHead); voidlist_destory(list*pHead); #endif//!_LIST_H_
list_head.c文件
/******************************************************** Copyright(C),2016-2017, FileName:list Author:woniu201 Description:单向有头链表使用 ********************************************************/ #include#include"list_head.h" /************************************ @Brief:创建链表头 @Author:woniu201 @Return: ************************************/ list*list_create() { list*pNode=(list*)malloc(sizeof(list)); memset(pNode,0,sizeof(list)); if(pNode==NULL) { returnMALLOC_FAIL; } pNode->pNext=NULL; returnpNode; } /************************************ @Brief:按位置插入节点 @Author:woniu201 @Return: ************************************/ intlist_insert_at(list*pHead,inti,datatype*pData) { intj=0; if(pHead==NULL) { returnNOHEADNODE; } list*pNode=pHead; if(i<0) { returnINDEXFAIL; } while(jpNext; j++; } if(pNode==NULL) { returnINDEXFAIL; } else { list*newNode=(list*)malloc(sizeof(list)); if(newNode==NULL) { returnMALLOC_FAIL; } memset(newNode,0,sizeof(list)); newNode->data=*pData; pNode->pNext=newNode; } returnSUCC; } /************************************ @Brief:按顺序插入节点 @Author:woniu201 @Return: ************************************/ intlist_order_insert(list*pHead,datatype*pData) { if(pHead==NULL) { returnNOHEADNODE; } list*pNewNode=(list*)malloc(sizeof(list)); if(pNewNode==NULL) { returnMALLOC_FAIL; } memset(pNewNode,0,sizeof(list)); pNewNode->data=*pData; list*pNode=pHead; if(pNode->pNext==NULL) { pNode->pNext=pNewNode; returnSUCC; } while(pNode->pNext!=NULL&&pNode->pNext->data<*pData) { pNode=pNode->pNext; } if(pNode->pNext) { pNewNode->pNext=pNode->pNext; pNode->pNext=pNewNode; } else { pNode->pNext=pNewNode; } returnSUCC; } /************************************ @Brief:按位置删除节点 @Author:woniu201 @Return: ************************************/ intlist_delete_at(list*pHead,intindex) { intj=0; if(pHead==NULL) { returnNOHEADNODE; } if(index<0) { returnINDEXFAIL; } list*pCur=pHead; list*pNode=pHead; while(pCur->pNext) { pNode=pCur; pCur=pCur->pNext; if(index==j) { break; } j++; } if(j pNext==NULL) { pNode->pNext=NULL; } else { pNode->pNext=pCur->pNext; } free(pCur); pCur=NULL; } returnSUCC; } /************************************ @Brief:按值删除节点 @Author:woniu201 @Return: ************************************/ intlist_delete(list*pHead,datatype*pData) { if(pHead==NULL) { returnNOHEADNODE; } list*pCur=pHead; list*pNode=pHead; intbFind=0; while(pCur->pNext) { pNode=pCur; pCur=pCur->pNext; if(pCur->data==*pData) { bFind=1; break; } } if(!bFind) { printf("不存在该节点\n"); returnINDEXFAIL; } else { if(pCur->pNext==NULL) { pNode->pNext=NULL; } else { pNode->pNext=pCur->pNext; } free(pCur); pCur=NULL; } returnSUCC; } /************************************ @Brief:判断链表是否为空 @Author:woniu201 @Return: ************************************/ intlist_isempty(list*pHead) { if(pHead->pNext==NULL) { returnLIST_EMPTY; } else { returnLIST_NOEMPTY; } } /************************************ @Brief:遍历打印链表 @Author:woniu201 @Return: ************************************/ voidlist_display(list*pHead) { if(list_isempty(pHead)==LIST_EMPTY) { printf("链表为空\n"); returnFAIL; } list*pNode=pHead->pNext; while(pNode) { printf("%d\n",pNode->data); pNode=pNode->pNext; } } /************************************ @Brief:释放链表内存 @Author:woniu201 @Return: ************************************/ voidlist_destory(list*pHead) { list*pCur=pHead; list*pNext=pHead->pNext; while(pNext) { pNext=pNext->pNext; free(pCur); pCur=NULL; pCur=pNext; } }
main.c测试
#include#include"list_head.h" intmain() { list*pHead=list_create(); intdata1=1; intdata2=3; intdata3=2; //intret=list_insert_at(pHead,0,&data1); //ret=list_insert_at(pHead,1,&data2); //if(ret==INDEXFAIL) //{ //printf("添加索引位置错误\n"); //} list_order_insert(pHead,&data2); list_order_insert(pHead,&data1); list_order_insert(pHead,&data3); list_delete_at(pHead,3); intdeleteData=1; list_delete(pHead,&deleteData); list_display(pHead); list_destory(pHead); return1; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接