#include <stdio.h>
#include <stdlib.h>
typedef struct student {
int num; // 学号
int score; // 成绩
struct student* next;
} Student;
// 创建新结点
Student* createNode(int num, int score) {
Student* node = (Student*)malloc(sizeof(Student));
node->num = num;
node->score = score;
node->next = NULL;
return node;
}
// 合并并按学号升序排序两个链表
Student* mergeLinkedList( Student* a, Student* b ) {
Student *p = a, *q = b, *prev = NULL, *head = NULL;
while( p != NULL && q != NULL ) {
if( p->num <= q->num ) {
if( prev == NULL ) head = p;
else prev->next = p;
prev = p;
p = p->next;
}
else {
if( prev == NULL ) head = q;
else prev->next = q;
prev = q;
q = q->next;
}
}
if( p == NULL ) prev->next = q;
else prev->next = p;
return head;
}
// 输出链表中的所有结点
void printLinkedList(Student* L) {
printf("num\t score\n");
while (L != NULL) {
printf("%d\t %d\n", L->num, L->score);
L = L->next;
}
}
int main() {
Student *headA = NULL, *headB = NULL, *headC = NULL; // 三个单向链表
// 分别读入两个链表 a 和 b
int n, i, x, y;
printf("Input the number of students in list a: ");
scanf("%d", &n);
for (i = 0; i < n; ++i) {
printf("Input the num and score of the %dth student: ", i + 1);
scanf("%d%d", &x, &y);
Student* node = createNode(x, y);
node->next = headA;
headA = node;
}
printf("Input the number of students in list b: ");
scanf("%d", &n);
for (i = 0; i < n; ++i) {
printf("Input the num and score of the %dth student: ", i + 1);
scanf("%d%d", &x, &y);
Student* node = createNode(x, y);
node->next = headB;
headB = node;
}
// 将两个链表合并
headC = mergeLinkedList(headA, headB);
// 输出新链表
printf("The merged list:\n");
printLinkedList(headC);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct student {
int num; // 学号
int score; // 成绩
struct student* next;
} Student;
typedef struct {
Student* head;
} LinkedList;
// 初始化单向链表
void initLinkedList(LinkedList* L) {
L->head = NULL;
}
// 创建新结点
Student* createNode(int num, int score) {
Student* node = (Student*)malloc(sizeof(Student));
node->num = num;
node->score = score;
node->next = NULL;
return node;
}
// 按学号升序插入结点
void insertNode(LinkedList* L, Student* node) {
if (L->head == NULL || node->num < L->head->num) {
node->next = L->head;
L->head = node;
} else {
Student* p = L->head;
while (p->next != NULL && p->next->num <= node->num) {
p = p->next;
}
node->next = p->next;
p->next = node;
}
}
// 输出链表中的所有结点
void printLinkedList(LinkedList* L) {
Student* p = L->head;
printf("num\t score\n");
while (p != NULL) {
printf("%d\t %d\n", p->num, p->score);
p = p->next;
}
}
int main() {
LinkedList a, b, c; // 三个单向链表
initLinkedList(&a);
initLinkedList(&b);
initLinkedList(&c);
// 分别读入两个链表 a 和 b
int n, i, x, y;
printf("Input the number of students in list a: ");
scanf("%d", &n);
for (i = 0; i < n; ++i) {
printf("Input the num and score of the %dth student: ", i + 1);
scanf("%d%d", &x, &y);
Student* node = createNode(x, y);
insertNode(&a, node);
}
printf("Input the number of students in list b: ");
scanf("%d", &n);
for (i = 0; i < n; ++i) {
printf("Input the num and score of the %dth student: ", i + 1);
scanf("%d%d", &x, &y);
Student* node = createNode(x, y);
insertNode(&b, node);
}
// 将两个链表合并
Student *pa = a.head, *pb = b.head;
while (pa != NULL && pb != NULL) {
if (pa->num <= pb->num) {
Student* node = createNode(pa->num, pa->score);
insertNode(&c, node);
pa = pa->next;
} else {
Student* node = createNode(pb->num, pb->score);
insertNode(&c, node);
pb = pb->next;
}
}
while (pa != NULL) {
Student* node = createNode(pa->num, pa->score);
insertNode(&c, node);
pa = pa->next;
}
while (pb != NULL) {
Student* node = createNode(pb->num, pb->score);
insertNode(&c, node);
pb = pb->next;
}
// 输出新链表
printf("The merged list:\n");
printLinkedList(&c);
return 0;
}
这个使用了结构体,时间会超限
#include <stdio.h>
typedef struct {
int num; // 学号
int score; // 成绩
} Student;
// 归并排序算法
void mergeSort(Student* a, int lo, int hi) {
if (lo >= hi) return;
int mid = (lo + hi) / 2;
mergeSort(a, lo, mid);
mergeSort(a, mid + 1, hi);
int i = lo, j = mid + 1, k = 0;
Student temp[hi - lo + 1];
while (i <= mid && j <= hi) {
if (a[i].num <= a[j].num) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= hi) {
temp[k++] = a[j++];
}
for (i = 0; i < k; ++i) {
a[lo + i] = temp[i];
}
}
int main() {
int n, m, i, j, k;
Student a[100], b[100], c[200];
// 分别读入两个数组 a 和 b
printf("Input the number of students in list a: ");
scanf("%d", &n);
for (i = 0; i < n; ++i) {
printf("Input the num and score of the %dth student: ", i + 1);
scanf("%d%d", &a[i].num, &a[i].score);
}
printf("Input the number of students in list b: ");
scanf("%d", &m);
for (i = 0; i < m; ++i) {
printf("Input the num and score of the %dth student: ", i + 1);
scanf("%d%d", &b[i].num, &b[i].score);
}
// 按照学号升序合并数组 a 和 b 到 c 中
i = j = k = 0;
while (i < n && j < m) {
if (a[i].num <= b[j].num) {
c[k++] = a[i++];
} else {
c[k++] = b[j++];
}
}
while (i < n) {
c[k++] = a[i++];
}
while (j < m) {
c[k++] = b[j++];
}
// 对新数组 c 按照学号升序排序
mergeSort(c, 0, k - 1);
// 输出新数组
printf("The merged and sorted list:\n");
for (i = 0; i < k; ++i) {
printf("%d %d\n", c[i].num, c[i].score);
}
return 0;
}
改进算法
#include <stdio.h>
typedef struct {
int num; // 学号
int score; // 成绩
} Student;
// 归并排序算法
void mergeSort(Student* a, int lo, int hi) {
if (lo >= hi) return;
int mid = (lo + hi) / 2;
mergeSort(a, lo, mid);
mergeSort(a, mid + 1, hi);
int i = lo, j = mid + 1, k = 0;
Student temp[hi - lo + 1];
while (i <= mid && j <= hi) {
if (a[i].num <= a[j].num) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= hi) {
temp[k++] = a[j++];
}
for (i = 0; i < k; ++i) {
a[lo + i] = temp[i];
}
}
int main() {
int n, m, i, j, k;
Student a[100], b[100], c[200];
// 分别读入两个数组 a 和 b
scanf("%d", &n);
for (i = 0; i < n; ++i) {
scanf("%d %d", &a[i].num, &a[i].score);
}
scanf("%d", &m);
for (i = 0; i < m; ++i) {
scanf("%d%d", &b[i].num, &b[i].score);
}
// 按照学号升序合并数组 a 和 b 到 c 中
i = j = k = 0;
while (i < n && j < m) {
if (a[i].num <= b[j].num) {
c[k++] = a[i++];
} else {
c[k++] = b[j++];
}
}
while (i < n) {
c[k++] = a[i++];
}
while (j < m) {
c[k++] = b[j++];
}
// 对新数组 c 按照学号升序排序
mergeSort(c, 0, k - 1);
// 输出新数组
for (i = 0; i < k; ++i) {
printf("%d %d\n", c[i].num, c[i].score);
}
return 0;
}
此代码产生了,数组越界问题
#include <stdio.h>
typedef struct {
int num; // 学号
int score; // 成绩
} Student;
// 归并排序算法
void mergeSort(Student* a, int lo, int hi) {
if (lo >= hi) return;
int mid = (lo + hi) / 2;
mergeSort(a, lo, mid);
mergeSort(a, mid + 1, hi);
int i = lo, j = mid + 1, k = 0;
Student temp[hi - lo + 1];
while (i <= mid && j <= hi) {
if (a[i].num <= a[j].num) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= hi) {
temp[k++] = a[j++];
}
for (i = 0; i < k; ++i) {
a[lo + i] = temp[i];
}
}
int main() {
int n, m, i, j, k;
Student a[110], b[110], c[220]; // 扩大数组定义范围
// 分别读入两个数组 a 和 b
scanf("%d", &n);
for (i = 0; i < n && i < 100; ++i) { // 判断输入的大小是否超出了数组定义范围
scanf("%d %d", &a[i].num, &a[i].score);
}
scanf("%d", &m);
for (i = 0; i < m && i < 100 ; ++i) { // 判断输入的大小是否超出了数组定义范围
scanf("%d%d", &b[i].num, &b[i].score);
}
// 按照学号升序合并数组 a 和 b 到 c 中
i = j = k = 0;
while (i < n && j < m) {
if (a[i].num <= b[j].num) {
c[k++] = a[i++];
} else {
c[k++] = b[j++];
}
}
while (i < n) {
c[k++] = a[i++];
}
while (j < m) {
c[k++] = b[j++];
}
// 对新数组 c 按照学号升序排序
mergeSort(c, 0, k - 1);
// 输出新数组
for (i = 0; i < k && i < 200; ++i) { // 判断输出的大小是否超出了数组定义范围
printf("%d %d\n", c[i].num, c[i].score);
}
return 0;
}
修改后的代码
#include <stdio.h>
#include <stdlib.h> // 用到 malloc 和 free 函数
typedef struct Linklist1052{
int num;
int score;
struct Linklist1052 *next;
}Node;
Node* create(int n){
Node *p1,*p2;
Node *head = NULL;
p1=p2=(Node *)malloc(sizeof(Node));
for(int i=0;i<n;i++){
scanf("%d %d",&p1->num,&p1->score);
if(i==0){
head=p1;
}else{
p2->next=p1;
}
p2=p1;
p1=(Node *)malloc(sizeof(Node));
}
p2->next=NULL;
return head;
}
void print1052(Node *head){
Node *p = head;
if(head!=NULL){
while(p!=NULL){
printf("%d %d\n",p->num,p->score);
p=p->next;
}
}
}
// 对链表进行归并和排序操作
Node *pai1052(Node *a, Node *b, int n, int m){
Node *p,*q,*head,*min,*minq,*newp;
head=NULL;
p=a;
while(p->next!=NULL){
p=p->next;
}
p->next=b;
q=min=q=p;
for(int i=0; i<n+m; i++){
p=a;
q=minq=min=p;
// 寻找num最小指针
while(p!=NULL){
if(min->num>p->num){
min=p;
minq=q;
}
q=p;
p=p->next;
}
if(min==a){ // 首位最小的情况
a=a->next;
}
// 解绑
minq->next=min->next;
if(i==0){
head=min;
}else{
newp->next=min;
}
newp=min;
}
newp->next=NULL;
return head;
}
int main(){
Node *a,*b,*ab;
int n,m;
scanf("%d",&n);
scanf("%d",&m);
a=create(n);
b=create(m);
ab=pai1052(a,b,n,m);
print1052(ab);
// 释放内存,防止内存泄漏
Node *temp = NULL;
while (a != NULL)
{
temp = a;
a = a->next;
free(temp);
}
while (b != NULL)
{
temp = b;
b = b->next;
free(temp);
}
while (ab != NULL)
{
temp = ab;
ab = ab->next;
free(temp);
}
return 0;
}
最后解决代码