zoukankan      html  css  js  c++  java
  • 链表

    2017-08-28 17:36:28

    writer:pprp

    这是我第二次完全独立的去写链表,除了链表的排序部分以外,

    感觉比较顺利,这种模块化的写法比较令人舒畅

    这个链表储存的是一个工人的工号和他的工资,进行一系列操作

    代码和说明如下:

    /*
    @theme: PrintList
    @writer:pprp
    @start:17:20
    @end:17:32
    @declare:链表的删除一个节点
    @date:2017/8/28
    */
    
    #include <bits/stdc++.h>
    
    using namespace std;
    
    struct worker
    {
        int num;//worker's number
        double wage; // worker's wage
        worker(int nn, double ww):num(nn), wage(ww)
        {
            next = NULL;
        }
        worker* next;
        bool operator < (worker wk)
        {
            return num < wk.num ? true:false;
            //        else
    //        {
    //            return wage < wk.wage? true:false;
    //        }
    
        }
    };
    
    //function 1: create a PrintList
    //test : ok
    worker* create()
    {
        worker * head = NULL;
        worker *transe = NULL;
        int nn;
        double ww;
    
        for(int i = 0 ; i < 5; i++)
        {
            cin >> nn >> ww;
            transe = head;
            worker* tmp = new worker(nn,ww);
            if(head == NULL)
            {
                head = tmp;
            }
            else
            {
                while(transe->next != NULL)
                {
                    transe = transe->next;
                }
                transe->next = tmp;
            }
        }
        return head;
    }
    
    //function 2: show the whole PrintList
    //test :ok
    void PrintList(worker* head)
    {
        worker * tmp;
        tmp = head;
        while(tmp->next != NULL)//果然因为这里的原因才导致少输出一行
        {
            cout << tmp->num << "->" << tmp->wage << endl;
            tmp = tmp->next;
        }
        cout << tmp->num << "->" << tmp->wage << endl;
    
        return ;
    }
    
    //function 3: insert a new node
    //test:ok
    worker* Insert(worker * head)
    {
        int nn;
        double ww;
    
        cin >> nn >> ww;
    
        worker* tmp = new worker(nn, ww);
    
        if(head == NULL)
        {
            head = tmp;
        }
        else
        {
            worker * transe = head;
            while(transe->next != NULL)
            {
                transe = transe->next;
            }
            transe->next = tmp;
        }
        return head;
    }
    
    int SizePrintList(worker* head);
    //function 3 sort
    // test :ok
    worker * bubble_sort(worker*head)
    {
        int cnt = SizePrintList(head);
        worker * pMove = head->next;
        while(cnt > 1)
        {
              while(pMove->next != NULL)
              {
                    if(pMove->num > pMove->next->num)
                    {
                          int tmp = pMove->num;
                          pMove->num =pMove->next->num;
                          pMove->next->num = tmp;
                    }
                    
                    if(pMove->next->wage == pMove->wage)
                    {
                          double tmp = pMove->wage;
                          pMove->wage = pMove->next->wage;
                          pMove->next->wage = tmp;
                    }
                    pMove = pMove->next;
              }
              cnt--;
              pMove = head->next;
        }
        
        return head;
    }
    
    //function 4 size
    //test:ok
    int SizePrintList(worker* head)
    {
           int cnt = 0;
           worker *it = head;
           while( it != NULL)
           {
                 cnt++;
                 it = it->next;
           }
           return cnt;
    }
    
    //function 5 delete 
    //根据num的值比对进行删除,一开始忽略了对头结点的判断,所以现在加上单独判断头结点
    //test
    worker* delete_List(worker * head, int value)
    {
         worker * fast = head->next;
         worker * slow = head;
         
         if(head->num == value)
         {
               head = fast;
               delete(slow);
               return head;
         }
         
         while(fast != NULL)
         {
               if(fast->num == value)
               {
                     slow->next = fast->next;
                     delete(fast);
                     break; 
               }           
               fast = fast->next;
               slow = slow->next;
         }
         return head;
    }
    
    
    int main()
    {
        freopen("in.txt","r",stdin);
        worker *head = create(); //head iterator
        PrintList(head);
        cout << "-----" << endl;
        head = Insert(head);
        PrintList(head);
        cout << "-----" << endl;
    //  sort(head, head + 6);
    //  PrintList(head);
        bubble_sort(head);
        PrintList(head);
        cout << "-----" << endl;
        head = delete_List(head,101);
        PrintList(head);
        cout << "-----" << endl;
    
        return 0;
    }
    
    /*
    数据
    101 580.50
    103 1000.08
    105 888.88
    107 1888.88
    109 518.23
    插入的新数据
    102 100.123
    */
  • 相关阅读:
    spring mvc velocity多视图
    ubuntu 的远程桌面
    nhibernate 3.3 linq扩展
    MongoDB资料汇总专题[转发]
    SQLServer 2008 删除、压缩日志
    VS2012和2010 设置framework版本
    引用的程序集 没有强名称
    Xamarin for OSX – SetUp
    Xamarin devexpress datagrid 样式
    Xamarin devexpress Grid
  • 原文地址:https://www.cnblogs.com/pprp/p/7444907.html
Copyright © 2011-2022 走看看