如何解决检查并返回1或0,如果链接列表是回文?
我想用C语言编写一个函数,以检查单链表是否是回文。
我按以下顺序分离了代码: 这是 lists.h 文件:
#include <stdio.h>
#include <stdlib.h>
#include "lists.h"
/**
* main - check the code for Holberton School students.
*
* Return: Always 0.
*/
int main(void)
{
listint_t *head;
head = NULL;
add_nodeint_end(&head,1);
add_nodeint_end(&head,17);
add_nodeint_end(&head,972);
add_nodeint_end(&head,50);
add_nodeint_end(&head,97);
add_nodeint_end(&head,98);
add_nodeint_end(&head,1);
print_listint(head);
if (is_palindrome(&head) == 1)
printf("Linked list is a palindrome\n");
else
printf("Linked list is not a palindrome\n");
free_listint(head);
return (0);
}
0-main.c 文件:
#include <stdio.h>
#include <stdlib.h>
#include "lists.h"
/**
* print_listint - prints all elements of a listint_t list
* @h: pointer to head of list
* Return: number of nodes
*/
size_t print_listint(const listint_t *h)
{
const listint_t *current;
unsigned int n; /* number of nodes */
current = h;
n = 0;
while (current != NULL)
{
printf("%i\n",current->n);
current = current->next;
n++;
}
return (n);
}
/**
* add_nodeint_end - adds a new node at the end of a listint_t list
* @head: pointer to pointer of first node of listint_t list
* @n: integer to be included in new node
* Return: address of the new element or NULL if it fails
*/
listint_t *add_nodeint_end(listint_t **head,const int n)
{
listint_t *new;
listint_t *current;
current = *head;
new = malloc(sizeof(listint_t));
if (new == NULL)
return (NULL);
new->n = n;
new->next = NULL;
if (*head == NULL)
*head = new;
else
{
while (current->next != NULL)
current = current->next;
current->next = new;
}
return (new);
}
/**
* free_listint - frees a listint_t list
* @head: pointer to list to be freed
* Return: void
*/
void free_listint(listint_t *head)
{
listint_t *current;
while (head != NULL)
{
current = head;
head = head->next;
free(current);
}
}
linked_lists.c 文件:
#include <stdio.h>
#include <stdlib.h>
#include "lists.h"
/**
* is_palindrome - check the code for Holberton School students.
* @head: the head of the linked list
* Return: Always 0.
*/
int is_palindrome(listint_t **head)
{
if (head == NULL) {
return (1);
}
listint_t *mainnode;
listint_t *reversedlist;
mainnode = *head;
reversedlist = *head;
reversedlist = reverse(reversedlist);
while (reversedlist != NULL)
{
if (mainnode->n != reversedlist->n)
{
return (0);
}
reversedlist = reversedlist->next;
mainnode = mainnode->next;
}
return (1);
}
/**
* reverse - check the code for Holberton School students.
* @head: the head of the linked list
* Return: Always 0.
*/
listint_t *reverse(listint_t *head)
{
listint_t *prev = NULL;
listint_t *current = head;
listint_t *next = NULL;
while (current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
return (prev);
}
0-is_palindrome.c 文件(有问题的文件):
gcc -Wall -Werror -Wextra -pedantic 0-main.c linked_lists.c 0-is_palindrome.c -o palindrome
编译命令:
Start REPL
我遇到了分段错误,在我对其进行调整以开始出现分段错误之前,即使链表不是回文,它也总是返回1。 我只想修改 0-is_palindrome.c 文件,另一个文件应保持不变,我的想法是该列表被反转并与原始列表进行比较,然后返回1或0,并且随着您可以在代码中看到,当反向列表的值与原始列表的值不同时,它会中断。 我该怎么做才能解决此问题?
解决方法
您的实现无效,因为reverse
不会构造新列表,而是修改参数列表。
此外,is_palindrome
没有理由修改列表或其初始节点,因此原型应为:
int is_palindrome(const listint_t *head);
对于蛮力方法,您可以计算列表的长度,并在i
的循环中比较偏移量length - i - 1
和i < length / 2
处的元素。如果所有比较都成功,则该列表为回文,您可以在一个比较失败后立即返回0
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。