zoukankan      html  css  js  c++  java
  • 链表

    智商抓鸡,链表看得我纠结了一天,继续note


    只换名不换内容问题

     1 struct student *sort(struct student *head)
     2 {
     3     struct student *p1,*p2,*temp;
     4     p1=head;
     5     p2=head->next;
     6     printf("before change:p1:%ld,%d;p2:%ld,%d
    ",p1->num,p1->score,p2->num,p2->score);
     7     temp=p2;
     8     p2=p1;
     9     p1=temp;
    10     printf("after change:p1:%ld,%d;p2:%ld,%d
    ",p1->num,p1->score,p2->num,p2->score);
    11     return head;
    12 }

    运行结果

    before change:p1:1,11;p2:2,22
    fter change:p1:2,22;p2:1,11

    表明可以通过

    temp=p2;
    p2=p1;
    p1=temp;
    的方法来交换名称而不交换内容

    交换名称与内容问题

    链表头交换
     1 struct student *sort(struct student *head)
     2 {
     3     struct student *p1,*p2,*p3,*temp,*temp_name;
     4     p1=head;
     5     p2=head->next;
     6     p1->next=p2->next;
     7     p2->next=p1;
     8     head=p2;
     9     return head;
    10 }

    运行结果:

    换前

    1 11
    2 22
    3 33
    4 44

    换后
    2 22
    1 11
    3 33
    4 44

    链表中及链表尾

     1 struct student *sort(struct student *head)
     2 {
     3     struct student *p1,*p2,*p3,*temp;
     4     p3=head;
     5     p1=p3->next;
     6     p2=p1->next;
     7 
     8     temp=(struct student *)malloc(LEN);
     9     temp->next=p3->next;
    10     p3->next=p1->next;
    11     p1->next=p2->next;
    12     p2->next=temp->next;
    13     return head;
    14 }

     运行结果1(链表中)

    换前

    1 11
    2 22
    3 33
    4 44

    换后
    1 11
    3 33
    2 22
    4 44

    运行结果2(链表尾)

    换前

    1 11
    2 22
    3 33
    4 44

    换后
    1 11
    3 33
    2 22
    4 44

    此法可行

    必须先给temp分配一个空间,否则会造成不可预测情况

    此处带出另外一个问题

    定义一个自定义struct的指针后,使用前要执行以下其中一步

    1.分配空间

    2.指向某个已经分配空间的struct

    3.指向NULL

    做了前两个操作的才能访问或者修改结构内的变量,如p->num等


     结合以上两种方法可以做到只换内容不换名字

     1 struct student *sort(struct student *head)
     2 {
     3     struct student *p1,*p2,*p3,*temp,*temp_name;
     4     p3=head;
     5     p1=p3->next;
     6     p2=p1->next;
     7 
     8     printf("before change num:
    p1:%ld,%d
    p2:%ld,%d
    ",p1->num,p1->score,p2->num,p2->score);
     9     print(head);
    10     temp=(struct student *)malloc(LEN);
    11     temp->next=p3->next;
    12     p3->next=p1->next;
    13     p1->next=p2->next;
    14     p2->next=temp->next;
    15     printf("after change num:
    p1:%ld,%d
    p2:%ld,%d
    ",p1->num,p1->score,p2->num,p2->score);
    16     print(head);
    17 
    18     printf("before change num and name:
    p1:%ld,%d
    p2:%ld,%d
    ",p1->num,p1->score,p2->num,p2->score);
    19     print(head);
    20     temp_name=p2;
    21     p2=p1;
    22     p1=temp_name;
    23     printf("after change num and name:
    p1:%ld,%d
    p2:%ld,%d
    ",p1->num,p1->score,p2->num,p2->score);
    24     print(head);
    25     return head;
    26 }

    运行结果:

    before change num:
    p1:2,22
    p2:3,33
    1 11
    2 22
    3 33
    4 44
    after change num:
    p1:2,22
    p2:3,33
    1 11
    3 33
    2 22
    4 44
    before change num and name:
    p1:2,22
    p2:3,33
    1 11
    3 33
    2 22
    4 44
    after change num and name:
    p1:3,33
    p2:2,22
    1 11
    3 33
    2 22
    4 44


    最后我的链表冒泡排序法

     1 struct student *sort(struct student *head)//from small to large
     2 {
     3     struct student *temp,*tempname,*tempcounter,*p1,*p2,*p3;
     4     int counter=0,i,j;
     5     temp=(struct student *)malloc(LEN);
     6     //Çó½áµãÊý
     7     tempcounter=head;
     8     while(tempcounter->next!=NULL)
     9     {
    10         tempcounter=tempcounter->next;
    11         counter++;
    12     }
    13     //sort
    14     for(i=0;i<counter;i++)
    15     {
    16         p1=head;
    17         p2=head->next;
    18         if(p1->num > p2->num)
    19         {
    20             p1->next=p2->next;
    21             p2->next=p1;
    22             head=p2;
    23         }
    24         p1=head->next;
    25         p2=p1->next;
    26         p3=head;
    27         for(j=0;j<counter-i-1;j++)
    28         {
    29             if(p1->num > p2->num)
    30             {
    31                 //exchange all
    32                 temp->next=p3->next;
    33                 p3->next=p1->next;
    34                 p1->next=p2->next;
    35                 p2->next=temp->next;
    36                 //exchange name
    37                 tempname=p2;
    38                 p2=p1;
    39                 p1=tempname;
    40             }
    41             p1=p1->next;
    42             p2=p2->next;
    43             p3=p3->next;
    44         }
    45     }
    46     free(temp);
    47     return head;
    48 }

    还是VM厉害,VM的方法更灵活简单

     1 struct student *sort(struct student *head)
     2 {
     3     struct student *h2,*t,*p;
     4     h2=NULL;p=head;
     5     while(p!=NULL){
     6         t=p;p=p->next;t->next=NULL;
     7         h2=insert(h2,t);
     8     }
     9     return h2;
    10 }

    老师给的insert函数是按顺序插入的,此法是用新链表,按顺序读取原链表,然后insert进新链表中,自然是按照顺序排了


    再补,这题弄得太复杂了。。根本不需要换结点那么复杂,只需要对num和score直接修改就可以了。。今天好煞笔。。

  • 相关阅读:
    专题三--1005
    专题三--1009
    专题三--1017
    背包九讲
    专题三--1003
    专题三--1004
    专题三--1015
    [洛谷P1220]关路灯
    [洛谷P1776]宝物筛选
    [USACO14JAN]Recording the Moolympics
  • 原文地址:https://www.cnblogs.com/someblue/p/3366776.html
Copyright © 2011-2022 走看看