• 单链表的reverse


    单链表的反序:将已有链表的节点的值反序

    废话不多说直接上代码;下面代码提供了两个版本,sll_reverse是我自己做的时候想的笨办法,answer_reverse是我在网上看的一个版本(非常精简)。

      1 #include<stdio.h>
      2 #include <stdlib.h>
      3 #define N 5
      4 typedef struct NODE{
      5     struct NODE *link;
      6     int value;
      7 }Node;
      8 Node* sll_reverse(Node *first);
      9 int sll_insert( register Node **linkp, int new_value );
     10 void print(Node* rootp);
     11 unsigned int count(Node*linkp);
     12 struct NODE *answer_reverse( struct NODE *current ); 
     13 int main (void) 
     14 {
     15     Node  *p1 = (Node *)malloc( sizeof( Node ) );
     16     p1->link=NULL;
     17     p1->value=5;
     18     int i;
     19     int value;
     20     printf("输入想要插入的值:
    ");
     21     while(scanf("%d",&value)==1)
     22         sll_insert(&p1,value);
     23     print(p1);
     24     printf("
    经过反序后,链表中的内容为:
    ");
     25     //print(sll_reverse(p1)); 
     26     print(answer_reverse(p1));
     27     return 0;
     28 }
     29 unsigned int count(Node*linkp)
     30 {
     31     unsigned int num=0;
     32     Node *tmp=linkp;
     33     if(!linkp)
     34     {
     35         printf("link is NULL
    ");
     36         exit(1);
     37     }
     38     while(tmp)
     39     {
     40         ++num;
     41         tmp=tmp->link;
     42     }
     43     return num;
     44 }
     45 Node* sll_reverse(Node *first)
     46 {
     47     if(first==NULL)//先判断是否是空表 
     48     return NULL; 
     49     Node *newnode=(Node*)malloc(sizeof(Node));
     50     if(newnode==NULL)
     51     return NULL;
     52     
     53     Node*tmp=first;
     54     int n=count(first);//计算已经存在的单链表中的节点数目 
     55     int *p=(int*)malloc(n*sizeof(int));//进行动态数组分配 
     56     int i=0; 
     57     while(tmp!=NULL)//将原链表中节点的数据存储到动态数组中 
     58     {
     59         p[i++]=tmp->value;
     60         tmp=tmp->link;
     61     }
     62     newnode->link=NULL;
     63     newnode->value=p[n-1];//创建链表的第一个节点,并把动态数组的最后一个值赋值 
     64     for(i=n-2;i>=0;i--)//从动态数组打的倒数第二个数据开始,一次不排序的插入到新链表中 
     65     insert(&newnode,p[i]);
     66     return newnode;
     67 }
     68 struct NODE *answer_reverse( struct NODE *current )//答案的版本 
     69 {
     70 struct NODE *previous=NULL;
     71 struct NODE *next;
     72 //for( previous = NULL; current != NULL; current = next ){
     73 //next = current->link;
     74 //current->link = previous;
     75 //previous = current;
     76 //}
     77 while(current!=NULL)
     78 {
     79     next=current->link;//next保存原链表的当前指针的下一个指针 
     80     current->link=previous;//改变当前指针的执向,也就是构建新的链表 
     81     previous=current;//把原链表的第一个节点作为新链表的最后一个节点
     82     current=next;//把next的值赋值给current,直到current==NULL 
     83 }
     84 return previous;
     85 }
     86 int insert(Node **linkp,int value)
     87 {
     88     Node *current;
     89     Node *new;
     90     while((current=*linkp)!=NULL)
     91     linkp=&current->link;
     92     new=(Node*)malloc(sizeof(struct NODE));
     93     if(new==NULL)
     94     return -1;
     95     new->value=value;
     96     new->link=current;
     97     *linkp=new;
     98     return 0;
     99 }
    100 int
    101 sll_insert( register Node **linkp, int new_value )
    102 {
    103     register Node    *current;
    104     register Node    *new;
    105 
    106     
    107     while( ( current = *linkp ) != NULL &&
    108         current->value < new_value )
    109         linkp = &current->link;
    110 
    111 
    112     new = (Node *)malloc( sizeof( Node ) );
    113     if( new == NULL )
    114         return -1;
    115     new->value = new_value;
    116 
    117 
    118     new->link = current;
    119     *linkp = new;
    120     return 0;
    121 }
    122 void print(Node* rootp)
    123 {
    124     if(rootp==NULL)
    125     exit(1);
    126     Node*tmp=rootp;
    127     while(tmp)
    128     {
    129         printf("value=%d
    ",tmp->value);
    130         tmp=tmp->link;
    131     }
    132 }
  • 相关阅读:
    springcloud 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    java 整合redis缓存 SSM 后台框架 rest接口 shiro druid maven bootstrap html5
    继承
    封装
    对象的生命周期
    类与对象
    如何理解类?
    面向过程
    jdk1.8新特性
    git使用指南
  • 原文地址:https://www.cnblogs.com/zydark/p/8886312.html
Copyright © 2020-2023  润新知