分享

C++单链表的动态创建,查找,遍历,删除,插入,添加,排序 - gengxiaoying的...

 chensirDSP 2010-09-18
C++单链表的动态创建,查找,遍历,删除,插入,添加,排序 收藏

  1. //单链表的动态创建,查找,遍历,删除,插入,添加,排序   
  2.   
  3. #include<iostream.h>   
  4.   
  5. typedef struct node //定义一个结构体,在c++中也是一个类   
  6. {   
  7.     int val;   
  8.     struct node* pNext;   
  9. }NODE,*PNODE;   
  10.   
  11. //NODE == struct node  定义一个新的接点   
  12. //PNODE == struct node* 定义一个指向这个接点的指针   
  13.   
  14. class MyList //创建一个类    
  15. {   
  16. private:   
  17.     PNODE pHead;//struct node* pHead   
  18.        
  19. public:   
  20.     MyList()   //构造函数,构造一个空链表头指针   
  21.     {   
  22.         this->pHead = NULL;   
  23.     }   
  24.        
  25.     ~MyList()  //析构函数   
  26.     {   
  27.         while(this->pHead!=NULL)   
  28.         {   
  29.             PNODE pTemp = pHead->pNext;   
  30.             delete pHead;   
  31.             pHead = pTemp;   
  32.         }   
  33.     }   
  34.        
  35.     void Init()   //初始化链表   
  36.     {   
  37.         int a;   
  38.         char ans;   
  39.            
  40.         PNODE pTail,pNew;   
  41.            
  42.         do  
  43.         {          
  44.             cout<<"请输入一个节点值:";   
  45.             cin>>a;   
  46.                
  47.             if(pHead == NULL)//判断链表中是否有元素(是否是空链表)   
  48.             {   
  49.                 pHead = new NODE;   
  50.                 pHead->val = a;   
  51.                 pHead->pNext = NULL;   
  52.                    
  53.                 pTail = pHead;   
  54.             }      
  55.             else  
  56.             {      
  57.                 pTail = pHead;   
  58.                 while(pTail->pNext!=NULL)//把pTail移动到尾部   
  59.                 {   
  60.                     pTail = pTail->pNext;   
  61.                 }   
  62.   
  63.                 pNew = new NODE;//new一个新的接点来接受新输入的值   
  64.                 pNew->val = a;   
  65.                 pNew->pNext = NULL;   
  66.   
  67.                 pTail->pNext = pNew;   
  68.                 pTail = pTail->pNext;   
  69.             }      
  70.                
  71.             cout<<"继续吗?(Y/N):  ";   
  72.             cin>>ans;   
  73.                
  74.         }while(ans=='Y'||ans=='y');    
  75.     }   
  76.        
  77.     void Add(int val) //向链表中追加值方法   
  78.     {   
  79.         if(pHead == NULL)   
  80.         {   
  81.             pHead = new NODE;   
  82.             pHead->val = val;   
  83.             pHead->pNext = NULL;   
  84.         }   
  85.         else  
  86.         {   
  87.             PNODE pTemp = pHead;   
  88.             while(pTemp->pNext!=NULL)   
  89.             {   
  90.                 pTemp = pTemp->pNext;   
  91.             }   
  92.   
  93.             PNODE pNew = new NODE;   
  94.             pNew->val = val;   
  95.             pNew->pNext = NULL;   
  96.   
  97.             pTemp->pNext = pNew;   
  98.         }          
  99.     }   
  100.        
  101.     int DelAt(int k)   //删除链表中的元素的方法   
  102.     {   
  103.         PNODE p1,p2,pTemp;   
  104.   
  105.         if(pHead == NULL)   
  106.         {   
  107.             return -1;   
  108.         }   
  109.   
  110.         if(k<0 || k>this->GetNodeCnt()-1)   
  111.         {   
  112.             return -1;   
  113.         }   
  114.   
  115.         if(this->GetNodeCnt() == 1)   
  116.         {   
  117.             delete pHead;   
  118.             pHead = NULL;   
  119.             return 0;   
  120.         }   
  121.   
  122.         if(k==0)   
  123.         {   
  124.             pTemp = pHead;   
  125.             pHead = pTemp->pNext;   
  126.             delete pTemp;   
  127.             return 0;   
  128.         }   
  129.   
  130.         if(k == this->GetNodeCnt()-1)   
  131.         {   
  132.             PNODE p,pTemp;   
  133.   
  134.             p = pHead;   
  135.             while(p->pNext->pNext!=NULL)   
  136.             {   
  137.                 p = p->pNext;   
  138.             }   
  139.   
  140.             pTemp = p->pNext;   
  141.   
  142.             p->pNext = NULL;   
  143.             delete pTemp;   
  144.   
  145.             return 0;   
  146.         }   
  147.   
  148.         p1 = pHead;   
  149.         int i=0;   
  150.         while(i<k-1)   
  151.         {   
  152.             p1 = p1->pNext;   
  153.             i++;   
  154.         }   
  155.   
  156.         pTemp = p1->pNext;   
  157.         p2 = p1->pNext->pNext;   
  158.   
  159.         p1->pNext = p2;   
  160.         delete pTemp;   
  161.         return 0;   
  162.     }   
  163.        
  164.     int InsertAt(int val,int k)//向链表中插入元素,约定在k之前插入   
  165.     {   
  166.         PNODE p1,p2,pNew,pTemp;   
  167.   
  168.         if(pHead == NULL)//链表为空   
  169.         {   
  170.             return -1;   
  171.         }   
  172.   
  173.         if(k<0 || k>this->GetNodeCnt()-1)//k越界   
  174.         {   
  175.             return -1;   
  176.         }   
  177.   
  178.         if(k==0)//在头节点之前插入   
  179.         {   
  180.             pTemp = pHead;   
  181.   
  182.             pNew = new NODE;   
  183.             pNew->val = val;   
  184.             pNew->pNext = NULL;   
  185.   
  186.             pHead = pNew;   
  187.   
  188.             pNew->pNext = pTemp;   
  189.                
  190.             return 0;   
  191.         }   
  192.   
  193.         p1 = pHead;   
  194.         int i =0;   
  195.         while(i<k-1)   
  196.         {   
  197.             p1 = p1->pNext;   
  198.             i++;   
  199.         }   
  200.   
  201.         p2 = p1->pNext;   
  202.   
  203.         pNew = new NODE;   
  204.         pNew->val = val;   
  205.         pNew->pNext = NULL;   
  206.   
  207.         p1->pNext = pNew;   
  208.         pNew->pNext = p2;   
  209.   
  210.         return 0;   
  211.   
  212.     }   
  213.        
  214.     int Find(int val)  //按输入的值查找方法   
  215.     {   
  216.         int i=0;   
  217.         PNODE pTemp = pHead;   
  218.         while(pTemp != NULL)   
  219.         {   
  220.             if(pTemp->val == val)   
  221.             {   
  222.                 return i;   
  223.             }   
  224.             pTemp = pTemp->pNext;   
  225.             i++;   
  226.         }   
  227.         return -1;   
  228.     }   
  229.        
  230.     void Travel()  //遍历单链表中的元素   
  231.     {   
  232.         PNODE pTemp = this->pHead;   
  233.   
  234.         while(pTemp!=NULL)   
  235.         {    
  236.             cout<<pTemp->val<<"  ";   
  237.             pTemp = pTemp->pNext;   
  238.         }   
  239.         cout<<endl;      
  240.     }   
  241.   
  242.     int GetNodeCnt()  //获取单链表中元素的个数   
  243.     {   
  244.         int cnt=0;   
  245.         PNODE pTemp = pHead;   
  246.   
  247.         while(pTemp!=NULL)   
  248.         {   
  249.             cnt++;   
  250.             pTemp = pTemp->pNext;   
  251.         }   
  252.   
  253.         return cnt;   
  254.     }   
  255.        
  256.     void sort()  //把单链表中的元素排序   
  257.     {   
  258.         int n = this->GetNodeCnt();   
  259.         PNODE p1,p2;   
  260.   
  261.         for(int i=0;i<n-1;i++)   
  262.         {   
  263.             p1 = pHead;   
  264.   
  265.             for(int j=0;j<n-1-i;j++)   
  266.             {   
  267.                 p2 = p1->pNext;   
  268.   
  269.                 if(p1->val < p2->val)   
  270.                 {   
  271.                     int k = p1->val;   
  272.                     p1->val = p2->val;   
  273.                     p2->val = k;   
  274.                 }   
  275.   
  276.                 p1 = p1->pNext;   
  277.             }   
  278.         }   
  279.     }   
  280. };   
  281.   
  282.   
  283. //测试主函数   
  284.   
  285. void main()   
  286. {   
  287.     MyList list;   
  288.   
  289.     for(int i=0;i<10;i++)   
  290.     {   
  291.         list.Add(i);   
  292.     }   
  293.   
  294.     list.Travel();   
  295.   
  296.     list.sort();   
  297.   
  298.     list.Travel();   
  299.        
  300. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多