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

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

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

 


  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,如需转载请自行联系原作者

上一篇:mysql审计


下一篇:mysql的handler_read_next理解