实现链表创建、插入、查询、反转、销毁功能
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct LinkNode{
int data; //数据域
struct LinkNode *next; //指针域
}linkNode;
//初始化链表并建立头节点
linkNode* initLinkList()
{
linkNode* pLinkListHeadNode = (linkNode*)malloc(sizeof(linkNode)); //创建头结点
if(!pLinkListHeadNode)
{
return NULL;
}
pLinkListHeadNode->data = 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 = 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;
}