检查链表是否回文的问题
ProblemChecking If A Linked List Is Palindrome Or Not
我正在尝试使用以下方法检查 link 是否为回文:
1) 创建并读取来自用户的原始 linked 列表。
2) 遍历原始linked 列表并使用堆栈实现使用linked 列表反转原始linked 列表。
3) 初始化 flag = 1。遍历两个 linked 列表并比较每个节点并中断循环并打印 "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");
}
}
然而,我总是得到 "The Linked List Is Palindrome!",即使不是!我做错了什么?
注意: 仅对单个 linked 列表完成。
所以你这里有错误
if(flag = 1)
return 1;
else
return 0;
这应该是:if(flag == 1)
。使用您的代码,您不是在检查 flag
的值,而是将 1 分配给 flag
但是您可以通过简单地返回标志来简化它:
return flag
此外,我没有扫描你所有的代码,但我相信 flag
不需要是全局的,因为它只用在你的 checkPal()
函数中,所以你可以声明它并只在那里初始化它。
我正在尝试使用以下方法检查 link 是否为回文:
1) 创建并读取来自用户的原始 linked 列表。 2) 遍历原始linked 列表并使用堆栈实现使用linked 列表反转原始linked 列表。 3) 初始化 flag = 1。遍历两个 linked 列表并比较每个节点并中断循环并打印 "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");
}
}
然而,我总是得到 "The Linked List Is Palindrome!",即使不是!我做错了什么?
注意: 仅对单个 linked 列表完成。
所以你这里有错误
if(flag = 1)
return 1;
else
return 0;
这应该是:if(flag == 1)
。使用您的代码,您不是在检查 flag
的值,而是将 1 分配给 flag
但是您可以通过简单地返回标志来简化它:
return flag
此外,我没有扫描你所有的代码,但我相信 flag
不需要是全局的,因为它只用在你的 checkPal()
函数中,所以你可以声明它并只在那里初始化它。