11.3.3. Inserarea unui nod intr-o lista circulara simplu inlantuita (LCSI)

2020/03/05 in Programare in C

Consideram doua operatii de inserare a unui nod intr-o LCSI:

Se pot defini si alte functii, similare cu cele prezentate in continuare.

11.3.3.1. Inserarea unui nod inaintea unuia precizat printr-o cheie numerica de tip int

Nodurile listei au tipul TNOD indicat in paragraful 11.3.2.

TNOD *cinici(int c) {
/* - inserarea unui nod inaintea unuia precizat printr-o cheie numerica de tip int;
   - returneaza pointerul spre nodul inserat, sau 0 daca inserarea nu are loc. */
   
   extern TNOD *ptrnod;
   TNOD *p, *q, *q1;
   int n;

   if (ptrnod == 0)
   return 0; /* lista vida */

   q = ptrnod;
   do {
      q1 = q;
      q = q -> urm;
      if (q -> cheie == c)
         break; /* s-a gasit nodul inaintea caruia se va face inserarea */
   } while (q != ptrnod);
   
   if (q -> cheie != c) {
      printf("nu exista un nod de cheie = %d\n", c);
      return 0; /* nu s-a facut nicio inserare */
   }
   
/* rezerva zona pentru nod si incarca datele in nodul respectiv */
   n = sizeof(TNOD);
   if (((p = (TNOD *)malloc(n)) != 0) && (incnod(p) == 1)) {
      q1 -> urm = p;
      p -> urm = q;
      return p;
   }
   
   if (p == 0) {
      printf("memorie insuficienta\n");
      exit(1);
   }
   elibnod(p);
   return 0;
}

11.3.3.2. Inserarea unui nod dupa un nod precizat printr-o cheie numerica de tip int

Tipul TNOD se defineste ca in paragraful 11.3.2.

TNOD *cindci(int c) {
/* - inserarea unui nod dupa un nod precizat printr-o cheie numerica de tip int; */
   
   extern TNOD *ptrnod;
   TNOD *p, *q;
   int n;

   if (ptrnod == 0)
   return 0; /* lista vida */

   q = ptrnod;
   do {
      if (q -> cheie == c)
         break;
      q = q -> urm;
   } while (q != ptrnod);
   
   if (q -> cheie != c) {
      printf("nu exista un nod de cheie = %d\n", c);
      return 0; /* nu s-a facut nicio inserare */
   }
   
/* se face inserarea dupa nodul spre care pointeaza q */
   n = sizeof(TNOD);
   if (((p = (TNOD *)malloc(n)) != 0) && (incnod(p) == 1)) {
      p -> urm = q -> urm;
      q -> urm = p;
      return p;
   }
   
   if (p == 0) {
      printf("memorie insuficienta\n");
      exit(1);
   }
   elibnod(p);
   return 0;
}

11.3.4. Stergerea unui nod LCSI