2016-11-14 118 views
-1

我是新的C和我仍然有一個很難理解如何指針和喜歡列出工作,因此我有所有的這一些問題。遞歸節點用C

我試圖從鏈表中刪除一個節點,我使用this link的例子,但我不能得到它的工作。

這裏是我的代碼:

#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: \n\n\n"); 
while (local != NULL) 
{ 
    printf("Numero voo: %d\n", local->numeroVoo); 
    printf("Cia Aerea: %s\n", local->ciaAerea); 
    printf("Modelo aeronave: %s\n", local->modeloAeronave); 
    printf("Origem: %s\n", local->origem); 
    printf("Destino: %s\n", local->destino); 
    printf("Quantidade total de assentos: %d\n", local->qtdeTotalAssentos); 
    printf("Quantidade de assentos ocupados: %d\n", 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) 

它運行,但是當我選擇調用此方法的選項時,我會在窗口中收到停止工作的消息。

沒有人有任何想法可能是什麼回事?

在此先感謝。

+0

不包括鏈接。在這裏顯示如何定義列表。 –

+0

'cadastroVoo'必須已經是一個指針。那麼,檢查你的警告。因爲你的修改也應該包括返回類型,並且它沒有改變。你也必須告訴我們你是如何分配你的列表和它的定義。 –

+0

我的編譯生成4個警告和4個錯誤。 –

回答

0

也許你不是一個指針傳遞給函數。我在這裏試過你的代碼,邏輯工作正常。

#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("> %d\n", local->numero); 
    printf("> %p\n", 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("%d\n", p->numero); 
     p = p->proximo; 
    } 
} 
0

這是一個壞主意,提供參考,而不是你的問題的實際代碼。

不過這裏是一個使用遞歸的方法與單鏈表的簡化示範項目。我相信它能滿足你的需求。調查並相應地更改您的項目。

#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