【链表|实现链表创建、插入、查询、反转、销毁功能】实现链表创建、插入、查询、反转、销毁功能
#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;
}
推荐阅读
- 面试|HashMap常问的11个面试题 你会几个
- STM32|STM32之LWIP网络协议栈连接腾讯云
- JAVA|【Java学习】网络编程全总结——TCP、Udp、多线程、IO流、Socket、简易在线咨询聊天室、Java爬虫
- Java学习|基于TCP协议实现两人随意聊天——网络编程
- 数据结构|PTA线性表—统计字母比例
- 网络安全|ARP协议
- 市场调研|中国数字文化产业前景规划及未来重点发展方向报告2022~2028年
- 计算机网络|计算机网络的 166 个核心概念
- 蓝桥杯|蓝桥杯——1.2递归实现排列型枚举