xx兵 2019-12-30 16:31 采纳率: 0%
浏览 302

求助,关于c语言链表排序的问题

做了两个链表 每个节点内有一个学生的编号和成绩,现在要求把两个链表合并,然后按照学号升序排列 不知道为啥 第65行总是报错 我整了一个小时了 没发现哪里错了,貌似运行时候显示说我引用了一个不可以引用的地址?求助大神谢谢了

#include <stdio.h>
#include <stdlib.h>

#define LEN sizeof(struct Person)

struct Person {
    int num;
    float score;
    struct Person *next;
};

struct Person *createPerson();

void printLink(struct Person *);

struct Person *merge(struct Person *, struct Person *);

struct Person *mergeAndSort(struct Person *, struct Person *);

void sort(struct Person *[], int);

int main() {
    struct Person *p1 = createPerson();
    struct Person *p2 = createPerson();
//    struct Person *pPerson = merge(p1, p2);
    struct Person *pPerson = mergeAndSort(p1, p2);
    printLink(pPerson);

    return 0;
}

void sort(struct Person *arr[], int n) {
    struct Person *tmp;
    for (int i = 0; i < n - 1; i++) {
        for (int j = i + 1; j < n; j++) {
            if (arr[i]->num > arr[j]->num) {
                //swap
                tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }
    }
}

struct Person *mergeAndSort(struct Person *a, struct Person *b) {
    struct Person *arr[64];
    struct Person *head;
    int i = 0, x;
    while (a != NULL) {
        arr[i] = a;
        a = a->next;
        i++;
    }
    while (b != NULL) {
        arr[i] = b;
        b = b->next;
        i++;
    }
    sort(arr, i);

    //reCreateLink
    head = arr[0];
    head->next = arr[1];
    for (x = 1; x < i - 1; x++) {
        (arr[i])->next = arr[i + 1];
    }
    arr[x]->next = NULL;

    return head;

}

struct Person *merge(struct Person *a, struct Person *b) {
    struct Person *tmp = a;
    while (tmp->next != NULL) {
        tmp = tmp->next;
    }
    tmp->next = b;
    return a;
}

void printLink(struct Person *p) {
    while (p != NULL) {
        printf("%d\t%f\n", p->num, p->score);
        p = p->next;
    }

}

struct Person *createPerson() {
    struct Person *p1, *p2, *head;
    p1 = p2 = (struct Person *) malloc(LEN);
    scanf("%d %f", &p1->num, &p1->score);
    int size = 0;
    while (p1->num != 0) {
        size++;
        if (size == 1) {
            head = p1;
        } else {
            p2->next = p1;
        }
        p2 = p1;
        p1 = (struct Person *) malloc(LEN);
        scanf("%d %f", &p1->num, &p1->score);
    }
    p2->next = NULL;
    printf("Establish complete\n");
    return head;
};

  • 写回答

1条回答

  • bobhuang 2019-12-30 16:50
    关注
    struct Person *createPerson() {
        struct Person *p1, *p2, *head;
        p1 = p2 = (struct Person *) malloc(LEN);
            p1->next = NULL;
        scanf("%d %f", &p1->num, &p1->score);
        int size = 0;
        while (p1->num != 0) {
            size++;
            if (size == 1) {
                head = p1;
            } else {
                p2->next = p1;
            }
            p2 = p1;
            p1 = (struct Person *) malloc(LEN);
                    p1->next = NULL;
            scanf("%d %f", &p1->num, &p1->score);
        }
        p2->next = NULL;
        printf("Establish complete\n");
        return head;
    };
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog