在C中递归地从链表中删除节点



我是C语言的新手,我仍然很难理解指针和喜欢列表是如何工作的,因此我对所有这些都有一些问题。

我正试图从链表中删除一个节点,我正在使用这个链接上的例子,但我不能让它工作。

下面是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct voos
{
int numeroVoo;
char ciaAerea[20];
char modeloAeronave[20];
char origem[20];
char destino[20];
int qtdeTotalAssentos;
int qtdeAssentosOcupados;
struct voos *proximo;
} *cadastroVoo;
int cont = 0; //Contador temporario para contar numero de assentos ocupados
void addVoo (cadastroVoo *local) //Add item to list
{
cadastroVoo novo;
novo = (cadastroVoo) malloc(sizeof(struct voos));
char temp[20];
if (novo != NULL)
{
    printf("Informe o numero do voo: n");
    scanf("%d", &novo->numeroVoo);
    printf("Informe a cia aerea: n");
    fflush(stdin);
    gets(temp);
    strcpy(novo->ciaAerea, temp);
    printf("Informe o modelo da aeronave: n");
    fflush(stdin);
    gets(temp);
    strcpy(novo->modeloAeronave, temp);
    printf("Informe a origem do voo: n");
    fflush(stdin);
    gets(temp);
    strcpy(novo->origem, temp);
    printf("Informe o destino do voo: n");
    fflush(stdin);
    gets(temp);
    strcpy(novo->destino, temp);
    cont++;
    novo->qtdeAssentosOcupados = cont;
    novo->qtdeTotalAssentos = 50;
    novo->proximo = *local;
    *local = novo;
}
}
void listarVoos(cadastroVoo local) //prints list
{
printf("Imprimindo lista atualizada: nnn");
while (local != NULL)
{
    printf("Numero voo: %dn", local->numeroVoo);
    printf("Cia Aerea: %sn", local->ciaAerea);
    printf("Modelo aeronave: %sn", local->modeloAeronave);
    printf("Origem: %sn", local->origem);
    printf("Destino: %sn", local->destino);
    printf("Quantidade total de assentos: %dn", local->qtdeTotalAssentos);
    printf("Quantidade de assentos ocupados: %dn", local->qtdeAssentosOcupados);
    printf("n");
    local = local->proximo;
}
}
cadastroVoo *cancelarPassagem(cadastroVoo *local, int numVoo) //deletes item from list
{
// See if we are at end of list.
if (local == NULL) return NULL;
// Check to see if current node is one to be deleted.
if (local->numeroVoo == numVoo)
{
    cadastroVoo *tempNextP;
    tempNextP = local->proximo;
    free(local);
    return tempNextP;
}
// Check the rest of the list, fixing the next pointer in case the next node is the one removed.
local->proximo = cancelarPassagem(local->proximo, numVoo);
//Return the pointer to where we were called from.  Since we did not remove this node it will be the same.
return local;
}
int main()
{
cadastroVoo cadastro = NULL;
char op;
while(op != 'f')
{
    printf("Escolha a opcao:n");
    printf("a - Incluir voos:n");
    printf("b - Listar voos:n");
    printf("c - Reservar assento em um voo:n");
    printf("d - Cancelar voo:n");
    printf("e - Cancelar passagem:n");
    printf("f - Sair:n");
    op = getche();
    printf("n");
    switch(op)
    {
    case 'a':
        {
            printf("Incluir voo. n");
            addVoo(&cadastro);
            printf("Voo incluso.n");
            break;
        }
    case 'b':
        {
            listarVoos(cadastro);
            break;
        }
    case 'c':
        {
            printf("Reservar assento em um voo. n");
            addVoo(&cadastro);
            printf("Assento reservado.n");
            break;
        }
    case 'd':
        {
            /**
            *while (cancelarVoo != NULL) cancelarVoo()
            */
            break;
        }
    case 'e':
        {
            int numVoo;
            printf("Informe o numero do voo que deseja cancelar a passagem: n");
            scanf("%d", &numVoo);
            cancelarPassagem(&cadastro, numVoo);
            printf("Passagem cancelada");
            break;
        }
    case 'f': break;
    default:
        {
            printf("Opcao invalida.");
            break;
        }
    }
}
return 0;
}

在方法声明中,如果我传入:

cadastroVoo *cancelarPassagem(cadastroVoo *local, int numVoo)

我得到错误:请求成员'numeroVoo'在某些不是结构或联合

但是如果我通过

cadastroVoo *cancelarPassagem(cadastroVoo local, int numVoo)

它运行,但是当我选择调用这个方法的选项时,我将在windows上得到它停止工作的消息。

有谁知道会出什么问题吗?

可能你没有传递一个指向函数的指针。我在这里试了你的代码,逻辑工作得很好。

#include <stdio.h>
typedef struct cadastroVoo {
    struct cadastroVoo *proximo;
    int numero;
} CadastroVoo;
CadastroVoo *cancelarPassagem(CadastroVoo *local, int num);
void inserir(CadastroVoo *cabeca, int num) {
    CadastroVoo *p = (CadastroVoo *) malloc(sizeof(CadastroVoo)); 
    p->proximo = cabeca->proximo;
    p->numero = num;
    cabeca->proximo = p;
}
CadastroVoo *cancelarPassagem(CadastroVoo *local, int num) {
    if (local == NULL) return NULL;
    printf("> %dn", local->numero);
    printf("> %pn", local->proximo);
    if (local->numero == num) {
        CadastroVoo *proximo = local->proximo;
        free(local);
        return proximo;
    } 
    local->proximo = cancelarPassagem(local->proximo, num);
    return local;
}   
int main() {
    CadastroVoo *cabeca = (CadastroVoo *) malloc(sizeof(CadastroVoo)); 
    cabeca->proximo = NULL;
    inserir(cabeca, 10);
    inserir(cabeca, 20);
    inserir(cabeca, 30);
    inserir(cabeca, 40);
    inserir(cabeca, 50);
    cancelarPassagem(cabeca->proximo, 20);
    CadastroVoo *p = cabeca->proximo;
    while (p != NULL) {
        printf("%dn", p->numero);
        p = p->proximo;
    }
}

在你的问题中给出参考而不是实际代码是一个坏主意。

尽管如此,这里有一个简化的演示程序,它使用递归方法处理单链表。我相信它能满足你的需要。调查它并相应地更改您的项目。

#include <stdio.h>
#include <stdlib.h>
typedef struct List
{
    int data;
    struct List *next;
} List;
List * add_node( List *head, int data )
{
    if ( head == NULL )
    {
        head = malloc( sizeof( List ) );
        head->data = data;
        head->next = NULL;
    }
    else
    {
        head->next = add_node( head->next, data );
    }
    return head;
}
List * remove_node( List *head, int data )
{
    if ( head != NULL )
    {
        if ( head->data == data )
        {
            List *tmp = head;
            head = head->next;
            free( tmp );
        }
        else
        {
            head->next = remove_node( head->next, data );
        }
    }
    return head;
}
void display_list( List *head )
{
    if ( head != NULL )
    {
        printf( "%d ", head->data );
        display_list( head->next );
    }
}
int main(void) 
{
    const int N = 10;
    List *head = NULL;
    for ( int i = 0; i < N; i++ ) 
    {
        head = add_node( head, i );
        display_list( head );
        printf( "n" );
    }
    for ( int i = N; i != 0; i-- ) 
    {
        head = remove_node( head, i - 1 );
        display_list( head );
        printf( "n" );
    }
    return 0;
}

程序输出为

0 
0 1 
0 1 2 
0 1 2 3 
0 1 2 3 4 
0 1 2 3 4 5 
0 1 2 3 4 5 6 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 
0 1 2 3 4 5 
0 1 2 3 4 
0 1 2 3 
0 1 2 
0 1 
0 

相关内容

  • 没有找到相关文章

最新更新