p->num, p->score);还可以怎么写
时间: 2024-03-29 11:35:50 浏览: 22
`p->num`表示访问`p`指向的结构体中的`num`成员,`p->score`同理。除了箭头符号`->`,还可以使用点号`.`来访问结构体成员,因为指针`p`指向的是结构体,所以也可以用`(*p).num`和`(*p).score`来访问结构体成员。这里的括号是必须的,因为`.`的优先级比`*`高,所以需要用括号把`*p`括起来,表示先解引用指针,再访问成员。因此,`p->num, p->score`也可以写成`(*p).num, (*p).score`。
相关问题
void *Sort(STU *head) { p = head->next; now = head; pr = head; while (p != NULL) { while (p->next != NULL) { if ((p->score[0] + p->score[1] + p->score[2]) < (p->next->score[0] + p->next->score[1] + p->next->score[2])) { strcpy(pr->num, p->num); strcpy(pr->name, p->name); strcpy(pr->major, p->major); pr->classNo = p->classNo; pr->score[0] = p->score[0]; pr->score[1] = p->score[1]; pr->score[2] = p->score[2]; strcpy(p->num, p->next->num); strcpy(p->name, p->next->name); strcpy(p->major, p->next->major); p->classNo = p->next->classNo; p->score[0] = p->next->score[0]; p->score[1] = p->next->score[1]; p->score[2] = p->next->score[2]; strcpy(p->next->num, pr->num); strcpy(p->next->name, pr->name); strcpy(p->next->major, pr->major); p->next->classNo = pr->classNo; p->next->score[0] = pr->score[0]; p->next->score[1] = pr->score[1]; p->next->score[2] = pr->score[2]; } p = p->next; } p = now->next; now = now->next; } }
你提供的`Sort`函数实现了一个简单的冒泡排序算法来按照学生总分从高到低对链表进行排序。代码中使用了结构体成员变量之间的赋值和字符串拷贝操作。
但是你的代码存在一个问题,就是在内层循环中,你没有更新`pr`指针。这会导致每次交换后,`pr`指针都保持不变,而应该向前移动一个位置。
以下是修复这个问题的修改后的代码:
```c
void Sort(STU *head) {
STU *p, *now, *pr;
p = head->next;
now = head;
pr = head;
while (p != NULL) {
while (p->next != NULL) {
if ((p->score[0] + p->score[1] + p->score[2]) < (p->next->score[0] + p->next->score[1] + p->next->score[2])) {
strcpy(pr->num, p->num);
strcpy(pr->name, p->name);
strcpy(pr->major, p->major);
pr->classNo = p->classNo;
pr->score[0] = p->score[0];
pr->score[1] = p->score[1];
pr->score[2] = p->score[2];
strcpy(p->num, p->next->num);
strcpy(p->name, p->next->name);
strcpy(p->major, p->next->major);
p->classNo = p->next->classNo;
p->score[0] = p->next->score[0];
p->score[1] = p->next->score[1];
p->score[2] = p->next->score[2];
strcpy(p->next->num, pr->num);
strcpy(p->next->name, pr->name);
strcpy(p->next->major, pr->major);
p->next->classNo = pr->classNo;
p->next->score[0] = pr->score[0];
p->next->score[1] = pr->score[1];
p->next->score[2] = pr->score[2];
}
p = p->next;
pr = pr->next; // 添加这一行来更新pr指针
}
p = now->next;
now = now->next;
}
}
```
这样,`pr`指针在内层循环中会向前移动一个位置,确保下一次交换时指向正确的位置。
请记得在调用`Sort`函数时传入合适的参数。
#include <stdio.h> #include <stdlib.h> #include <string.h> struct stud_node { int num; char name[20]; int score; struct stud_node *next; }; struct stud_node *head, *tail; void input(); int main() { struct stud_node *p; head = tail = NULL; input(); for ( p = head; p != NULL; p = p->next ) printf("%d %s %d\n", p->num, p->name, p->score); return 0; } /* 你的代码将被嵌在这里 */ void input() { int num; struct stud_node *p; scanf("%d",&num); while(num!=0){ p=(struct stud_node*)malloc(sizeof(struct stud_node)); if(head==NULL){ p->num=num; scanf("%s %d",p->name,&p->score); head=p; tail=p; } else{ p->num=num; scanf("%s %d",&p->num,p->name,&p->score); tail->next=p; tail=p; } scanf("%d",&num); } } 输入 1 zhang 78 2 wang 80 3 li 75 4 zhao 85 0 为什么会输出 1 zhang 78 1735287159 P 1934974013 26988 K 1549890657 1868654714 U 1129271888
这段代码中存在以下问题:
1. 在第二个else语句中,scanf函数中的第一个参数应该为p->name,而不是&p->num。
2. 在输入数据时,应该先给p节点的name和score成员赋值,再将p节点加入到链表中。
修改后的代码如下:
```
void input() {
int num;
struct stud_node *p;
scanf("%d", &num);
while (num != 0) {
p = (struct stud_node*)malloc(sizeof(struct stud_node));
if (head == NULL) {
p->num = num;
scanf("%s %d", p->name, &p->score);
head = p;
tail = p;
}
else {
p->num = num;
scanf("%s %d", p->name, &p->score);
tail->next = p;
tail = p;
}
scanf("%d", &num);
}
}
```