c - 我正在尝试按分数对节点进行排序。我不知道我有什么错误

标签 c structure nodes

#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("\nFirst name: %s", first->firstname);
    printf("\tLast name: %s", first->lastname);
    printf("\tGrade: %.2f", first->grade);
    printf("\t 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("\nEnter the first name of the student:");
        scanf("%s", first->firstname);
        printf("\nEnter the last name of the student:");
        scanf("%s", first->lastname);
        printf("\nEnter the score of the student:");
        scanf("%lf", &first->grade);
        printf("\nEnter the zipcode of the student:");
        scanf("%s", first->zipcode);
    }
}
}

void del()
{
struct student *back, *t, *k;
char r[10];
int flag = 0;
printf("\nEnter 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("\nThe element not found!!!");
}
*/

void search(struct student *first)
{
char r[10];
int flag = 0;
printf("\nEnter the zipcode you want to search:");
scanf("%s", r);
struct student *t;
t = first;
while (t != NULL)
{
    if (strcmp(r, t->zipcode) == 0)
    {
        printf("\nFirst name: %s", t->firstname);
        printf("\tLast name: %s", t->lastname);
        printf("\tGrade: %.2f", t->grade);
        printf("\t ZipCode: %s", t->zipcode);
        flag = 1;
        break;
    }t = t->next;
}
if (flag == 0)
    printf("\nThe 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("\nThe sorted record by score are: \n");
display(first);
}

int main(void)
{
struct student *first = NULL, *last = NULL;
struct student *temp;
int n;
printf("\nEnter the number of student:");
scanf("%d", &n);
int i;
for (i = 0; i < n; i++)
{
    temp = (struct student*)malloc(sizeof(struct student));
    printf("\nEnter the first name of the student:");
    scanf("%s", temp->firstname);
    printf("\nEnter the last name of the student:");
    scanf("%s", temp->lastname);
    printf("\nEnter the grade of the student:");
    scanf("%lf", &temp->grade);
    printf("\nEnter the zipcode of the student:");
    scanf("%s", temp->zipcode);
    temp->next = first;
    first = temp;
}
int o;
o = 1;
while (o != 0)
{
    printf("\nMENU\n");
    printf("\nEnter 1 for displaying database.");
    printf("\nEnter 2 for inserting an record.");
    printf("\nEnter 3 for deleting a record by lastname.");
    printf("\nEnter 4 for searching a record by zipcode.");
    printf("\nEnter 5 for sorting record by score.");
    printf("\nEnter 0 for exit!");
    printf("\nEnter 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("\nYou have entered a wrong choice!!!");
    }
}
}

问题是我如何按分数对分数进行排序。我的代码看起来是正确的,但不起作用。我制作了一个临时结构并尝试交换值,但它不起作用。我循环做错了吗?或者我所有的代码都是错误的?

最佳答案

这里有两个问题的答案

第一个对节点链表中的节点进行冒泡排序,重新排列链表

第二个遍历链表,将指向每个链表的指针复制到数组中,然后使用结构体等级成员对数组进行排序,链表保持不变

#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;
}

第二个版本,使用qsort,保留链表顺序

#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;
}

关于c - 我正在尝试按分数对节点进行排序。我不知道我有什么错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20274801/

相关文章:

选择排序算法能否像冒泡排序那样提前终止其循环?

转换为克

c - 哪些测试用例的代码出错了?

java - 如何将节点从二叉树插入数组?

python - 带有networkx的超图

c - 如何重新格式化代码以正确输出?

c - 取消引用三重指针

c# - 着眼于 future 的代码

c - 在结构数组中输入字符的循环无法正常工作

c++ - BST - 节点神秘地被分配到错误的一侧