gpt4 book ai didi

c - 链表问题

转载 作者:太空狗 更新时间:2023-10-29 15:21:34 24 4
gpt4 key购买 nike

我有这个代码:

#include "stdlib.h"
#include "stdio.h"

typedef struct lista TLista;
struct lista{
char dado;
TLista* prox;
}lista;

TLista* insere(TLista* l, char dado){
TLista* aux;
TLista* anterior;
if(l == NULL){
l = (TLista*) malloc(sizeof(TLista));
l->dado = dado;
l->prox = NULL;
}else{
aux = l;
while(aux != NULL){
anterior = aux;
aux = aux->prox;
}
aux = (TLista*) malloc(sizeof(TLista));
anterior->prox = aux;
aux->dado = dado;
aux->prox = NULL;
}
return l;
}

void imprime(TLista* l){
if(l == NULL){
printf("A lista esta vazia");
}else{
while(l != NULL){
printf("%c", l->dado);
l = l->prox;
}
}

void concatena(TLista* lista1, TLista* lista2){
TLista* aux = lista1;
if(!lista1){
lista1 = lista2;
printf("\nInside function: ");
imprime(lista1);
}else{
while(aux->prox != NULL){
aux = aux->prox;
}
aux->prox = lista2;
}
}

int main() {
TLista* lista1 = NULL;
TLista* lista2 = NULL;
printf("\n");
lista1 = insere(lista1, 't');
lista1 = insere(lista1, 'e');
lista1 = insere(lista1, 's');
lista1 = insere(lista1, 't');
lista1 = insere(lista1, 'e');

imprime(lista1);

printf("\n\n\n\n");

lista2 = insere(lista2, 'x');
lista2 = insere(lista2, 'u');
lista2 = insere(lista2, 'l');
lista2 = insere(lista2, 'a');
lista2 = insere(lista2, 'm');
lista2 = insere(lista2, 'b');
lista2 = insere(lista2, 's');

concatena(lista1,lista2);
printf("\nOutside function: ");
imprime(lista1);
printf("\n\n");
return 0;
}

函数名称是用葡萄牙语写的。所以,函数 concatena 应该合并两个列表,事实上当 lista1 不是 NULL 时它正在这样做,但是当我注释掉这些行时:

  lista1 = insere(lista1, 't');
lista1 = insere(lista1, 'e');
lista1 = insere(lista1, 's');
lista1 = insere(lista1, 't');
lista1 = insere(lista1, 'e');

imprime(lista1);

concatena 函数应接收第一个列表作为 NULL,第二个列表作为 xulambs。根据它,lista1 应该接收到lista2 的头地址,但是当函数结束时执行lista1 是空的。

我在接收到 lista2 的头地址后调试打印 lista1 的值并且它工作正常,但是当到达主函数时,lista1 仍然是 NULL

谁能帮我弄清楚发生了什么事?谢谢


一些翻译:

  1. lista = 列表
  2. dado = 数据
  3. prox = 下一个
  4. imprime = 打印
  5. 插入=添加
  6. 连接 = 合并

最佳答案

主函数中“TLista* lista1”的变量值,当你传递给另一个函数(concatena)并在那里修改时,它并没有被修改。

要么让“concatena”返回一个有效的指针,例如

lista1 = concatena(lista1,lista2);

并在 lista1 为 NULL 的情况下从 concatena 返回 lista2,或者您将指向“lista1”变量的指针传递给函数,例如

concatena(&lista1, lista2)

...在这种情况下,您的 concatena 函数将如下所示:

void concatena(TLista** lista1, TLista* lista2){
TLista* aux = *lista1;
if(!*lista1){
*lista1 = lista2;
printf("\nInside function: ");
imprime(*lista1);
}else{
while(aux->prox != NULL){
aux = aux->prox;
}
aux->prox = lista2;
}
}

但是,像这样到处指点肯定会让人感到困惑。拥有一个结构来维护指向列表第一个元素的指针并传递指向该结构的指针会更容易。

关于c - 链表问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36632030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com