#include <stdio.h>

#include <stdlib.h>

#include <stdbool.h>


// 定义结构体表示进程和资源

typedef struct Node {

   int id; // 进程或资源的唯一标识符

   int resource_id; // 相关联的资源标识符

   struct Node* next; // 指向下一个节点的指针

} Node;


// 定义链表结构体

typedef struct List {

   Node* head; // 链表头指针

   Node* tail; // 链表尾指针

} List;


// 初始化链表

void init_list(List* l) {

   l->head = NULL;

   l->tail = NULL;

}


// 在链表中添加节点

void add_node(List* l, int id, int resource_id) {

   Node* node = (Node*)malloc(sizeof(Node));

   node->id = id;

   node->resource_id = resource_id;

   node->next = NULL;

   if (l->head == NULL) {

       l->head = node;

       l->tail = node;

   } else {

       l->tail->next = node;

       l->tail = node;

   }

}


// 从链表中删除节点

void remove_node(List* l, int id) {

   Node* curr = l->head;

   Node* prev = NULL;

   while (curr != NULL && curr->id != id) {

       prev = curr;

       curr = curr->next;

   }

   if (curr == NULL) return; // 未找到对应节点

   if (prev == NULL) { // 如果要删除的是头结点,则更新头指针和尾指针

       l->head = curr->next;

       if (l->tail == curr) l->tail = NULL;

   } else { // 如果要删除的是中间或尾结点,则更新前一个节点的next指针即可

       prev->next = curr->next;

       if (l->tail == curr) l->tail = prev;

   }

   free(curr); // 释放内存空间

}


// 检查是否存在环并检测死锁的算法伪代码(此处略去详细实现)

bool check_deadlock(List* list1, List* list2) {

   // TODO: 在此处实现环检测算法,判断两个链表之间是否存在环,从而检测死锁情况。

   return false; // 默认返回false,表示没有检测到死锁。需要根据具体算法进行修改。

}

``