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

坚强是说给别人听的谎言 提交于 2019-11-28 02:25:15

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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!