Λίστα με πίνακα

Παράδειγμα Λίστας

Υλοποίηση με πίνακα

#include <stdio.h>
  
  /*
   * Ορίζω μέγιστο πλήθος για τη λίστα
  */
  #define MAX 5
  
  /*
   * Ορίζω έναν τύπο δεδομένων με όνομα Element
   * Το Element μπορεί να είναι ένα struct
  */ 
  typedef unsigned int Element;
  
  /*
   * Ορίζω ένα struct με όνομα List
  */
  typedef struct {
    int length;
    Element data[MAX];
  }List;
  
  /*
   * Συνάρτηση αρχικοποίησης, καλείται πρώτη πριν από όποια άλλη
   * Μπορεί να κληθεί επίσης για να μηδενίσει τη λίστα
  */ 
  void create(List *l) {
    l->length = 0;
  }
  
  /*
   * Ελέγχει αν η λίστα είναι άδεια, επιστρέφει 1 ή 0
  */
  int isEmpty(List l) {
    if(l.length == 0)
      return 1;
    else
      return 0;
  }
  
  /*
   * Ελέγχει αν η λίστα είναι γεμάτη, επιστρέφει 1 ή 0
  */ 
  int isFull(List l) {
    if(l.length == MAX)
      return 1;
    else
      return 0;
  }
  
  /*
   * Προσθέτει ένα στοιχείο στo τέλος της λίστας, επιστρέφει 1 ή 0
  */ 
  int addLast(List *l, Element e) {
    if(isFull(*l)) {
      return 0;
    } else {
      l->data[l->length] = e;
      l->length++;
      return 1;
    }
  }
  
  /*
   * Προσθέτει ένα στοιχείο στην αρχή της λίστας.
   * Πρέπει να γίνει μεταφορά (shift) των στοιχείων κατά μία θέση εμπρός
  */
  int addFirst(List *l, Element e) {
    if(isFull(*l)) {
      return 0;
    } else {
      int i;
      for(i = l->length; i>0; i--) {
        l->data[i] = l->data[i-1];
      }
      l->data[0] = e;
      l->length++;
      return 1;
    }
  }
  
  /*
   * Εισάγει ένα στοιχείο ανάμεσα στα άλλα στοιχεία της λίστας.
   * Πρέπει να γίνει μερική μεταφορά (shift) των στοιχείων κατά μία θέση εμπρός.
   * Η αρίθμηση της θέσης (position) αρχίζει από το 0. 
  */
  int insertElementAt(List *l, Element e, int position) {
    if(isFull(*l)) {
      return 0;
    } else if(position < 0 || position > l->length) {
      return 0;
    } else {
      int i;
      for(i = l->length; i>position; i--) {
        l->data[i] = l->data[i-1];
      }
      l->data[position] = e;
      l->length++;
      return 1;
    }
  }
  
  /*
   * Aφαιρεί το τελευταίο στοιχείο της λίστας
   * Και επιστρέφει τη διεύθυνση του στοιχείου, έτσι ο χρήστης μπορεί να δει ποιο ήταν
   * Αν είναι άδεια επιστρέφει NULL (η NULL μπορεί να χρησιμοποιηθεί με δείκτες)
  */
  Element *deleteLast(List *l) {
    Element *e;
    if(isEmpty(*l)) {
      return NULL;
    } else {
      l->length--;
      e = &(l->data[l->length]);
      return e;
    }
  }
  
  /*
   * Aφαιρεί το πρώτο στοιχείο της λίστας
   * Και επιστρέφει τη διεύθυνση του στοιχείου, έτσι ο χρήστης μπορεί να δει ποιο ήταν
   * Πρέπει να γίνει μετακίνηση (shift) προς τα πίσω
   * Αν είναι άδεια επιστρέφει NULL (η NULL μπορεί να χρησιμοποιηθεί με δείκτες)
  */
  Element *deleteFirst(List *l) {
    /* Αφήνεται ως άσκηση */
  }
  
  /*
   * Aφαιρεί κάποιο στοιχείο της λίστας από συγκεκριμένη θέση
   * Θα πρέπει να γίνει μερική μεταφορά (shift) των στοιχείων
   * Επιστρέφει επίσης τη διεύθυνση του διαγραμμένου στοιχείου 
  */
  Element *deleteElementAt(List *l, int position) {
    /* Αφήνεται ως άσκηση */
  }
  
  /*
   * Αναζητεί ένα στοχεί από τη λίστα.
   * Επιστρέφει 1 αν βρεθεί αλλιώς 0
   * Τα κριτήρια αναζήτησης εξαρτώνται από το είδος του στοιχείου (Element)
  */ 
  int searchElement(List l, Element e) {
    int i, yes = 0;
    for(i = 0; i < l.length; i++) {
      if(l.data[i] == e) {
        yes = 1;
        break;
      }
    }
    return yes;
  }
  
  /*
   * Εκτυπώνει τα στοιχεία της λίστας
  */
  void printList(List l) {
    int i;
    for(i = 0; i < l.length; i++) {
      printf("%d\t", (int)l.data[i]);
    }
    printf("\n\n");
  }
  
  int main() {
    
    List list;
    Element e;
    Element *p;
    int position;
    
    create(&list); //Πρέπει να κληθεί στην αρχή
    
    int i=1;
    do
    {
   puts("1. Empty List");
   puts("2. Check if Empty");
      puts("3. Check if Full");
   puts("4. Add Element at End");
      puts("5. Add Element at Start");
      puts("6. Insert Element at");
      puts("7. Delete Last Element");
      puts("8. Search Element");
   puts("9. Print List");
   puts("0. Exit\n");
   scanf("%d", &i);
      
      //system("clear"); /*  UNIX  */
      system("cls"); /*  DOS  */    
     
   switch(i)
   {
        case 1: /* sets list.length=0 */
     create(&list); 
     break;
        case 2: /* checks if empty */
     if(isEmpty(list)) 
            puts("the list is Empty\n"); 
          else 
            puts("the list is NOT Empty\n"); 
     break;	
        case 3: /* checks if full */
     if(isFull(list))
            puts("the list is Full\n"); 
          else
            puts("the list is NOT Full\n");
     break;
        case 4: /* adds a new node at the end of the list or first if it's empty */
     printf("give element to add: "); 
     scanf("%d", &e);	
          if(addLast(&list, e))
            puts("element added!\n");
          else
            puts("oops, the list is full\n");
     break;
        case 5:
     printf("give element to add: "); /* adds a new element at the start of the list or first if it's empty */
     scanf("%d", &e);
          if(addFirst(&list, e))
            puts("element added!\n");
          else
            puts("oops, the list is full\n");
     break;
        case 6:
     printf("give element to insert: "); /* adds a new element at the start of the list or first if it's empty */
     scanf("%d", &e);
          printf("give position to insert at: ");
          scanf("%d", &position);
          if(insertElementAt(&list, e, position))
            puts("element inserted!\n");
          else
            puts("oops, the list is full or position out of bounds\n");
     break;
        case 7: /* deletes last element from the list */
          p = deleteLast(&list);
     if(p == NULL) 
            puts("oops, the list is empty\n");
          else
            printf("element deleted: %d\n", (int)*p);
     break;	
        case 8:
     printf("give element to search for: ");
     scanf("%d", &e);			 
     if(searchElement(list, e))
            puts("element found!\n");
          else
            puts("oops, element NOT found\n");
     break;	
        case 9:
     printList(list); /* prints the list (all element values) */
     break;	
        case 0:
     i=0;
     break;	        
        default:
     break;			 			
   }
    }while(i!=0);
    
    getchar();
    return 0;
  }