我正在尝试使用以下方法检查链接是否为回文:
1)创建并阅读用户的原始链表。 2)遍历原始链表并使用链表实现使用链表反转原始链表。 3)初始化标志= 1.遍历两个链接列表并比较每个节点并打破循环并打印" Not Palindrome"如果任何两个节点数据不匹配,则打印" Palindrome"。
该计划如下:
#include <stdio.h>
#include <stdlib.h>
int flag = 1;
struct node {
int data;
struct node *next;
}*start = NULL, *head = NULL;
void create() {
char ch;
do {
struct node *new_node, *prev;
new_node = (struct node*)malloc(sizeof(struct node));
printf("Please Enter The Data: ");
scanf("%d", &new_node->data);
new_node->next = NULL;
if(start == NULL) {
start = new_node;
} else {
prev->next = new_node;
}
prev = new_node;
printf("Do You Still Want To Insert(y/n)? ");
fflush(stdin);
scanf("%c", &ch);
}while(ch != 'n');
}
void reverse() {
struct node *current;
current = start;
while(current != NULL) {
struct node *new_node, *prev;
new_node = (struct node*)malloc(sizeof(struct node));
new_node->data = current->data;
new_node->next = NULL;
if(head == NULL) {
head = new_node;
} else {
new_node->next = head;
head = new_node;
}
prev = new_node;
current = current->next;
}
}
int checkPal() {
struct node *current1, *current2;
current1 = start;
current2 = head;
while(current1 != NULL && current2 != NULL) {
if(current1->data != current2->data) {
flag = 0;
break;
}
current1 = current1->next;
current2 = current2->next;
}
if(flag = 1)
return 1;
else
return 0;
}
void display(struct node *list) {
while(list != NULL) {
printf("%d --> ", list->data);
list = list->next;
}
printf("NULL\n");
}
int main() {
create();
printf("The original linked list is: \n");
display(start);
reverse();
printf("The reversed linked list is: \n");
display(head);
if(checkPal()) {
printf("The Linked List Is Palindrome!\n");
} else {
printf("The Linked List Is Not Palindrome!\n");
}
}
然而,我总是得到&#34;链接列表是回文!&#34;即使它不是!我做错了什么?
注意:仅使用单链表进行。
答案 0 :(得分:1)
所以你这里有错误
if(flag = 1)
return 1;
else
return 0;
这应该是:if(flag == 1)
。使用您的代码,您不会检查flag
的值,而是将{1}分配给flag
但是你可以通过简单地返回flag来简化它:
return flag
此外,我没有扫描您的所有代码,但我认为flag
不需要是全局的,因为它仅用于您的checkPal()
函数,因此您可以声明它只在那里初始化。