Cách nối hai danh sách liên kết đôi trong C



Bài tập C: nối hai danh sách liên kết đôi

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 đôi và cách nối hai danh sách liên kết đôi 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 đôi trong C:

#include 
#include struct node {
   int data;
   struct node *prev;
   struct node *next;
};struct node *list = NULL;
struct node *list_last = NULL;struct node *even = NULL;
struct node *even_last = NULL;struct node *odd = NULL;
struct node *odd_last = NULL;struct node *current = 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));   link->data = data;
   link->prev = NULL;
   link->next = NULL;   // neu head la trong, tao list moi
   if(data%2 == 0) {
      if(even == NULL) {
         even = link;
         return;
      }else {
         current = even;         while(current->next != NULL)
            current = current->next;         // chen link vao phan cuoi cua list
         current->next = link; 
         even_last = link;
         link->prev = current;
      }
   }else {
      if(odd == NULL) {
         odd = link;
         return;
      }else {
         current = odd;         while(current->next!=NULL)
            current = current->next;         // chen link vao phan cuoi cua list
         current->next = link; 
         odd_last = link;
         link->prev = current;
      }
   }
}//hien thi list
void print_backward(struct node *head) {
   struct node *ptr = head;   printf("\n[last] <=>");
   //bat dau tu phan dau cua list
   while(ptr != NULL) {        
      printf(" %d <=>",ptr->data);
      ptr = ptr->prev;
   }   printf(" [head]\n");
}//hien thi list
void printList(struct node *head) {
   struct node *ptr = head;   printf("\n[head] <=>");
   //bat dau tu phan dau cua list
   while(ptr != NULL) {        
      printf(" %d <=>",ptr->data);
      ptr = ptr->next;
   }   printf(" [last]\n");
}void combine() {
   struct node *link;   list = even;
   link = list;
    
   while(link->next!= NULL) {
      link = link->next;
   }
        
   link->next = odd;
   odd->prev = link;
    
   // gan link_last toi last node cua list moi
    
   while(link->next!= NULL) {
      link = link->next;
   }
    
   list_last = link;  
}
int main() {
   int i;   for(i=1; i<=10; i++)
      insert(i);   printf("Danh sach chan: ");
   printList(even);   printf("Chieu dao nguoc Danh sach chan: ");
   print_backward(even_last);   printf("Danh sach le: ");
   printList(odd);   printf("Chieu dao nguoc Danh sach le: ");
   print_backward(odd_last);
   
   combine();
   
   printf("Danh sach sau khi noi: \n");
   printList(list);
   
   printf("Chieu dao nguoc Danh sach sau khi noi:\n");
   print_backward(list_last);
   
   return 0;
}

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

Cách nối hai danh sách liên kết đôi trong C
danh-sach-lien-ket-trong-c.jsp