理解链表C中的递归函数



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

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

然后在以随意顺序进行一些输入之后,当一个数字在0&ltx<=如果输入了6,我想删除可能不遵守domino规则的重复项。使用递归函数,数字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("%dt%dn",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是否为,这样,如果您向它传递一个空列表,它就不会中断。


编辑

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

你把每一对都插在头上,所以最后你的顺序是向后的。阅读后打印出你的清单以确保它是可以的,这总是一个好主意;(

相关内容

  • 没有找到相关文章

最新更新