STU* Search_num(STU* head, char* num) {//查找指定学号的学生,返回指向该学生结点的指针 now = head->next; while (now != NULL && strcmp(now->num, num) != 0) { now = now->next; } return now; }
时间: 2024-04-15 20:24:56 浏览: 121
这段代码是一个函数,它的作用是在一个链表中查找指定学号的学生,并返回指向该学生节点的指针。
代码中使用了一个指针now,用于遍历链表。首先,将指针now指向链表的第一个节点,然后通过while循环遍历链表,直到找到学号与指定学号相同的节点或者遍历到链表的末尾。
在每次循环中,使用strcmp函数比较当前节点的学号与指定学号是否相同。如果相同,则找到了目标学生节点,返回该节点的指针。如果不相同,则继续遍历下一个节点。
如果遍历完整个链表仍然没有找到目标学生节点,则返回NULL表示未找到。
以上是对这段代码的简要解释,如果你有更具体的问题或者需要进一步解释,请告诉我。
相关问题
#include <stdio.h> #include <stdlib.h> //定义结点结构体 typedef struct student { //数据域 int num; //学号 int score; //分数 char name[20]; //姓名 //指针域 struct student *next; }STU; void link_creat_head(STU **p_head,STU *p_new) { STU *p_mov = *p_head; if(*p_head == NULL) //当第一次加入链表为空时,head执行p_new { *p_head = p_new; p_new->next=NULL; } else //第二次及以后加入链表 { while(p_mov->next!=NULL) { p_mov=p_mov->next; //找到原有链表的最后一个节点 } p_mov->next = p_new; //将新申请的节点加入链表 p_new->next = NULL; } } int main() { STU *head = NULL,*p_new = NULL; int num,i; printf("请输入链表初始个数:\n"); scanf("%d",&num); for(i = 0; i < num;i++) { p_new = (STU*)malloc(sizeof(STU));//申请一个新节点 printf("请输入学号、分数、名字:\n"); //给新节点赋值 scanf("%d %d %s",&p_new->num,&p_new->score,p_new->name); link_creat_head(&head,p_new); //将新节点加入链表 } return 0; }
这段代码实现了一个头插法创建链表的功能。用户输入要创建的节点数,然后依次输入每个节点的数据,再将新节点插入到链表的头部。具体实现过程如下:
1. 定义了一个名为STU的结构体,包含了学号、分数、姓名等数据域,以及一个指向下一个节点的指针域。
2. 定义了一个函数link_creat_head,它有两个参数:一个是头指针的地址,另一个是要插入的新节点的地址。该函数首先判断链表是否为空,如果是,则将头指针指向新节点,并将新节点的指针域设为NULL;如果不为空,则遍历链表找到最后一个节点,将最后一个节点的指针域指向新节点,并将新节点的指针域设为NULL。
3. 在main函数中,先定义了头指针和新节点指针,并将头指针初始化为NULL。然后用户输入要创建的节点数,以及每个节点的数据,将新节点插入到链表的头部。
需要注意的是,在使用完链表后,要释放所有节点的内存空间,避免内存泄漏。
提交与自己学号相邻的两位同学的学号与一门考试成绩,编程建立由这三组数据结点组成的简单链表
### 回答1:
首先,你需要定义一个结构体,来存储学号和成绩的信息。然后,你可以创建三个结构体变量,分别代表与你学号相邻的两位同学和你自己,并给它们赋值。最后,你需要让它们相互连接,以形成一个链表。
代码示例(C语言):
```
struct node {
int num;
int score;
struct node *next;
};
int main() {
struct node stu1, stu2, stu3;
stu1.num = 12345;
stu1.score = 80;
stu2.num = 12346;
stu2.score = 85;
stu3.num = 12347;
stu3.score = 90;
stu1.next = &stu2;
stu2.next = &stu3;
stu3.next = NULL;
return 0;
}
```
### 回答2:
首先,我们需要一个节点的结构体来存储学号和考试成绩的信息:
struct Node{
int xuehao;
int score;
struct Node* next;
};
其中,xuehao表示学号,score表示考试成绩,next表示指向下一个节点的指针。
接下来,我们可以编写一个函数来创建这个链表,按照学号的顺序插入节点,并且从输入中读取学号和考试成绩。假设学号和考试成绩分别存储在xuehao和score两个数组中:
struct Node* createList(int* xuehao, int* score){
struct Node* head = NULL;
struct Node* p;
for(int i=0; i<2; i++){
struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
newnode->xuehao = xuehao[i];
newnode->score = score[i];
newnode->next = NULL;
if(head == NULL){
head = newnode;
p = newnode;
}
else{
while(p->next != NULL && p->next->xuehao < xuehao[i]){
p = p->next;
}
newnode->next = p->next;
p->next = newnode;
p = head;//改变p的位置,重新从头开始查找
}
}
return head;
}
此时,我们已经成功地创建了一个由三个节点组成的简单链表。接下来,可以编写一个函数来遍历这个链表,输出每一个节点的学号和考试成绩:
void printList(struct Node* head){
struct Node* p = head;
while(p != NULL){
printf("学号:%d,考试成绩:%d\n", p->xuehao, p->score);
p = p->next;
}
}
最终,在主函数中,我们可以调用这两个函数,实现整个程序的功能:
int main(){
int xuehao[] = {1001, 1002, 1003};
int score[] = {80, 90, 85};
struct Node* head = createList(xuehao, score);
printList(head);
return 0;
}
输出结果如下:
学号:1001,考试成绩:80
学号:1002,考试成绩:90
学号:1003,考试成绩:85
### 回答3:
在建立该链表之前,我们需要先明确链表的概念。链表是一种常见的数据结构,也是一种线性表,它通过指针将一些节点串联起来,形成一个序列,并且可以按照一定的顺序进行访问。链表中的每个节点都包含了两个部分,一个是存储数据的部分,另一个是指向下一个节点的指针。每个节点的指针都指向它后面的那个节点,这是链表的一个最显著的特点。
接下来,根据题目要求,我们假设自己的学号是A,那么与自己学号相邻的两位同学的学号应该分别是B和C。同时,我们还需要知道这三个人在某一门课程的成绩,假设这门课程的名称为Math,那么学号A、B、C在Math课程的成绩分别为90、85和95分。
现在,我们可以开始编写链表的数据结构了,每个节点应该包含三个部分:学号、成绩和指向下一个节点的指针。我们可以定义一个结构体来表示这些节点,代码如下:
```
struct Node {
char ID[20];
int score;
Node* next;
};
```
其中,ID表示学号,score表示成绩,next表示指向下一个节点的指针。现在我们可以开始创建链表了,代码如下:
```
Node* createList() {
Node* head = NULL;
char id[20];
int score;
// 添加第一个节点
cout << "请输入学号和成绩(以空格分隔):";
cin >> id >> score;
Node* node = new Node();
strcpy(node->ID, id);
node->score = score;
node->next = NULL;
head = node;
// 添加第二个节点
if (strcmp(id, "A") == 0) { // 如果输入的学号是A,那么B是下一个节点
cout << "请输入学号B的成绩:";
cin >> score;
Node* node2 = new Node();
strcpy(node2->ID, "B");
node2->score = score;
node2->next = NULL;
head->next = node2;
} else { // 如果输入的学号是C,那么B是前一个节点
cout << "请输入学号B的成绩:";
cin >> score;
Node* node2 = new Node();
strcpy(node2->ID, "B");
node2->score = score;
node2->next = head;
head = node2;
}
// 添加第三个节点
cout << "请输入学号C的成绩:";
cin >> score;
Node* node3 = new Node();
strcpy(node3->ID, "C");
node3->score = score;
node3->next = NULL;
Node* p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = node3;
return head;
}
```
在上面的代码中,我们首先使用了一个指针head来表示链表的头结点,初始值为NULL。然后,我们添加了第一个节点,也就是自己的学号和成绩。接着,我们根据输入的学号判断B和C的相对位置,并分别添加了相应的节点。最后,我们添加了第三个节点C,将其添加到链表的末尾。
现在,我们已经创建好了这个链表,可以使用以下代码来打印所有节点的信息:
```
void printList(Node* head) {
Node* p = head;
while (p != NULL) {
cout << p->ID << " " << p->score << endl;
p = p->next;
}
}
```
最后,我们可以在主函数中调用createList和printList来测试代码的效果:
```
int main() {
Node* head = createList();
printList(head);
return 0;
}
```
完整的代码如下:
阅读全文