Advertisement
Guest User

Untitled

a guest
Apr 19th, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define new(type, size) (type*)malloc(sizeof(type)*(size))
  5.  
  6. typedef struct List {
  7.   int car;           //  Data
  8.   struct List* cdr;  //  Tail
  9. } List;
  10.  
  11. List* newList(int Data) {
  12.   List* Head = new(List, 1);
  13.   Head->car = Data;
  14.   Head->cdr = NULL;
  15.   return Head;
  16. }
  17.  
  18. void destroy(List* Head) {
  19. // This function has risk that this can make dangling pointer.
  20.   List* cdr = Head->cdr;
  21.   while(cdr) {
  22.     free(Head);
  23.     Head = cdr;
  24.     cdr = cdr->cdr;
  25.   }
  26. }
  27.  
  28. void printList(List* Head) {
  29.   List* tmp = Head;
  30.   printf("[");
  31.   while(tmp) {
  32.     printf("%d, ", tmp->car);
  33.     tmp = tmp->cdr;
  34.   }
  35.   printf("\b]\n");
  36. }
  37.  
  38. void append(List* Head, int Data) {
  39.   List* tmp = Head;
  40.   while(tmp->cdr) {
  41.     tmp = tmp->cdr;
  42.   }
  43.   tmp->cdr = new(List, 1);
  44.   tmp = tmp->cdr;
  45.   tmp->car = Data;
  46.   tmp->cdr = NULL;
  47. }
  48.  
  49. //nth node of list
  50. List* nth_cdr(List* Head, int idx) {
  51.   int i;
  52.   List* tmp = Head;
  53.   for (i = 0; i < idx; i++) {
  54.     if (!tmp->cdr) return tmp;
  55.     tmp = tmp->cdr;
  56.   }
  57.   return tmp;
  58. }
  59.  
  60. // loop checking function
  61. int loop_existence(List* Head) {
  62.   List* tmp = Head;
  63.   int count=0;
  64.   while(tmp) {
  65.     List* tmp2 = Head;
  66.     int count2 = 0;
  67.     while(tmp!=tmp2) {
  68.       tmp2=tmp2->cdr;
  69.       count2++;
  70.     }
  71.     if (count!=count2) return 1;
  72.     tmp=tmp->cdr;
  73.     count++;
  74.   }
  75.   return 0;
  76. }
  77.  
  78. int main(void) {
  79.   List* listA = newList(0);
  80.   int i;
  81.   for (int i = 1; i <= 10; i++) {
  82.     listA = cons(i, listA);
  83.   }
  84.   printf("FirstCase: loop? %c\n", loop_existence(listA)?'T':'F'); // should be F
  85.   List* lastIdx = nth_cdr(listA, 10);
  86.   // Check for Safety
  87.   if (!lastIdx) {
  88.     printf("Something is going wrong...");
  89.     destroy(listA);
  90.     return 0;
  91.   }
  92.   lastIdx->cdr = nth_cdr(listA, 2); // loop last index -> second index
  93.   printf("SecondCase: loop? %c\n", loop_existence(listA)?'T':'F'); // should be T
  94.   lastIdx->cdr = NULL;
  95.   destroy(listA);
  96.   return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement