链表|实现链表创建、插入、查询、反转、销毁功能

【链表|实现链表创建、插入、查询、反转、销毁功能】实现链表创建、插入、查询、反转、销毁功能

#include #include #include typedef struct LinkNode{ int data; //数据域 struct LinkNode *next; //指针域 }linkNode; //初始化链表并建立头节点 linkNode* initLinkList() { linkNode* pLinkListHeadNode = (linkNode*)malloc(sizeof(linkNode)); //创建头结点 if(!pLinkListHeadNode) { return NULL; } pLinkListHeadNode->data = https://www.it610.com/article/0; //初始化头结点,这里把头结点的数据域定义为链表结点个数(不包括头结点) pLinkListHeadNode->next = NULL; return pLinkListHeadNode; }//链表插入 int insertElem(linkNode* pLinkListHeadNode, int elem, int index) { if(!pLinkListHeadNode) { return -1; } linkNode* pTempLinklist = pLinkListHeadNode; int i = 0; for(i = 1; i < index; i++)//先找到插入位置的上一个结点 { if(pTempLinklist == NULL) { printf("there is no find insert position!!!"); return 0; } pTempLinklist = pTempLinklist->next; }//创建插入结点 linkNode* pInsertLinkListNode = (linkNode*)malloc(sizeof(linkNode)); if(!pInsertLinkListNode) { return -1; } //向链表中插入结点 pInsertLinkListNode->data = https://www.it610.com/article/elem; pInsertLinkListNode->next = pTempLinklist->next; pTempLinklist->next = pInsertLinkListNode; //这里给头结点数据域赋值 pLinkListHeadNode->data++; }//删除指定下标的数据结点 int delElem(linkNode* pLinkListHeadNode, int index) { if(!pLinkListHeadNode) { return -1; } linkNode* pTempLinklist = pLinkListHeadNode; int i = 0; for(i = 1; i < index; i++)//先找到删除位置的上一个结点 { if(pTempLinklist == NULL) { printf("there is no find del position!!!"); return 0; } pTempLinklist = pTempLinklist->next; }linkNode*pDelLinkList = pTempLinklist->next; pTempLinklist->next = pDelLinkList->next; free(pDelLinkList); pLinkListHeadNode->data--; }void printLinkListNode(linkNode* pLinkListHeadNode) { if(!pLinkListHeadNode) { return; } linkNode*pTempLinkList = pLinkListHeadNode; printf("--------------link list node has %d node!!!---------\n", pLinkListHeadNode->data); int i = 0; while(pTempLinkList->next != NULL) { printf("node %d data:%d\n", ++i, pTempLinkList->next->data); pTempLinkList = pTempLinkList->next; } printf("--------------link list node info end---------\n"); }void destoryLinkListNode(linkNode* pLinkListHeadNode) { if(!pLinkListHeadNode) { return; } linkNode*pTempLinkList = pLinkListHeadNode; while(pTempLinkList->next) { linkNode *pDelLinkList = pTempLinkList->next; pTempLinkList->next = pTempLinkList->next->next; free(pDelLinkList); pLinkListHeadNode->data--; } //free(pLinkListHeadNode); pLinkListHeadNode = NULL; }//头插法 int add_node_head(linkNode* head, linkNode* new_node) { if(NULL == head || NULL == new_node) return -1; new_node->next = head->next; head->next = new_node; return 0; }//头插法实现反转链表 linkNode* reverseLinklistNode(linkNode* head) { linkNode *p = head->next; head->next = NULL; linkNode *tmp = NULL; while(p) { tmp = p->next; add_node_head(head, p); p = tmp; } return head; }//尾插法 int add_node_tail(linkNode* tail, linkNode* new_node) { if(NULL == tail || NULL == new_node) return -1; new_node->next = tail->next; //新节点指向原来的tail->pNext tail->next = new_node; //新节点成为tail->pNext return 0; }//尾插方式-反转链表 linkNode* revert_list(linkNode* head) { if(NULL == head) return; linkNode *p = head->next, *end = head; while( NULL != end->next )//使得end指向链表最后一个元素 { end = end->next; }while(p != end) { head->next = p->next; //分离p add_node_tail(end, p); //将p插入到末尾位置 p = head->next; //p指向第一个元素 }return head; }int main() { linkNode* pHeadLinkListNode = initLinkList(); int i = 0; for(i = 0; i < 5; i++) { insertElem(pHeadLinkListNode, i + 1, i + 1); } printLinkListNode(pHeadLinkListNode); delElem(pHeadLinkListNode, 3); printLinkListNode(pHeadLinkListNode); // destoryLinkListNode(pHeadLinkListNode); // printLinkListNode(pHeadLinkListNode); linkNode*pReverseLinkListNode = revert_list(pHeadLinkListNode); //linkNode*pReverseLinkListNode = reverseLinklistNode(pHeadLinkListNode); printLinkListNode(pReverseLinkListNode); return 0; }

    推荐阅读