gpt4 book ai didi

c - 理解链表C中的递归函数

转载 作者:行者123 更新时间:2023-11-30 14:44:13 25 4
gpt4 key购买 nike

假设我编写了一个模拟多米诺骨牌游戏的程序,因此我想按以下方式定义一个结构体:

typedef struct nodo { 
int casella1;
int casella2;
struct nodo *next;
} Tessera;
typedef Tessera *Lista;

然后,在按随意顺序进行一些输入(当输入 0 <= x <= 6 范围之外的数字时结束)之后,我想删除不遵守多米诺骨牌规则的可能重复项。使用递归函数,数字 casella2 后面应始终跟有 ->next->casella1 中的相同数字,如下所示:

void legale(Lista *head) {

Lista aux,aus = *head;

if(aus->next == NULL) {
return;
}

else if(aus->casella2 == aus->next->casella1) {
legale(&(aus->next));
}
else {
aux = aus->next;
aus->next = aus->next->next;
free(aux);
}
}

但是例如序列“1 2, 2 3, 3 4, 4 5, 5 4, 6 2, 7”给出“1 2, 2 3, 3 4, 4 5,6 2 ”所以它不会不要删除 6,2,因为它应该。

我认为我删除指针的方式是正确的,那么为什么函数是错误的呢?

代码如下:

#include<stdio.h>
#include<stdlib.h>
typedef struct nodo {
int casella1;
int casella2;
struct nodo *next;
}Tessera;
typedef Tessera *Lista;

void stampa(Lista *head) {

Lista ausil = *head;

while(ausil != NULL) {
printf("%d\t%d\n",ausil->casella1,ausil->casella2);
ausil = ausil->next;
}
}

void legale(Lista *head) {

Lista aux,aus = *head;

if(aus->next == NULL) {
return;
}

else if(aus->casella2 == aus->next->casella1) {
legale(&(aus->next));
}
else {
aux = aus->next;
aus->next = aus->next->next;
free(aux);
}


}

void write (Lista *head) {
Lista corr,aux,aus;
int x,y;
scanf("%d%d",&x,&y);
aus = *head;

while((x >= 0 && x <= 6) && (y >= 0 && y <= 6)) {

if(aus == NULL) {

aus = malloc(sizeof(Tessera));
aus->casella1 = x;
aus->casella2 = y;
aus->next = NULL;
*head = aus;
}
else {
aux = *head;

corr = malloc(sizeof(Tessera));
corr->casella1 = x;
corr->casella2 = y;
corr->next = aux;
*head = corr;
}
scanf("%d%d",&x,&y);
}

}

int main() {
Lista Lista1 = NULL;
write(&Lista1);
legale(&Lista1);
stampa(&Lista1);
return 0;
}

最佳答案

删除重复项后,您至少错过了一次递归调用,

else {
aux = aus->next;
aus->next = aus->next->next;
free(aux);
}

如果你不递归,你会在第一次删除后停止。

另外,为了预防起见,在检查是否 aus->next == NULL 之前,您应该检查是否 aus == NULL 这样,如果您将其传递给它,它就不会中断空列表。

<小时/>

编辑

当你阅读它时,你正在向后构建你的链接列表。

你将每一对插入到头部,所以最后你的顺序是相反的。阅读完列表后将其打印出来以确保没问题总是一个好主意;)

关于c - 理解链表C中的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53601520/

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