c-用递归字符串中的字符创建一个链表



我必须编写一个递归函数,该函数在输入中有一个字符串,并创建一个表示该字符串的链表结构(因此每个记录的info参数都有一个该字符串的字符(。当我运行测试时,它什么都不做,所以我不知道错误在哪里,你能帮我吗?

链表结构:

typedef char TipoInfoSCL;
struct ElemSCL {
TipoInfoSCL info;
struct ElemSCL *next;
};
typedef struct ElemSCL TipoNodoSCL;
typedef TipoNodoSCL * TipoSCL;

功能

TipoSCL sclstrings_create (const char *scl)
{
TipoSCL ris;
if  (ris == NULL)
{
ris->info = '';
ris = NULL;
return ris;
}
else
{
TipoSCL ris = (TipoNodoSCL*) malloc (sizeof(TipoNodoSCL));
ris->next = ris;
ris->info = scl[0]; 
return sclstrings_create(scl + 1);
}
} 

测试

void printList(TipoSCL l);
int main(int argc, char const *argv[])
{
TipoSCL scl;
char *str = "Hello World";
scl = sclstrings_create(str);
sclstrings_print(scl) ;
return 0;
}
void printList(TipoSCL l)
{

TipoSCL aux = l;
int pos = 0;
while (aux != NULL)
{
printf("pos: %d, info: %cn", pos, aux->info);
aux = aux->next;
pos++;
}
}

因为这似乎是一项任务。我只会指出您的代码存在的一些问题,以及如何实现您想要的内容。

首先:sclstrings_create函数中的if条件ris == NULL不是您所期望的。由于ris被定义为TipoSCL ris;,并且TipoSCLElemSCL*的别名。变量ris保存指向某个ElemSCL值的指针。但由于您没有初始化ris,它可以有任何价值。因此,代码if (res == null) { ... } else { ... }是不稳定的,并导致未定义的行为。

第二:在表达式ris->next = ris;中,您创建了一个循环引用,它可能有意义,但在您的表达式中没有意义。

理念:

函数sclstrings_create(char* str)的思想是,它返回一个指向链表的指针,该链表保存字符串的所有chars。因此,递归的想法是检查给定的字符串是否为空,如果是,则返回NULL,如果否,则用str + 1调用sclstrings_create,以获得第一个char所需的字符串的链接列表。然后将第一个char打包到列表元素中,并将next字段设置为递归创建列表,并返回指向创建的列表元素的指针。

在函数sclstrings_create中,声明了一个本地未初始化变量

TipoSCL ris;

因此,使用局部变量的下一个if语句

if  (ris == NULL)

调用未定义的行为。

此外,if语句的子语句

if  (ris == NULL)
{
ris->info = '';
ris = NULL;
return ris;
}

没有意义,因为在这种情况下,函数返回一个空指针并调用未定义的行为,因为还使用了一个空指示器来访问内存。

if语句的其他部分在逻辑上也是不正确的

else
{
TipoSCL ris = (TipoNodoSCL*) malloc (sizeof(TipoNodoSCL));
ris->next = ris;
ris->info = scl[0]; 
return sclstrings_create(scl + 1);
}

例如,您分配了一个没有附加到列表中的节点,因为它指向自身

ris->next = ris;

函数返回指针指向另一个节点

return sclstrings_create(scl + 1);

这会导致内存泄漏。

该功能可以通过以下方式定义

TipoSCL sclstrings_create( const char *scl )
{
if ( *scl == '' )
{
return NULL;
}
else
{
TipoSCL ris = malloc( sizeof( TipoNodoSCL ) );
ris->info = *scl; 
ris->next = sclstrings_create( scl + 1 );
return ris;
}
} 

在其定义中,函数名称似乎有拼写错误

void printList(TipoSCL l)
^^^^^^^^^

必须有

void sclstrings_print(TipoSCL l)
^^^^^^^^^^^^^^^

相关内容

最新更新