1votos

Listas palíndromas en C

por josejuan hace 6 años

Listas genéricas doblemente enlazadas.

Comprobar si una lista es palíndroma

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h> 
#include <malloc.h> 
 
typedef 
struct _DoubleLinkedList { 
  struct _DoubleLinkedList *next; 
  struct _DoubleLinkedList *prev; 
  void *object; 
} DoubleLinkedList; 
 
typedef 
struct _DoubleLinkedListHeader { 
  DoubleLinkedList *first; 
  DoubleLinkedList *last; 
} DoubleLinkedListHeader; 
 
void DLL_insert(DoubleLinkedListHeader *list, void *object) { 
  DoubleLinkedList *tail = list->first; 
  list->first = (DoubleLinkedList *) malloc(sizeof(DoubleLinkedList)); 
  list->first->next = tail; 
  list->first->object = object; 
  list->first->prev = NULL; 
  if(tail) tail->prev = list->first; 
  else     list->last = list->first; 
 
int DLL_isPalindrome(DoubleLinkedListHeader list, int (*areEquals)(void *, void *)) { 
  if(!list.first) return 1; 
  DoubleLinkedList *left = list.first; 
  DoubleLinkedList *right = list.last; 
  while(left != right) { 
    if(!areEquals(left->object, right->object)) return 0; 
    if(left->next == right) return 1; 
    left = left->next; 
    right = right->prev; 
  return 1; 
 
// test 
void DoubleListPalindromeTest(char *test) { 
  int cmpChar(void *a, void *b) {return *(char *)a == *(char *)b;} 
  DoubleLinkedListHeader list; 
  list.first = list.last = NULL; 
  char *i = test; 
  while(*i) DLL_insert(&list, i++); 
  printf("La cadena '%s' %s es palíndroma.\n", test, DLL_isPalindrome(list, cmpChar) ? "si" : "no"); 
  // DSL_drop(&list); 
 
int main(int argc, char **argv) { 
   
  DoubleListPalindromeTest("abcba"); 
  DoubleListPalindromeTest("abccba"); 
  DoubleListPalindromeTest("abccbaa"); 
  DoubleListPalindromeTest("abccb2a"); 
   
  return 0; 
1 comentario
0votos

Escrito por Raul GM hace 6 años

Ya te tengo puesto como el profe. Así hago memoriam de las listas doblemente enlazadas... Grr ganas de matar augmentando.

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.