非常抱歉给您带来的困惑,刚才回答中的代码确实与您提供的源代码不一致。以下是经过修改后与您提供的源代码相匹配的解决方案:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 双向循环链表
typedef int data_t; // 数据类型
typedef struct list {
data_t data; // 数据域
struct list* prev; // 指针域上一个
struct list* next; // 指针域下一个
} SQlist, * SQlink;
// 创建头节点
SQlink Create_Head_Node(data_t value) {
SQlink head = (SQlink)malloc(sizeof(SQlist));
if (!head) return NULL;
memset(head, 0, sizeof(SQlist));
head->data = value;
head->next = head;
head->prev = head;
return head;
}
// 头插添加节点
int Add_Head_Node(SQlink head, data_t value) {
if (head == NULL) return -1;
SQlink add_node = Create_Head_Node(value);
if (add_node == NULL) return -1;
add_node->next = head->next;
add_node->prev = head;
head->next = add_node;
add_node->next->prev = add_node;
return 0;
}
// 尾插添加节点
int Add_Tail_Node(SQlink head, data_t value) {
if (head == NULL) return -1;
SQlink end_node = head;
while (end_node->next != head) {
end_node = end_node->next;
}
SQlink add_node = Create_Head_Node(value);
if (add_node == NULL) return -1;
add_node->next = head;
add_node->prev = end_node;
end_node->next = add_node;
head->prev = add_node;
return 0;
}
// 显示链表
int Printf_List(SQlink head) {
if (head == NULL) return -1;
SQlink temp_node = head->next;
while (temp_node != head) {
printf("%2d ", temp_node->data);
temp_node = temp_node->next;
}
puts(" ");
return 0;
}
// 指定查找
SQlink Find_List_Data(SQlink head, data_t value) {
if (head == NULL) return NULL;
SQlink find_node = head->next;
while (find_node != head) {
if (find_node->data == value) {
return find_node;
}
find_node = find_node->next;
}
return NULL;
}
// 指定插入
int Anywhere_Insert_Node(SQlink head, int pos, int value) {
if (head == NULL) return -1;
SQlink temp_node = head;
while (temp_node->next != head) {
if (temp_node->data == pos) break;
temp_node = temp_node->next;
}
if (temp_node->next == head && temp_node->data != pos) return -1;
SQlink new_node = Create_Head_Node(value);
if (new_node == NULL) return -1;
new_node->next = temp_node->next;
temp_node->next->prev = new_node;
temp_node->next = new_node;
new_node->prev = temp_node;
return 0;
}
// 指定删除
int Anywhere_Delete_Node(SQlink head, int value) {
if (head == NULL || head->next == NULL) return -1;
SQlink delete_node = Find_List_Data(head, value);
if (delete_node == NULL) return -1;
delete_node->prev->next = delete_node->next;
delete_node->next->prev = delete_node->prev;
free(delete_node); // 释放删除节点的内存空间
return 0;
}
// 摧毁链表
int Free_List(SQlink head) {
if (head == NULL) return -1;
SQlink temp_node = head->next;
while (temp_node != head) {
SQlink free_node = temp_node;
temp_node = temp_node->next;
free(free_node);
}
free(head);
return 0;
}
// 获取链表长度
int Get_List_Length(SQlink head) {
if (head == NULL) return -1;
int length = 0;
SQlink temp = head->next;
while (temp != head) {
temp = temp->next;
length++;
}
return length;
}
// 主函数
int main(void) {
SQlink head = Create_Head_Node(0);
if (head == NULL) return -1;
// 头插数据
Add_Head_Node(head, 11);
Add_Head_Node(head, 12);
Add_Head_Node(head, 13);
Add_Head_Node(head, 14);
Add_Head_Node(head, 15);
Add_Head_Node(head, 16);
// 尾插数据
Add_Tail_Node(head, 6);
Add_Tail_Node(head, 7);
Add_Tail_Node(head, 8);
Add_Tail_Node(head, 9);
Add_Tail_Node(head, 1);
Add_Tail_Node(head, 2);
Add_Tail_Node(head, 3);
Add_Tail_Node(head, 4);
Printf_List(head);
// 指定插入数据
Anywhere_Insert_Node(head, 1, 6);
Printf_List(head);
// 指定删除数据
Anywhere_Delete_Node(head, 2);
Printf_List(head);
// 获取链表长度
int length = Get_List_Length(head);
printf("链表数据长度为 %d\n", length);
// 释放链表
Free_List(head);
return 0;
}
这段代码实现了创建双向循环链表、头插和尾插添加节点、指定查找、指定插入、指定删除、显示链表、获取链表长度等功能。希望对您有所帮助!如果还有其他问题,请随时提问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |