Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
263 views
in Technique[技术] by (71.8m points)

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

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

struct student{
char firstname[20];
char lastname[20];
double grade;
char zipcode[10];
struct student *next;
};

void display(struct student *first)
{
while (first != NULL)
{
    printf("
First name: %s", first->firstname);
    printf("Last name: %s", first->lastname);
    printf("Grade: %.2f", first->grade);
    printf(" ZipCode: %s", first->zipcode);
    first = first->next;
}
}


/*void add_Record(struct student *first)
{
char r[20];
struct student *t;
t = first;

while (t != NULL)
{
    if (t == NULL)
    {
        first = (struct student*)malloc(sizeof(struct student));
        printf("
Enter the first name of the student:");
        scanf("%s", first->firstname);
        printf("
Enter the last name of the student:");
        scanf("%s", first->lastname);
        printf("
Enter the score of the student:");
        scanf("%lf", &first->grade);
        printf("
Enter the zipcode of the student:");
        scanf("%s", first->zipcode);
    }
}
}

void del()
{
struct student *back, *t, *k;
char r[10];
int flag = 0;
printf("
Enter the last name of student  you want to delete:");
scanf("%s", r);
if (strcmpi(r, first->lastname) == 0)
{
    first = first->next;
    flag = 1;
}
else
{
    back = first;
    k = first->next;
    while (k != NULL)
    {
        if (strcmpi(r, k->lastname) == 0)
        {
            back->next = k->next;
            flag = 1;
            break;
        }
    }
}
if (flag == 0)
    printf("
The element not found!!!");
}
*/

void search(struct student *first)
{
char r[10];
int flag = 0;
printf("
Enter the zipcode you want to search:");
scanf("%s", r);
struct student *t;
t = first;
while (t != NULL)
{
    if (strcmp(r, t->zipcode) == 0)
    {
        printf("
First name: %s", t->firstname);
        printf("Last name: %s", t->lastname);
        printf("Grade: %.2f", t->grade);
        printf(" ZipCode: %s", t->zipcode);
        flag = 1;
        break;
    }t = t->next;
}
if (flag == 0)
    printf("
The zipcode not in database!!");
}

void sort(struct student *first)
{
struct student *temp;
temp = NULL;
while (first != NULL)
{
    if (first-> grade > first->next->grade)
    {
        strcpy(temp->firstname, first->firstname);
        strcpy(temp->lastname, first->lastname);
        temp->grade = first->grade;
        strcpy(temp->zipcode, first->zipcode);
        strcpy(first->firstname, first->next->firstname);
        strcpy(first->lastname, first->next->lastname);
        first->grade = first->next->grade;
        strcpy(first->zipcode, first->next->zipcode);
        strcpy(first->next->firstname, temp->firstname);
        strcpy(first->next->lastname, temp->lastname);
        first->next->grade = temp->grade;
        strcpy(first->next->zipcode, temp->zipcode);
        break;
    }
}
printf("
The sorted record by score are: 
");
display(first);
}

int main(void)
{
struct student *first = NULL, *last = NULL;
struct student *temp;
int n;
printf("
Enter the number of student:");
scanf("%d", &n);
int i;
for (i = 0; i < n; i++)
{
    temp = (struct student*)malloc(sizeof(struct student));
    printf("
Enter the first name of the student:");
    scanf("%s", temp->firstname);
    printf("
Enter the last name of the student:");
    scanf("%s", temp->lastname);
    printf("
Enter the grade of the student:");
    scanf("%lf", &temp->grade);
    printf("
Enter the zipcode of the student:");
    scanf("%s", temp->zipcode);
    temp->next = first;
    first = temp;
}
int o;
o = 1;
while (o != 0)
{
    printf("
MENU
");
    printf("
Enter 1 for displaying database.");
    printf("
Enter 2 for inserting an record.");
    printf("
Enter 3 for deleting a record by lastname.");
    printf("
Enter 4 for searching a record by zipcode.");
    printf("
Enter 5 for sorting record by score.");
    printf("
Enter 0 for exit!");
    printf("
Enter the choice:");
    scanf("%d", &o);
    switch (o)
    {
    case 1:display(first); break;
        /*case 2:insertafter(*first); break;
    case 3:del(); break;*/
    case 4:search(first); break;
    case 5: sort(first); break;
    case 0:exit(0); break;
    default:printf("
You have entered a wrong choice!!!");
    }
}
}

The problem is that how do i sort the scores by score. My code seems right but doesn't work. I made a temp structure and tried to swap values but it doesn't work. Am i doing the loop wrong? Or all my code is wrong?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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
",label);
    for(node=head; node !=NULL; node=node->next) {
        printf("%s %s %f
", 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
", 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
");
        for (i=0; i< nodecount; i++) {
            printf("%s %s %f
", sa[i]->firstname, sa[i]->lastname, sa[i]->grade);
        }
        /* qsort */
        qsort(sa, nodecount, sizeof (struct student *), cmpgrade);

        printf("after
");
        for (i=0; i< nodecount; i++) {
            printf("%s %s %f
", sa[i]->firstname, sa[i]->lastname, sa[i]->grade);
        }
    return 0;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...