假设我写了一个模拟多米诺骨牌游戏的程序,所以我想用以下方式定义一个结构:
typedef struct nodo {
int casella1;
int casella2;
struct nodo *next;
} Tessera;
typedef Tessera *Lista;
然后在以随意顺序进行一些输入之后,当一个数字在0<x<;=如果输入了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
是否为,这样,如果您向它传递一个空列表,它就不会中断。
编辑
当你阅读链接列表时,你正在向后构建它。
你把每一对都插在头上,所以最后你的顺序是向后的。阅读后打印出你的清单以确保它是可以的,这总是一个好主意;(