I m trying to sort the node by score. I do not know what error i am having

前端 未结 1 428
遥遥无期
遥遥无期 2020-12-07 06:09
#include
#include
#include

struct student{
char firstname[20];
char lastname[20];
double grade;
char zipcode[10];
stru         


        
相关标签:
1条回答
  • 2020-12-07 06:32

    Here are two answers to the problem

    First one sorts the nodes in the node linked list by bubble sorting them, rearranging the linked list

    Second one walks the linked list, copies a pointer to each one into an array and then sorts the array by using the struct grade members, the linked list remains unchanged

    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    
    #define SWAP(T,x,y) {T *p = &(x); T *q = &(y); T z = *p; *p = *q; *q = z;}
    
    struct student{
        char firstname[20];
        char lastname[20];
        double grade;
        char zipcode[10];
        struct student *next;
    };
    
    struct student *head=NULL;
    
    void add(char *f, char *s, double score) {
    struct student *a;
    a=(struct student*)malloc(sizeof(struct student));
    strcpy(a->firstname,f);
    strcpy(a->lastname,s);
    a->grade = score;
    a->next = head;
    head = a;
    }
    void printout(char *label) {
        struct student *node;
        printf("%s\n",label);
        for(node=head; node !=NULL; node=node->next) {
            printf("%s %s %f\n", node->firstname, node->lastname, node->grade);
        }
    }
    
    int main(int argc, char ** argv){
        int mark=8;
        struct student *walk, *prev; 
        add("Bob","Smith",10);
        add("Eric","Von Däniken",90);
        add("Morris","Minor",91);
        add("Master","Bates",9);
        add("Zoe","Bodkin",20);
        add("Mary","Pippin",30);
    /* bubble sort */
    printout("before");
            prev=head;
            while(mark) {
                mark=0;
            for(walk=head; 
            walk != NULL; 
            walk=walk->next) {
                if (walk->next && walk->grade > walk->next->grade) {
                    /* printf("swapping %s %s\n", walk->firstname, walk->next->firstname); */
                    mark=1;
                    if (walk == head) {
                       struct student *v2=walk->next;
                       struct student *v3=walk->next->next;
                       SWAP(struct student *, v3->next, v2->next);
                       SWAP(struct student *, head, v3->next);
                       walk = v3;
                    } else { 
                       struct student *v1=prev;
                       struct student *v2=walk;
                       struct student *v3=walk->next;
                       SWAP(struct student *, v3->next, v2->next);
                       SWAP(struct student *, v1->next, v3->next);
                       walk = v3;
                    } 
                } 
                prev=walk;
            }
    
            }
            printout("after");
        return 0;
    }
    

    second version, uses qsort, retains linked list order

    #include<stdio.h>
    #include<stdlib.h>
    #include <string.h>
    
    struct student{
        char firstname[20];
        char lastname[20];
        double grade;
        char zipcode[10];
        struct student *next;
    };
    
    struct student *head=NULL;
    size_t nodecount=0;
    
    void add(char *f, char *s, double score) {
    struct student *a;
    a=(struct student*)malloc(sizeof(struct student));
    strcpy(a->firstname,f);
    strcpy(a->lastname,s);
    a->grade = score;
    a->next = head;
    head = a;
    nodecount++;
    }
    
    
    static int cmpgrade(const void *p1, const void *p2) {
        struct student *g1, *g2;
        g1=*(struct student **)p1;
        g2=*(struct student **)p2;
        return g1->grade > g2->grade;
    }
    
    int main(int argc, char ** argv){
        int i;
        struct student *walk,**sa, **sap; 
        add("Bob","Smith",10);
        add("Eric","Von Däniken",90);
        add("Morris","Minor",91);
        add("Master","Bates",9);
        add("Zoe","Bodkin",20);
        add("Mary","Pippin",30);
    
    /*copy into array of pointers*/
    sa=calloc(sizeof (struct student*), nodecount);
    sap=sa;
            for(walk=head; walk != NULL; walk=walk->next) {
                  *sap = walk;
                  sap++;
            }
            printf("before\n");
            for (i=0; i< nodecount; i++) {
                printf("%s %s %f\n", sa[i]->firstname, sa[i]->lastname, sa[i]->grade);
            }
            /* qsort */
            qsort(sa, nodecount, sizeof (struct student *), cmpgrade);
    
            printf("after\n");
            for (i=0; i< nodecount; i++) {
                printf("%s %s %f\n", sa[i]->firstname, sa[i]->lastname, sa[i]->grade);
            }
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题