将上面代码中的序列全部换成链表写
时间: 2024-02-12 13:08:56 浏览: 22
下面是将上述代码中的序列改为链表的实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int val;
struct node* next;
} Node;
int cmp(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}
Node* createList(int n) {
Node* head = NULL;
Node* prev = NULL;
for(int i = 0; i < n; i++) {
Node* cur = (Node*)malloc(sizeof(Node));
scanf("%d", &(cur->val));
cur->next = NULL;
if(head == NULL) {
head = cur;
}
else {
prev->next = cur;
}
prev = cur;
}
return head;
}
void printList(Node* head) {
while(head != NULL) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
Node* mergeList(Node* a, Node* b) {
Node* head = NULL;
Node* cur = NULL;
while(a != NULL && b != NULL) {
Node* tmp = (Node*)malloc(sizeof(Node));
if(a->val <= b->val) {
tmp->val = a->val;
a = a->next;
}
else {
tmp->val = b->val;
b = b->next;
}
tmp->next = NULL;
if(head == NULL) {
head = cur = tmp;
}
else {
cur->next = tmp;
cur = cur->next;
}
}
if(a != NULL) {
if(head == NULL) {
head = a;
}
else {
cur->next = a;
}
}
else if(b != NULL) {
if(head == NULL) {
head = b;
}
else {
cur->next = b;
}
}
return head;
}
Node* findMid(Node* head) {
Node* slow = head;
Node* fast = head;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
int main() {
int n;
scanf("%d", &n);
Node* a = createList(n);
Node* b = createList(n);
Node* c = mergeList(a, b);
// 排序
int len = 2 * n;
int arr[len];
int i = 0;
while(c != NULL) {
arr[i] = c->val;
c = c->next;
i++;
}
qsort(arr, len, sizeof(int), cmp);
// 构造链表
Node* head = NULL;
for(int i = 0; i < len; i++) {
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->val = arr[i];
tmp->next = head;
head = tmp;
}
// 计算中位数
Node* mid = findMid(head);
if(len % 2 == 0) {
printf("%d\n", (mid->val + mid->next->val) / 2);
}
else {
printf("%d\n", mid->val);
}
return 0;
}
```
上述代码中,我们使用了链表来存储输入的序列。具体地,我们使用了链表的头插法来构造链表,使用了指针来遍历链表。在合并两个链表时,我们使用了归并排序的思想,将两个链表合并为一个有序链表。在计算中位数时,我们使用了快慢指针的方法来找到链表的中间节点。