Cách nối hai danh sách liên kết vòng trong C



Bài tập C: nối hai danh sách liên kết vòng

Bài tập C này giúp bạn làm quen dần với cách tạo danh sách liên kết vòng và cách nối hai danh sách liên kết vòng trong C. Để giải bài tập này, mình sử dụng cấu trúc struct trong C.

Chương trình C

Dưới đây là chương trình C để giải bài tập nối hai danh sách liên kết vòng trong C:

#include 
#include struct node {
   int data;
   struct node *next;
};struct node *even = NULL;
struct node *odd = NULL;
struct node *list = NULL;//tao danh sach lien ket
void insert(int data) {
   // cap phat bo nho cho node moi;
   struct node *link = (struct node*) malloc(sizeof(struct node));
   struct node *current;   link->data = data;
   link->next = NULL;   if(data%2 == 0) {
      if(even == NULL) {
         even = link;
         even->next = link;
         
         return;
      }else {
         current = even;
         while(current->next != even)
            current = current->next;         // chen link vao phan cuoi cua list
         current->next = link; 
         link->next = even;
      }
   }else {
      if(odd == NULL) {
         odd = link;
         odd->next = link;         return;
      }else {
         current = odd;
 
         while(current->next != odd) {
            current = current->next;
         }         // chen link vao phan cuoi cua list
         current->next = link; 
         link->next = odd;
         
      }
   }
}void display(struct node *head) {
   int temp;
   struct node *ptr = head;   if(head == NULL) {
      printf("Danh sach lien ket chua duoc khoi tao");
      return;
   }else if(head->next == head) {
      printf("%d", head->data);
      return;
   }   printf("[head] =>");
   
   while(ptr->next != head) {        
      printf(" %d =>",ptr->data);
      ptr = ptr->next;
   }   printf(" %d =>",ptr->data);
   printf(" [head]\n");
}void combine() {
   struct node *elink, *olink;   list = even;
   elink = list;
    
   while(elink->next!= even) {
      elink = elink->next;
   }
        
   elink->next = odd;
   olink = odd;
    
   while(olink->next!= odd) {
      olink = olink->next;
   }
   olink->next = even;
}int main() {
   int i;
    for(i=1; i<=10; i++)
      insert(i);   printf("Danh sach chan: ");
   display(even);   printf("Danh sach le: ");
   display(odd);   combine();
   
   printf("Danh sach sau khi noi:\n");
   display(list);  
   
   return 0;
}

Biên dịch chương trình C trên sẽ cho kết quả:

Nối hai danh sách liên kết vòng trong C
danh-sach-lien-ket-trong-c.jsp