算法数据结构复习[单链表]

简介:

基本上关于带头结点的单链表能实现的都实现了,链表的转置写了递归和非递归,有些鸡肋的函数就没写。菜鸟一只,欢迎拍砖,高手无视。

 


 
 
  1. //Code by Pnig0s1992 
  2. //Date:2012,3,20 
  3. #include <stdio.h> 
  4. #include <Windows.h> 
  5.  
  6. typedef struct LinkNode 
  7.     int iElement; 
  8.     struct LinkNode * pNext; 
  9. }LinkNode; 
  10. typedef int Element_type; 
  11. typedef struct LinkNode * ptrNode; 
  12. typedef ptrNode LinkList; 
  13.  
  14. void MakeEmpty(LinkList L);//清空单链表 
  15. BOOL isEmpty(LinkList L);//判断链表是否为空 
  16. BOOL isLast(ptrNode pPos,LinkList L);//判断指定结点是否为最后 
  17. ptrNode FindNode(Element_type x,LinkList L);//返回指定元素值的结点 
  18. ptrNode FindPrev(Element_type x,LinkList L);//返回指定元素值的前一个结点 
  19. void Insert(Element_type x,ptrNode pPos);//在指定位置插入一个结点 
  20. void Delete(Element_type x,LinkList L);//删除指定值的结点 
  21. Element_type Retrieve(LinkList L);//返回指定结点位置的元素值 
  22. void NonCurReverse(LinkList L);//单链表的逆置(非递归) 
  23. void CurReverse(LinkList L);//单链表的逆置(递归) 
  24. void printLinkLink(LinkList L);//打印单链表 
  25. int main(int argc,char ** argv) 
  26.     LinkNode LinkHeader; 
  27.     LinkHeader.pNext = NULL; 
  28.     Insert(20,&LinkHeader); 
  29.     Insert(40,&LinkHeader); 
  30.     Insert(10,&LinkHeader); 
  31.     Insert(70,&LinkHeader); 
  32.     Insert(30,&LinkHeader); 
  33.     Insert(50,&LinkHeader); 
  34.     Insert(80,&LinkHeader); 
  35.     Insert(90,&LinkHeader); 
  36.     ptrNode InsertPos = FindNode(50,&LinkHeader); 
  37.     Delete(20,&LinkHeader); 
  38.     BOOL bResult; 
  39.     bResult = isEmpty(&LinkHeader); 
  40.     if(bResult) 
  41.     { 
  42.         printf("\nThe LinkList is empty."); 
  43.     }else 
  44.     { 
  45.         printf("\nThe Linklink is not empty"); 
  46.     } 
  47.     printf("\nThe Linklist before reverse."); 
  48.     printLinkLink(&LinkHeader); 
  49.     NonCurReverse(&LinkHeader); 
  50.     printf("\nThe Linklist after reverse."); 
  51.     printLinkLink(&LinkHeader); 
  52.     CurReverse(&LinkHeader); 
  53.     printf("\nThe Linklist after second reverse."); 
  54.     printLinkLink(&LinkHeader); 
  55.     MakeEmpty(&LinkHeader); 
  56.     bResult = isEmpty(&LinkHeader); 
  57.     if(bResult) 
  58.     { 
  59.         printf("\nThe LinkList is empty."); 
  60.     }else 
  61.     { 
  62.         printf("\nThe Linklink is not empty"); 
  63.     } 
  64.     system("pause"); 
  65.     return 0; 
  66. //根据指定位置插入结点 
  67. void Insert(Element_type x,ptrNode pPos) 
  68.     ptrNode NewNode = (ptrNode)HeapAlloc(GetProcessHeap(),0,sizeof(LinkNode)); 
  69.     if(NewNode == NULL) 
  70.     { 
  71.         printf("\nAlloc memory on heap failed with error:%d",GetLastError()); 
  72.         return
  73.     } 
  74.     NewNode->iElement = x; 
  75.     NewNode->pNext = pPos->pNext; 
  76.     pPos->pNext = NewNode; 
  77.     printf("\nInsert node with element %d successfully.",x); 
  78. //返回指定数值所在的结点 
  79. ptrNode FindNode(Element_type x,LinkList L) 
  80.     int iTarget = x; 
  81.     while(L->pNext != NULL && L->iElement != iTarget) 
  82.     { 
  83.         L = L->pNext; 
  84.     }//注意判断条件 
  85.  
  86.     return L; 
  87.  
  88. //删除指定数值所在的结点 
  89. void Delete(Element_type x,LinkList L) 
  90.     ptrNode BeforeTarget= FindPrev(x,L); 
  91.     ptrNode TargetNode = BeforeTarget->pNext; 
  92.     BeforeTarget->pNext = TargetNode->pNext; 
  93.     HeapFree(GetProcessHeap(),0,TargetNode); 
  94.     printf("\nDelete node with element %d successfully.",x); 
  95.  
  96. //返回指定值结点的前一个结点 
  97. ptrNode FindPrev(Element_type x,LinkList L) 
  98.     while(L->pNext != NULL) 
  99.     { 
  100.         if(L->pNext->iElement == x) 
  101.         { 
  102.             printf("\nFind node before node with element %d successfully.",x); 
  103.             return L; 
  104.         } 
  105.         L = L->pNext; 
  106.     } 
  107.     return NULL; 
  108. //判断链表是否为空 
  109. BOOL isEmpty(LinkList L) 
  110.     return L->pNext == NULL; 
  111.  
  112. //判断结点是否在最后 
  113. BOOL isLast(ptrNode pPos,LinkList L) 
  114.     if(!isEmpty(L)) 
  115.     { 
  116.         return pPos->pNext == NULL; 
  117.     }else 
  118.     { 
  119.         return TRUE; 
  120.     } 
  121.  
  122. //返回指定结点的元素值 
  123. Element_type Retrieve(LinkList L) 
  124.     return L->iElement; 
  125.  
  126. //清空链表 
  127. void MakeEmpty(LinkList L) 
  128.     ptrNode pTemp = L->pNext; 
  129.     L->pNext = NULL; 
  130.     ptrNode pT; 
  131.     while(pTemp != NULL) 
  132.     { 
  133.         pT = pTemp->pNext; 
  134.         HeapFree(GetProcessHeap(),0,pTemp); 
  135.         pTemp = pT; 
  136.     } 
  137.     printf("\nThe LinkList has been emptyed successfully."); 
  138.  
  139. //链表的转置(非递归) 
  140. void NonCurReverse(LinkList L) 
  141.     ptrNode pFirst,pSecond; 
  142.     pFirst = L->pNext; 
  143.     pSecond = L->pNext; 
  144.     pSecond = pSecond->pNext; 
  145.     pFirst->pNext = NULL; 
  146.     pFirst = pSecond; 
  147.     while (pFirst != NULL) 
  148.     { 
  149.         pSecond = pSecond->pNext; 
  150.         pFirst->pNext = L->pNext; 
  151.         L->pNext = pFirst; 
  152.         pFirst = pSecond; 
  153.     } 
  154. //递归逆置单链表(带头结点) 
  155. void CurReverse(LinkList L) 
  156.     if(NULL == L || NULL == L->pNext) 
  157.         return
  158.     ptrNode q = L->pNext,r = L; 
  159.     while(NULL != q && NULL != q->pNext) 
  160.     { 
  161.         r = q; 
  162.         q = q->pNext; 
  163.     } 
  164.     r->pNext = NULL; 
  165.     q->pNext = L->pNext; 
  166.     L->pNext = q; 
  167.     CurReverse(q); 
  168.  
  169. //打印单链表 
  170. void printLinkLink(LinkList L) 
  171.     ptrNode pFirst = L->pNext; 
  172.     while(pFirst != NULL) 
  173.     { 
  174.         printf("%d ",pFirst ->iElement); 
  175.         pFirst = pFirst->pNext; 
  176.     } 

 

















本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/811016,如需转载请自行联系原作者

相关文章
|
6月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
178 1
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
919 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1305 6
|
6月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
178 0
|
10月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
324 10
 算法系列之数据结构-二叉树
|
10月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
295 3
 算法系列之数据结构-Huffman树
|
11月前
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
344 5
算法系列之递归反转单链表
|
10月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
418 22
|
11月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
409 30
|
11月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
526 25