11.20

7-2 双向循环链表应用
分数 20
作者 liudan
单位 石家庄铁道大学
已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,实现交换p所指向的结点和它的前缀结点的顺序。

输入格式:
第一行输入元素个数,第二行输入元素值,第三行输入要交换的元素值,第四行输出结果。

输出格式:
输出交换后的结果,中间不用空格分隔,若要交换的值:4,不在数组终,则输出“未找到4”

输入样例:
在这里给出一组输入。例如:

6
1 2 3 4 5 6
6
输出样例:
在这里给出相应的输出。例如:

123465

include <stdio.h>

include <stdlib.h>

typedef struct Node {
int data;
struct Node *prior;
struct Node *next;
} Node, *LinkList;
LinkList createList(int n, int *arr) {
if (n <= 0) return NULL;
LinkList head = (LinkList)malloc(sizeof(Node));
if (!head) exit(1);
head->data = arr[0];
LinkList p = head;
for (int i = 1; i < n; i++) {
LinkList newNode = (LinkList)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->prior = p;
p->next = newNode;
p = newNode;
}
p->next = head;
head->prior = p;
return head;
}
LinkList findNode(LinkList head, int x) {
if (!head) return NULL;
LinkList p = head;
do {
if (p->data == x) return p;
p = p->next;
} while (p != head);
return NULL;
}
void swapWithPrior(LinkList head, LinkList p) {
if (!head || !p || p == head->prior) return;
LinkList q = p->prior;
LinkList q_prior = q->prior;
LinkList p_next = p->next;
q_prior->next = p;
p->prior = q_prior;
p->next = q;
q->prior = p;
q->next = p_next;
p_next->prior = q;
if (q == head) {
head = p;
}
}
void printList(LinkList head) {
if (!head) return;
LinkList p = head;
do {
printf("%d", p->data);
p = p->next;
} while (p != head);
printf("\n");
}
void freeList(LinkList head) {
if (!head) return;
LinkList p = head, q;
do {
q = p->next;
free(p);
p = q;
} while (p != head);
}

int main() {
int n, target;
scanf("%d", &n);
int *arr = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
scanf("%d", &target);
LinkList head = createList(n, arr);
LinkList p = findNode(head, target);
if (!p) {
printf("未找到%d\n", target);
} else {
swapWithPrior(head, p);
printList(head);
}
free(arr);
freeList(head);
return 0;
}

posted @ 2025-11-23 12:49  muyuxiaxing  阅读(2)  评论(0)    收藏  举报