zoukankan      html  css  js  c++  java
  • 单链表的建立、排序和翻转

    链表:

    1、注意是否有带头结点。

    2、单链表的建立:顺序建表(尾插法)、逆序建表(头插法)。

    3、单链表的插入、删除操作需要寻找前驱结点。

    单链表的建立、排序和翻转,都是针对有头结点的单链表。

    #include <iostream>
    using namespace std;
    
    typedef struct Node
    {
        int data;
        Node * next;
    }Node,*List;
    
    //顺序建表:尾插法
    void CreateLinkList(List& L, int n)
    {
        //  建立空表
        L = (List)malloc(sizeof(Node));
        L->next = NULL;    //空表
        List p = L;    //用p指向表尾
        //  插入元素
        for(int i=0; i<n; i++ )
        {
            int x;
            cin>>x;
            List s = (List) malloc(sizeof(Node));
            s->data = x;
            //  插入表尾
            s->next = p->next;
            p->next = s;
            p = s;    //  新的表尾
        }
    }
    
    //逆序建表:头插法
    void CreateLinkList2(List& L, int n)
    {
        //  建立空表
        L = (List) malloc(sizeof(Node));
        L->next = NULL;  // 空表
        //  插入元素
        for (int i=0; i<n; i++ )
        {
            int x;
            cin>>x;
            List s = (List) malloc(sizeof(Node));
            s->data = x;
            //  插入表头
            s->next = L->next;
            L->next = s;
        }
    }
    
    void PrintLinkList(List L)
    {
       List p = L->next;
       while( p!=NULL )
       {
           cout<<p->data<<" ";
           p = p->next;
       }
       cout<<endl;
    }
    
    int GetLength(Node *head)
    {
        int len = 0;
        List p = head->next;
        while(p)
        {
            ++len;
            p = p->next;
        }
        return len;
    }
    
    void DestroyList(List & L)
    {
        List p = L;
        List q = NULL;
        while(p)
        {
            q = p->next;
            free(p);
            p = q;
        }
    }
    
    //采用插入法将单链表中的元素排序。
    void InsertionSort(List & L)
    {
        List h=L->next;      // 原链表
        L->next=NULL;      // 新空表
        List s=NULL,p=NULL;
        while(h)
        {
            // 从原链表中取下结点s
            s=h;  h=h->next;
            // 在新表中查找插入位置
            p=L;
            while (p->next && p->next->data<=s->data)
            p=p->next;
            // 在p之后插入s
            s->next=p->next;
            p->next=s;
        }
    }
    
    //采用选择法将单链表中的元素排序。
    void SelectionSort(List & L)
    {
        List p=L;
        List q=NULL,s=NULL,m=NULL;
        while (p->next)
        {
            // 选择最小(从p->next至表尾)
            q=p;     // 最小元素的前驱q
            s=p;
            while(s->next)
            {
                if(s->next->data<q->next->data)  q=s;
                s=s->next;
            }
            m=q->next;     // 找到最小m
            // 最小元素m插入有序序列末尾(p之后)
            if (q!=p)
            {
                q->next=m->next;      // 解下最小m
                m->next=p->next;      // 插入p之后
                p->next=m;
            }
            p=p->next;     // L->next至p为有序序列
        }
    }
    
    //单链表就地逆置
    void ReverseList(Node* h)
    {
        Node* p = h->next;  // 原链表
        h->next = NULL; // 新表(空表)
        while(p != NULL)
        {
            Node* q = p->next;  // 保存下个结点q
            p->next = h->next;
            h->next = p;
            p = q;
        }
    }
    
    int main()
    {
        List head = NULL;
        CreateLinkList(head,5);
        PrintLinkList(head);
        cout<<"Len: "<<GetLength(head)<<endl;
    
        InsertionSort(head);
        PrintLinkList(head);
    
        ReverseList(head);
        PrintLinkList(head);
    
        DestroyList(head);
    
        return 0;
    }
  • 相关阅读:
    深入浅出JMS(二)--ActiveMQ简单介绍以及安装
    redis学习
    浏览器的渲染过程
    http请求
    常用正则表达式
    js继承的几种实现方式
    js中的浅拷贝和深拷贝
    webpack常用的plugin
    linux基本命令
    webpack压缩代码组件uglifyjs-webpack-plugin
  • 原文地址:https://www.cnblogs.com/luxiaoxun/p/2622323.html
Copyright © 2011-2022 走看看