c语言建立一个链表,每个结点包括姓名和成绩,【C++】建立一个学生信息链表,每个结点包括:学号、姓名、成绩。【原创技术】...
时间: 2024-03-17 08:47:02 浏览: 79
好的,我可以为您解答这两个问题。
首先是 C 语言建立一个链表,每个节点包括姓名和成绩。
链表是一种常用的数据结构,它由一组节点组成,每个节点包含两个部分:一个数据域和一个指针域。数据域用于存储节点的实际数据,指针域用于指向下一个节点的地址。
在 C 语言中,我们可以通过结构体来定义节点的数据结构。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链表节点结构体
typedef struct node {
char name[20]; // 姓名
int score; // 成绩
struct node* next; // 指向下一个节点的指针
} Node;
int main() {
Node* head = NULL; // 头节点指针
Node* p = NULL; // 用于遍历链表的指针
char input[20]; // 用于输入姓名的字符串变量
int score; // 用于输入成绩的整型变量
// 添加第一个节点
head = (Node*)malloc(sizeof(Node));
if (head == NULL) {
printf("内存分配失败!\n");
return 1;
}
printf("请输入第一个学生的姓名和成绩:\n");
scanf("%s %d", input, &score);
strcpy(head->name, input);
head->score = score;
head->next = NULL;
// 添加其他节点
printf("请输入其他学生的姓名和成绩,输入 -1 结束:\n");
p = head;
while (1) {
scanf("%s", input);
if (strcmp(input, "-1") == 0) {
break;
}
scanf("%d", &score);
Node* node = (Node*)malloc(sizeof(Node));
if (node == NULL) {
printf("内存分配失败!\n");
return 1;
}
strcpy(node->name, input);
node->score = score;
node->next = NULL;
p->next = node;
p = node;
}
// 遍历链表并输出
printf("学生信息如下:\n");
p = head;
while (p != NULL) {
printf("%s %d\n", p->name, p->score);
p = p->next;
}
// 释放内存
p = head;
while (p != NULL) {
Node* node = p;
p = p->next;
free(node);
}
return 0;
}
```
上面的代码中,我们通过定义一个名为 `Node` 的结构体来表示链表的节点。每个节点包括一个 `name` 字符串和一个 `score` 整数,分别用于存储姓名和成绩。同时,每个节点还包括一个 `next` 指针,用于指向下一个节点。
在主函数中,我们首先创建了一个头节点,并让 `head` 指向它。然后,通过循环读入用户输入的姓名和成绩,并创建新的节点加入链表中。最后,我们遍历整个链表并输出每个节点的姓名和成绩。
注意,在程序结束时,我们需要释放链表中所有节点所占用的内存,否则会造成内存泄漏。
接下来是 C++ 建立一个学生信息链表,每个结点包括:学号、姓名、成绩。
与 C 语言类似,我们可以通过结构体来定义节点的数据结构。不同的是,在 C++ 中,我们可以使用类来封装链表的实现。
下面是一个示例代码:
```cpp
#include <iostream>
#include <string>
using namespace std;
// 定义学生类
class Student {
public:
string id; // 学号
string name; // 姓名
int score; // 成绩
Student* next; // 指向下一个节点的指针
// 构造函数
Student(string i, string n, int s) {
id = i;
name = n;
score = s;
next = NULL;
}
};
int main() {
Student* head = NULL; // 头节点指针
Student* p = NULL; // 用于遍历链表的指针
string id, name; // 用于输入学号和姓名的字符串变量
int score; // 用于输入成绩的整型变量
// 添加第一个节点
cout << "请输入第一个学生的学号、姓名和成绩:" << endl;
cin >> id >> name >> score;
head = new Student(id, name, score);
// 添加其他节点
cout << "请输入其他学生的学号、姓名和成绩,输入 -1 结束:" << endl;
p = head;
while (1) {
cin >> id;
if (id == "-1") {
break;
}
cin >> name >> score;
Student* node = new Student(id, name, score);
p->next = node;
p = node;
}
// 遍历链表并输出
cout << "学生信息如下:" << endl;
p = head;
while (p != NULL) {
cout << p->id << " " << p->name << " " << p->score << endl;
p = p->next;
}
// 释放内存
p = head;
while (p != NULL) {
Student* node = p;
p = p->next;
delete node;
}
return 0;
}
```
上面的代码中,我们定义了一个名为 `Student` 的类来表示链表的节点。每个节点包括一个 `id` 字符串、一个 `name` 字符串和一个 `score` 整数,分别用于存储学号、姓名和成绩。同时,每个节点还包括一个 `next` 指针,用于指向下一个节点。
在主函数中,我们首先创建了一个头节点,并让 `head` 指向它。然后,通过循环读入用户输入的学号、姓名和成绩,并创建新的节点加入链表中。最后,我们遍历整个链表并输出每个节点的学号、姓名和成绩。
与 C 语言不同的是,在程序结束时,我们使用了 `delete` 关键字来释放链表中所有节点所占用的内存。这是因为在 C++ 中,使用 `new` 来动态分配内存时,需要使用 `delete` 来释放内存。否则会造成内存泄漏。
阅读全文