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;
}

浙公网安备 33010602011771号