12.24

继续完成数据结构实验
// 定义双向循环链表节点结构
typedef struct Node {
int data;
struct Node *prior;
struct Node *next;
} Node;

// 创建双向循环链表
Node* createList(int n, int arr[]) {
if (n == 0) return NULL;
Node head = (Node)malloc(sizeof(Node));
head->data = arr[0];
Node *pre = head;
// 构建链表主体
for (int i = 1; i < n; i++) {
Node newNode = (Node)malloc(sizeof(Node));
newNode->data = arr[i];
pre->next = newNode;
newNode->prior = pre;
pre = newNode;
}
// 构建循环:尾节点next指向头,头节点prior指向尾
pre->next = head;
head->prior = pre;
return head;
}

// 查找值为key的节点
Node* findNode(Node *head, int key) {
if (head == NULL) return NULL;
Node *p = head;
do {
if (p->data == key) {
return p;
}
p = p->next;
} while (p != head); // 循环链表,遍历到回到头节点结束
return NULL;
}

// 交换p节点与其前缀节点
void swapWithPre(Node *p) {
if (p == NULL || p->prior == p) { // 空节点或仅有一个节点,无需交换
return;
}
Node *pre = p->prior; // p的前缀节点
Node *prePre = pre->prior; // pre的前缀节点
Node *pNext = p->next; // p的后继节点

// 1. 处理prePre与p的连接
prePre->next = p;
p->prior = prePre;

// 2. 处理p与pre的连接
p->next = pre;
pre->prior = p;

// 3. 处理pre与pNext的连接
pre->next = pNext;
pNext->prior = pre;

}

// 遍历输出双向循环链表(从头节点开始)
void printList(Node *head) {
if (head == NULL) return;
Node *p = head;
do {
printf("%d", p->data);
p = p->next;
} while (p != head);
printf("\n");
}

// 释放链表内存(可选,避免内存泄漏)
void freeList(Node *head) {
if (head == NULL) return;
Node *p = head->next;
Node *temp;
while (p != head) {
temp = p;
p = p->next;
free(temp);
}
free(head);
}

int main() {
int n, key;
// 1. 输入元素个数
scanf("%d", &n);
int arr[n];
// 2. 输入元素值
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 3. 输入要交换的元素值
scanf("%d", &key);

// 4. 创建双向循环链表
Node *head = createList(n, arr);
if (head == NULL) {
    printf("未找到%d\n", key);
    return 0;
}

// 5. 查找目标节点
Node *p = findNode(head, key);
if (p == NULL) {
    printf("未找到%d\n", key);
    freeList(head);
    return 0;
}

// 6. 交换p与其前缀节点
swapWithPre(p);

// 7. 输出交换后的链表(注意:交换后头节点可能变化,需重新定位头节点)
// 重新找头节点(原头节点是arr[0],需确认其位置)
Node *newHead = findNode(p, arr[0]);
printList(newHead);

// 8. 释放内存
freeList(newHead);
return 0;

}

posted @ 2025-12-24 23:18  山蚯  阅读(4)  评论(0)    收藏  举报