如何在输出中获得 0?
How can I get a 0 on the output?
所以我正在使用以下类型:
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?
试试下面的函数定义。
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
从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
所以我正在使用以下类型:
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?
试试下面的函数定义。
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
从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