c - 从函数写入时,链表状态保持不变
问题描述
我在使用一个非常简单的函数时遇到问题,我必须创建一个链表,每个节点都存储字符串中的一个字符,我为此创建了一个函数,但是它似乎根本没有做任何事情
这是我正在谈论的函数(变量名称是西班牙语,我很抱歉):
struct listaDoble crearMiADN()
{
char miDni[] = "1234";
struct listaDoble listado = crearLista(strlen(miDni));
struct nodo *actual = listado.first;
for(int i = 0; i<strlen(miDni); i++)
{
if(miDni[i] != '\0' && miDni[i] != EOF)
{
actual->tuNombre[0] = miDni[i];
actual->tuNombre[1] = '\0';
actual = actual->next;
}
}
return listado;
}
这是有效的功能crearLista
,但您可能需要它来理解我的代码:
struct listaDoble crearLista(int num_nodos)
{
struct listaDoble *result = (struct listaDoble *)malloc(sizeof(struct listaDoble));
if(num_nodos > 0)
{
result->first = (struct nodo *)malloc(sizeof(struct nodo));
result->first->prev = NULL;
struct nodo *actual = result->first;
struct nodo *prev = NULL;
struct nodo *last;
for(int i = 0; i < num_nodos; i++)
{
if(i + 1 != num_nodos)
{
actual->next = (struct nodo*)(malloc)(sizeof(struct nodo));
actual->prev = prev;
actual = actual->next;
prev = actual;
}
else
{
actual->next = NULL;
actual->prev = prev;
last = actual;
}
}
result->last = last;
result->size = num_nodos;
}
else
{
result->first = NULL;
result->last = NULL;
result->size = 0;
}
return *result;
}
在评论中要求
struct listaDoble
{
struct nodo *first, *last;
int size;
};
现在这就是我所说crearMiADN
的
struct listaDoble dni = crearMiADN();
现在预期的结果将是这样的
NULL<-- [1] <-> [2] <-> [3] <-> [4] --> NULL
然而这就是我得到的
NULL<-- [] <-> [] <-> [] <-> [] --> NULL
我对指针不是很热衷,我修复它的尝试实际上是试图在某处放置一个 * 并查看它是否有效(剧透警报,它没有)
所以像这样
struct listaDoble dni = *crearMiADN(); //type mismatch
然后我尝试修复我这样做的类型不匹配
struct listaDoble crearMiADN()
//...//
return *listado;
}
再次出错,现在我几乎被困在尝试将 * 随机放在某个地方并检查它是否可以编译和工作
解决方案
您正在尝试返回局部变量。您应该分配该内存块并返回指针。通过更正代码重试如下。
struct listaDoble* crearMiADN()
{
char miDni[] = "1234";
struct listaDoble *listado = crearLista(strlen(miDni));
...
return listado;
}
struct listaDoble* crearLista(int num_nodos)
{
struct listaDoble *result = (struct listaDoble *)malloc(sizeof(struct listaDoble));
...
return result;
}
推荐阅读
- java - Openshift中的Spring Boot / VertX调用超时
- .net - 如果未安装 ODAC,为什么我们需要向所有调用项目添加对 Oracle.ManagedDataAccess 的引用?
- html - 提交后重置角度表单
- javascript - WebRTC - Offer-Answer 发生两次
- hibernate-search - Hibernate Search 仅添加来自 IndexedEmbedded 类的 DocumentId
- iis - 在 windows server 2012 R2 的 iis 中创建自签名证书
- python - 根据列表列表中的十六进制地址对内部列表进行排序
- powershell - New-UnifiedGroup 不适用于 ErrorAction
- php - 我在 laravel 网站上收到错误 404
- javascript - 在Javascript中识别用户浏览器并传递给asp.net c#如果不是IE浏览器则显示错误页面