如何在输出上得到0?

时间:2017-05-18 14:33:31

标签: c list pointers struct singly-linked-list

所以我正在使用类型:

typedef struct lligada {
   int valor;
   struct lligada *prox;
} *LInt;

我正在尝试执行一个带有LInt(有序)的函数并消除重复的函数,我也需要释放重复的函数。

所以我对这个问题的作用是:

void remreps (LInt l){
      LInt aux;
      aux =l;

      for (; l!=NULL; ){

          if ((l->prox!=NULL) && (l->valor == (l->prox)->valor)) {
              free (l); 
              l=aux->prox;
              aux=l;
          }

          else {
              l=l->prox;
              aux=l;
          }
    }
}

第二次测试失败了(使用键盘,因为大学告诉我)。

Input: [  2  2 ]
Output: expected [  2 ]
        obtained [  0  2 ]

为什么我在输出上得到0?

2 个答案:

答案 0 :(得分:2)

尝试以下函数定义。

void remreps( LInt l )
{
      while (  l != NULL && l->prox != NULL )
      {
          if ( l->valor == l->prox->valor ) 
          {
              LInt tmp = l->prox;
              l->prox = l->prox->prox;
              free( tmp );
          }
          else 
          {
              l = l->prox;
          }
    }
}

这是一个示范程序

#include <stdio.h>
#include <stdlib.h>

typedef struct lligada {
   int valor;
   struct lligada *prox;
} *LInt;

void remreps( LInt l )
{
      while (  l != NULL && l->prox != NULL )
      {
          if ( l->valor == l->prox->valor ) 
          {
              LInt tmp = l->prox;
              l->prox = l->prox->prox;
              free( tmp );
          }
          else 
          {
              l = l->prox;
          }
    }
}


LInt push( LInt l, int valor )
{
    LInt tmp = malloc( sizeof( *l ) );

    tmp->valor = valor;
    tmp->prox = l;

    return tmp; 
}

void output( LInt l )
{
    for ( ; l != NULL; l = l->prox )
    {
        printf( "%d ", l->valor );
    }
}

int main(void) 
{
    LInt l = NULL;

    l = push( l, 2 );
    l = push( l, 2 );

    output( l );
    putchar( '\n' );

    remreps( l );

    output( l );
    putchar( '\n' );

    return 0;
}

它的输出是

2 2 
2 

答案 1 :(得分:1)

借用Vlad from Moscow中的代码,这里是没有将指针声明为类型的版本。

#include <stdio.h>
#include <stdlib.h>

typedef struct lligada {
   int valor;
   struct lligada *prox;
} LInt;

void remreps( LInt *l )
{
   while (  l != NULL && l->prox != NULL )
   {
      if ( l->valor == l->prox->valor ) 
      {
          LInt *tmp = l->prox;
          l->prox = l->prox->prox;
          free( tmp );
      }
      else 
      {
          l = l->prox;
      }
   }
}


LInt *
push( LInt *l, int valor )
{
   LInt *tmp = malloc( sizeof( *l ) );

   tmp->valor = valor;
   tmp->prox = l;

   return tmp; 
}

void output( LInt *l )
{
    for ( ; l != NULL; l = l->prox )
    {
       printf( "%d ", l->valor );
    }
}

int main(void) 
{
    LInt *l = NULL;

    l = push( l, 2 );
    l = push( l, 2 );
    l = push( l, 3 );
    l = push( l, 3 );
    l = push( l, 3 );
    l = push( l, 4 );
    l = push( l, 4 );

    output( l );
    putchar( '\n' );

    remreps( l );

    output( l );
    putchar( '\n' );

    return 0;
}

输出:

 4 4 3 3 3 2 2 
 4 3 2