梧州网站优化,微博推广的好处,网站导航栏固定,哪些平台可以建立网站吗在C语言中#xff0c;实现一个循环双链表需要定义一个节点结构体#xff0c;这个结构体包含三个字段#xff1a;数据字段#xff0c;指向前一个节点的指针#xff0c;以及指向下一个节点的指针。定义节点结构体#xff1a;
1)定义节点结构体#xff1a;
typedef struc…
在C语言中实现一个循环双链表需要定义一个节点结构体这个结构体包含三个字段数据字段指向前一个节点的指针以及指向下一个节点的指针。定义节点结构体
1)定义节点结构体
typedef struct Node { int data; struct Node* prev; struct Node* next;
} Node;
2)创建节点创建一个新节点并初始化它的数据和指针。
Node* createNode(int data) { Node* newNode (Node*)malloc(sizeof(Node)); if (!newNode) { printf(Memory error\n); return NULL; } newNode-data data; newNode-next NULL; newNode-prev NULL; return newNode;
}
3)插入节点在链表的末尾添加一个新节点。需要考虑的是如何更新新节点和前一个节点的指针。
void insertNode(Node** head, int data) { Node* newNode createNode(data); if (*head NULL) { // 如果链表为空新节点就是头节点 *head newNode; newNode-next newNode; newNode-prev newNode; } else { // 否则将新节点添加到链表的末尾 Node* curr *head; while (curr-next ! *head) { // 找到链表的末尾 curr curr-next; } curr-next newNode; // 更新末尾节点的next指针 newNode-prev curr; // 更新新节点的prev指针 newNode-next *head; // 新节点的next指针指向头节点 (*head)-prev newNode; // 更新头节点的prev指针指向新节点 }
} 4)删除节点删除一个指定的节点。需要考虑的是如何更新被删除节点的前后节点的指针以及如何处理被删除节点是头节点的情况。
void deleteNode(Node** head, int data) { Node* curr *head; if (*head NULL) { // 如果链表为空直接返回 return; } if (curr-data data) { // 如果头节点就是要删除的节点 Node* temp *head; *head (*head)-next; // 将头节点的next指针作为新的头节点 (*head)-prev *head; // 新的头节点的prev指针指向自己 free(temp); // 释放旧的头节点内存空间 return; } while (curr-data ! data) { // 找到要删除的节点 curr curr-next; if (curr *head) { // 如果链表中没有找到要删除的节点直接返回 return; } } Node* temp curr; // 保存要删除的节点的指针 curr curr-next; // 将要删除节点的next指针作为当前节点 curr-prev temp-prev; // 更新当前节点的prev指针指向要删除节点的prev指针所指向的节点 temp-prev-next curr; // 更新要删除节点的prev指针所指向的节点的next指针指向当前节点 free(temp); // 释放要删除的节点的内存空间
} 5)打印链表遍历链表并打印每个节点的数据。
void printList(Node* head) { if (head NULL) { // 如果链表为空直接返回 printf(List is empty.\n); return; } Node* curr head; // 从头节点开始遍历链表 do { // 使用do-while循环保证至少打印一次头节点的数据值即使链表只有一个节点。注意使用前置运算符。 printf(%d , curr-data); // 打印当前节点的数据值注意没有换行。使用后置运算符。 } while ((curr curr-next) ! head); // 移动到下一个节点如果当前节点是头节点结束循环。注意使用前置运算符。 printf(\n); // 在打印完最后一个数据值后换行。