问题检查如果链接列表是回文序列还是没有

时间:2016-09-03 13:33:19

标签: c singly-linked-list

我正在尝试使用以下方法检查链接是否为回文:

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;即使它不是!我做错了什么?

注意:仅使用单链表进行。

1 个答案:

答案 0 :(得分:1)

所以你这里有错误

 if(flag = 1)
        return 1;
 else
        return 0;

这应该是:if(flag == 1)。使用您的代码,您不会检查flag的值,而是将{1}分配给flag 但是你可以通过简单地返回flag来简化它:

return flag

此外,我没有扫描您的所有代码,但我认为flag不需要是全局的,因为它仅用于您的checkPal()函数,因此您可以声明它只在那里初始化。