zoukankan      html  css  js  c++  java
  • 链表

    今天的伪优先队列(仅供参考)

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int maxn=1e9+7;
    const int INF = 0x3f3f3f3f;
    const int inf = INT_MAX;
    
    struct student{
        int height;
        struct student *next;
    }*Head;///建立链表
    
    struct student *insert_sort(struct student *Head,int idx)
    {
         struct student *p = Head;
         struct student *q;///需要插入的
         ///q = new struct student;
         q = (struct student *)malloc(sizeof(struct student));///两种都可以
         q -> height = idx;
         if ( !Head ) Head = q;///考虑第一种情况  如果链表为空
         else{
            if (p->height >= idx)///考虑第二种情况  如果第一个就大于它,他就要被放到第一个
            {
                q->next = p;
                Head = q;
                return Head;
            }
            else
            {
                while (p->next)///直接向后面找出第一个大于它的数所在的地址
                {
                    if (p->next->height >= idx)break;
                    p = p->next;
                }
                if (!(p->next))p->next = q;///第三种情况,如果遍历到链表的最后,就直接尾插入  
                ///链表长度为1的情况也考虑在内
                else
                {
                    q->next = p->next;
                    p->next = q;
                }
            }
         }
        return Head;
    }
    
    int main()
    {
        std::ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);///关闭同步流
        Head = NULL;
        int n;
        cin>>n;
        for (int i=0;i<n;++i)
        {
             int x;
             cin>>x;
             Head = insert_sort(Head,x);
        }
        struct student *p = Head;
        while (p)
        {
            cout<<p->height<<' ';
            p = p->next;
        }
        cout<<endl;
        return 0;
    }
    
    

    按照之前迅哥所讲 我们所构建的链表应该是这样的

    public:
        struct Node{
            int data;
            Node *next;
            Node (int a,Node *b):data(a),next(b){}
        };
    public:
        Node *head;
        int size;
    LinkedList::LinkedList(int value,,int n):head(0),size(n)
    {
       head=new Node(0,0);
       Node *q=head;
       for(int i=0;i<n;++i)
       {
            q->next=new Node(value,0);
            q=q->next;
       }
    }
    LinkedList:: Node* LinkedList::advance(int pos)const
    {
        Node *p=head;///由于最先的一个是空的表头,所以要从-1开始
        for (int i=-1;i<pos;++i)
        {
            p=p->next;
        }
        return p;
    }
    
    

    而这个Head是个空的头结点,但是这个空头结点等于new Node(0,0);所以它存在一个初地址,系统给他分配了一个内存,所以下列操作就是可以的

    int a=3;
    Head->next = &a;
    
    #include<bits/stdc++.h>
    using namespace std;
    #define ll  long long
    const int maxn=1e3+7;
    inline int read()
    {
        char c = getchar();
        int x = 0,fh = 0;
        while(c < '0' || c > '9'){fh |= c == '-';c = getchar();}
        while(c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}
        return fh?-x:x;
    }
    typedef struct student {
        int idx;
        struct student *next;
    };
    int  main()
    {
        struct student *Head;
        Head = new struct student;
        int n,m;
        cin>>n>>m;
        struct student *p;
        p = new struct student;
        p = Head;
        p-> next = 0;
        struct student *q ;
        q = new struct student;
        q->idx=m;
        p->next = q;
        printf("%d",q->idx);
        return 0;
    }
    

    但是你发现数据结构老师所讲的

    他的是

    #include<bits/stdc++.h>
    using namespace std;
    #define ll  long long
    const int maxn=1e3+7;
    inline int read()
    {
        char c = getchar();
        int x = 0,fh = 0;
        while(c < '0' || c > '9'){fh |= c == '-';c = getchar();}
        while(c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}
        return fh?-x:x;
    }
    typedef struct student {
        int idx;
        struct student *next;
    };
    int  main()
    {
        int n; cin>>n;
        struct student *Head;
        Head = NULL;//头结点是空的
        struct student *p;
        p = new struct  student;
        p->idx = 0;
        Head = p;//现在把指针Head指向p
        struct student *q;
        q = new struct  student;
        q->idx = n;
        p->next = q;
        cout<<p->next->idx<<endl;
        return 0;
    }
    

    也就是他这个 头结点本身就是不存在分配的地址,是虚假的,然后把他指向第一个数据 也就是说Head就是和第一个共地址

    迅哥的是单独一个地址Head->next的地址才是第一个地址

    以下皆是错的

        Head = NULL;//头结点是空的
        struct student *p;
        p = new struct  student;
        p->idx = 0;
        Head ->next = p;/
    

    此时的Head = NULL没有地址分配他的next也是空的,就不像迅哥那样new了一个地址,所以会指针越界

    所以我们只要Head = new struct student

    下列这个错误之处在于原本你想以Head为第一个存在的地址执行Head->next 但是Head = NULL;又被收回了这个地址

    Head = new struct student;
    Head = NULL;

     struct student *Head;
        Head = new struct student;
        Head = NULL;
        int n,m;
        cin>>n>>m;
        struct student *p;
        p = new struct student;
        p = Head;
        p-> next = 0;
        struct student *q ;
        q = new struct student;
        q->idx=m;
        p->next = q;
        printf("%d",q->idx);
    
    齐芒行,川锋明!
  • 相关阅读:
    图解SQL的Join(转)
    phpmyadmin 自动登录的办法
    ajax的data传参的两种方式
    如何在vue里面访问php?
    vue 路由部署服务器子目录问题
    Vuthink正确安装过程
    关于vueThink框架打包发布的一些问题
    使用npm安装依赖,尽量别使用cnpm,会漏掉很多依赖的
    phpstorm(或webstorm) 打开后 一直停留在scanning files to index....,或跳出内存不够的提示框
    vuethink 配置
  • 原文地址:https://www.cnblogs.com/qimang-311/p/13669136.html
Copyright © 2011-2022 走看看