【问题标题】:Sorting numbers high to low in C Linked List在 C 链表中从高到低对数字进行排序
【发布时间】:2021-02-17 03:43:27
【问题描述】:

我想按照分数从高到低对我在 Main 方法中添加的学生的索引进行排序。这是我要创建的列表的最后一种形式。

0,18061086,65
1,20060032,60
2,20060678,55
3,20060045,50
4,19061091,45
5,18060311,40
6,20060134,30

这是我写的代码:

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

struct student{
    int index;
    int studentnumber;
    int score;
    struct student* next;
};

typedef struct student Student;
void addStudent(Student **headOfList,int index,int studentnumber,int score);
void score(Student* headOfList);
int main(){
    Student* headOfList = NULL;
    addStudent(&headOfList,0,18060311,40);
    addStudent(&headOfList,1,20060045,50);
    addStudent(&headOfList,2,19061091,45);
    addStudent(&headOfList,3,20060134,30);
    addStudent(&headOfList,4,20060678,55);
    addStudent(&headOfList,5,18061086,65);
    addStudent(&headOfList,6,20060032,60);
    return 0;
}


void addStudent(Student **headOfList,int index,int studentnumber,int score){
    Student* currentStudent = (*headOfList);
    Student* newStudent = (Student*)malloc(sizeof(Student));
    newStudent->index =index;
    newStudent->studentnumber = studentnumber;
    newStudent->score = score;
    newStudent->next = NULL;
    if(currentStudent == NULL){
        // if list is empty
        (*headOfList)= newStudent;
    }
    else{
        while(currentStudent->next != NULL){
            currentStudent = currentStudent->next;
        }   
        currentStudent -> next = newStudent;
    }
}

【问题讨论】:

  • 如果您在 head 中跟踪学生总数,那么您可以创建一个中间预分配的指向列表元素的指针数组。使用这个指针列表,您可以将自己的比较器连接到 stdlib qsort 函数。当指针列表根据您的比较器进行排序时,您可以遍历您的列表,从第二个开始一个接一个地更新下一个指针,最后将头部中的下一个指针更新为排序列表中的第一个指针。

标签: c pointers data-structures linked-list structure


【解决方案1】:

您可以直接在排序位置插入新学生:

void display(Student* headOfList){ 
    Student* currentStudent= headOfList; 
    while(currentStudent!=NULL){ 
        printf("index no : %-3d student Number : %-6d student score : %-3d\n", 
        currentStudent->index,
        currentStudent->studentnumber,
        currentStudent->score); 
        currentStudent = currentStudent->next; 
    } 
} 

void addStudent(Student **headOfList,int index,int studentnumber,int score) {
    Student* currentStudent = (*headOfList);
    Student* newStudent = (Student*)malloc(sizeof(Student));
    Student* prev = NULL;
    newStudent->index =index;
    newStudent->studentnumber = studentnumber;
    newStudent->score = score;
    newStudent->next = NULL;
    printf("====== Add new student :\n");
    if(currentStudent == NULL){
        // if list is empty
        (*headOfList)= newStudent;
    }
    else if (score >= (*headOfList)->score) {
        *headOfList = newStudent;
        newStudent->next = currentStudent;
    }
    else {
        while(currentStudent->next != NULL && currentStudent->next->score >= score) {
            currentStudent = currentStudent->next;
        }   
        //printf("%d %d \n", score, currentStudent->score);
        Student* next = currentStudent->next;
        currentStudent->next = newStudent;
        newStudent->next = next;
    }
    if (headOfList) {
        display(*headOfList);
    }
}

int main(){
    Student* headOfList = NULL;
    addStudent(&headOfList,0,18060311,40);
    addStudent(&headOfList,1,20060045,50);
    addStudent(&headOfList,2,19061091,45);
    addStudent(&headOfList,3,20060134,30);
    addStudent(&headOfList,4,20060678,55);
    addStudent(&headOfList,5,18061086,60);
    addStudent(&headOfList,6,20060032,60);
    
    printf("================ Final result :\n");
    display(headOfList);
    return 0;
}
/*
Program returned: 0
====== Add new student :
index no : 0   student Number : 18060311 student score : 40 
====== Add new student :
index no : 1   student Number : 20060045 student score : 50 
index no : 0   student Number : 18060311 student score : 40 
====== Add new student :
index no : 1   student Number : 20060045 student score : 50 
index no : 2   student Number : 19061091 student score : 45 
index no : 0   student Number : 18060311 student score : 40 
====== Add new student :
index no : 1   student Number : 20060045 student score : 50 
index no : 2   student Number : 19061091 student score : 45 
index no : 0   student Number : 18060311 student score : 40 
index no : 3   student Number : 20060134 student score : 30 
====== Add new student :
index no : 4   student Number : 20060678 student score : 55 
index no : 1   student Number : 20060045 student score : 50 
index no : 2   student Number : 19061091 student score : 45 
index no : 0   student Number : 18060311 student score : 40 
index no : 3   student Number : 20060134 student score : 30 
====== Add new student :
index no : 5   student Number : 18061086 student score : 60 
index no : 4   student Number : 20060678 student score : 55 
index no : 1   student Number : 20060045 student score : 50 
index no : 2   student Number : 19061091 student score : 45 
index no : 0   student Number : 18060311 student score : 40 
index no : 3   student Number : 20060134 student score : 30 
====== Add new student :
index no : 6   student Number : 20060032 student score : 60 
index no : 5   student Number : 18061086 student score : 60 
index no : 4   student Number : 20060678 student score : 55 
index no : 1   student Number : 20060045 student score : 50 
index no : 2   student Number : 19061091 student score : 45 
index no : 0   student Number : 18060311 student score : 40 
index no : 3   student Number : 20060134 student score : 30 
================ Final result :
index no : 6   student Number : 20060032 student score : 60 
index no : 5   student Number : 18061086 student score : 60 
index no : 4   student Number : 20060678 student score : 55 
index no : 1   student Number : 20060045 student score : 50 
index no : 2   student Number : 19061091 student score : 45 
index no : 0   student Number : 18060311 student score : 40 
index no : 3   student Number : 20060134 student score : 30
*/

【讨论】:

  • 对于分数相等的学生,如果优先是学号较低的学生,我应该如何更改代码?
  • currentStudent-&gt;next-&gt;score &lt; score中用
  • 无效显示(Student* headOfList){ Student* currentStudent= headOfList; while(currentStudent!=NULL){ printf("index no : %-3d student number : %-6d student score : %-3d\n", currentStudent->index,currentStudent->studentnumber,currentStudent->score); currentStudent = currentStudent->下一个; } } 我无法显示列表。我认为“addstudent”方法有问题。
  • 我在帖子中插入了 display 函数,但是我没有发现任何问题:每个新学生的列表正确打印一次,并且在 main 的最后一次打印(那个是最终名单)
  • 谢谢,但我想显示从高到低的分数,我也可以看看完整的代码。当我执行时,它显示无限次“索引号:3 学生号:20060134 学生分数:30”这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多