赞
踩
- #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;
- }

最后解决代码
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。