鱼生富贵 2022-03-20 22:06 采纳率: 97.4%
浏览 53
已结题

返回一个布尔值判断是否为回文序列

不知道哪里不对,输入“1 2 2 1”输出却是“false”,而且检查了,逆置函数没错误的


#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<stdbool.h>
#define LEN sizeof(struct LinkList)
struct LinkList
{
    int num;
    struct LinkList* next;
};
int main()
{
    bool IfPalind(struct LinkList* A);
    void Creat(struct LinkList* L);
    struct LinkList* L, * check;
    L = (struct LinkList*)malloc(LEN); L->next = NULL;
    Creat(L);
    if (IfPalind(L))
        printf("true\n");
    else
        printf("false\n");
    check = L->next;
    while (check)
    {
        printf("%d", check->num);
        check = check->next;
    }
    return 0;
}
void Creat(struct LinkList *L)
{
    char c='\0'; int x;
    struct LinkList* p, * rear;
    rear = L;
    while (c != '\n')
    {
        scanf_s("%d", &x);
        c = getchar();
        p = (struct LinkList*)malloc(LEN);
        p->num = x;
        p->next = NULL;
        rear->next = p;
        rear = p;
    }
    rear->next = NULL;
}
bool IfPalind(struct LinkList* A)
{
    struct LinkList* mid, * fast, * p, * q, * head_new, * cur;
    mid = fast = A->next;
    while (fast&&fast->next != NULL&&fast->next->next!=NULL)
    {
        mid = mid->next;
        fast = fast->next->next;
    }
    head_new = mid; p = mid->next; q = p->next; head_new->next = NULL;
    while (q)
    { 
        p->next = head_new->next;
        head_new->next = p;
        p = q;
        q = q->next;
    }
    p->next = head_new->next;
    head_new->next = p;
    cur = A; mid = mid->next;
    for(;mid;)
    {
        if (cur->num == mid->num)
        {
            cur = cur->next;
            mid = mid->next;
        }
        else
            break;
    }
    if (mid)
        return false;
    else
        return true;
}
  • 写回答

1条回答 默认 最新

  • 魔法自动机 2022-03-21 13:00
    关注

    我对IfPalind函数进行了修改,你可以对照一下。

    bool IfPalind(struct LinkList* A)
    {
        struct LinkList* mid, *fast, *p, *q, *head_new, *cur;
        mid = fast = A->next;
        while (fast&&fast->next != NULL && fast->next->next != NULL)
        {
            mid = mid->next;
            fast = fast->next->next;
        }
    
        //这里开始和你写的不一样
        //以head_new头结点对mid后面子串进行原地逆置
        head_new = (struct LinkList*)malloc(LEN);
        head_new->next = NULL;
        p = mid->next;
        while (p)
        {
            q = p->next;
            p->next = head_new->next;
            head_new->next = p;
            p = q;
        }
        //判断head_new后半段逆置部分和A前半段部分是否相同
        p = A->next; q = head_new->next;
        while (p&&q) {
            if (p->num != q->num) {
                return false;
            }
            p = p->next;
            q = q->next;
        }
        return true;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月30日
  • 已采纳回答 3月22日
  • 创建了问题 3月20日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改