当前位置: 首页 > news >正文

谭浩强C语言程序设计(5) 9章

1、统计三个候选人的票数

#include <cstdio>  // 引入标准输入输出库
#include <cstring> // 引入字符串处理库,用于 strcmp 函数
#define N 10       // 定义一个宏常量 N,表示数组的最大长度// 定义一个结构体 Person,用于存储姓名和计数
struct Person {char name[N]; // 名字字符串int count;    // 计数器,用于记录名字出现的次数
};int main() {// 初始化一个 Person 结构体数组,包含 3 个预设人员Person person[3] = {{"zs", 0}, // 第一个人{"ls", 0}, // 第二个人{"ww", 0}  // 第三个人};// 定义一个二维数组 names,用于存储用户输入的名字char names[N][N];// 从用户输入读取 10 个名字并存储到 names 数组中for (int i = 0; i < N; ++i) {printf("input the name%d:", i + 1); // 提示用户输入第 i 个名字scanf("%s", names[i]);             // 将用户输入的名字存储到 names[i]}// 遍历输入的名字数组,统计每个名字出现的次数for (int i = 0; i < N; ++i) {for (int j = 0; j < 3; ++j) { // 遍历预设的 Person 结构体数组if (strcmp(person[j].name, names[i]) == 0) { // 比较当前名字与预设名字是否相同person[j].count++; // 如果相同,计数器加 1}}}// 输出统计结果printf("result:\n");for (int i = 0; i < 3; ++i) {printf("%s:%d\n", person[i].name, person[i].count); // 输出每个名字及其出现次数}return 0; // 程序正常结束
}

2、从小到大按照成绩输出n个学生的信息

#include <cstdio>  // 引入标准输入输出库
#include <cstring> // 引入字符串处理库
#define M 3        // 定义常量 M,表示学生数量
#define N 10       // 定义常量 N,表示字符数组的最大长度// 定义一个结构体 Student,用于存储学生的信息
struct Student {int id;        // 学生的学号char name[N];  // 学生的姓名float score;   // 学生的成绩
};// 折半插入排序函数,按照学生成绩从大到小排序
void sort(Student student[]) {int low, high, mid; // 定义折半查找的变量Student temp;       // 定义一个临时变量,用于存储当前需要插入的学生信息// 外层循环,从第二个学生开始,逐个进行插入排序for (int i = 1; i < M; ++i) {low = 0;                // 初始化 low 为有序子序列的起始索引high = i - 1;           // 初始化 high 为有序子序列的末尾索引temp = student[i];      // 将当前学生信息存储到临时变量 temp 中// 使用折半查找确定当前学生在有序子序列中的插入位置while (low <= high) {mid = (low + high) / 2; // 计算中间位置索引if (student[mid].score > temp.score) {low = mid + 1;      // 如果中间位置的学生成绩大于当前学生成绩,调整 low} else {high = mid - 1;     // 如果中间位置的学生成绩小于等于当前学生成绩,调整 high}}// 将有序子序列中从插入位置到当前位置的学生向后移动一位,为当前学生腾出空间for (int j = i - 1; j >= low; --j) {student[j + 1] = student[j];}// 将当前学生插入到正确的位置student[low] = temp;}
}int main() {Student student[M]; // 定义一个 Student 类型的数组,用于存储 M 个学生的信息// 从用户输入读取 M 个学生的信息for (int i = 0; i < M; ++i) {printf("input the No.%d student info(id,name,score):\n", i + 1); // 提示用户输入第 i+1 个学生信息scanf("%d %s %f", &student[i].id, student[i].name, &student[i].score); // 读取学生信息并存储到数组中}sort(student); // 调用排序函数,对学生数组进行排序// 输出排序后的结果printf("result:\n");for (int i = 0; i < M; ++i) {printf("%d %s %3.2f\n", student[i].id, student[i].name, student[i].score); // 输出每个学生的学号、姓名和成绩}return 0; // 程序正常结束
}

3、通过指向结构体变量的指针输出结构体变量成员的信息

#include <cstdio>
// 引入C++标准输入输出库,用于使用printf等函数struct Student {int id; // 学生的学号char name[10]; // 学生的姓名,最多9个字符(第10个字符用于存储字符串结束符)float score; // 学生的成绩
};int main() {// 定义一个包含3个学生信息的数组Student student[3] = {{1, "zs", 12},   // 第一个学生:学号1,名字"zs",成绩12{2, "lisi", 90}, // 第二个学生:学号2,名字"lisi",成绩90{3, "ww", 89}    // 第三个学生:学号3,名字"ww",成绩89};// 遍历学生数组for (Student* p = student; p < student + 3; p++) {// 使用指针p遍历数组student,student+3表示数组最后一个元素的下一个位置,作为结束条件// 格式化输出学生信息printf("%d-%s-%3.2f\n", p->id, p->name, p->score);// 格式解释:// %d:输出整数(学生学号)// %s:输出字符串(学生姓名)// %3.2f:输出浮点数,保留两位小数// \n:换行符,用于换行}return 0; // 主函数返回值,表示程序成功结束
}

4、使用结构体变量或者结构体指针作为参数实现下面函数

1、输入N个学生信息,求各学生的平均成绩。

2、求平均分最高的学生的信息。

3、 输出总成绩最高的学生的信息

#include <cstdio>
#define N 3  // 学生数量struct Student {int id;char name[10];float score[3];float average;float total;  //总成绩
};void input(Student* p) {for (int i = 0; i < N; ++i) {float sum = 0;printf("input the No%d's id:\n", i + 1);scanf("%d", &p[i].id);printf("input the No%d's name:\n", i + 1);scanf("%9s", p[i].name); // 限制输入长度为9,避免溢出printf("input the No%d's score:\n", i + 1);for (int j = 0; j < 3; ++j) {scanf("%f", &p[i].score[j]);sum += p[i].score[j];}p[i].total = sum;p[i].average = sum / 3;}
}Student max(Student* p) {Student max_student = p[0];for (int i = 1; i < N; ++i) {if (max_student.average < p[i].average) {max_student = p[i];}}return max_student;
}void print(Student* p){Student max = p[0];for (int i = 0; i < N; ++i) {if (max.total < p[i].total){max = p[i];}}printf("The max student's info:\n");printf("id:%d\n", max.id);printf("name:%s\n", max.name);printf("score: ");for (int i = 0; i < 3; ++i) {printf("%.2f", max.score[i]);if (i < 2) printf(" "); // 添加空格分隔成绩}printf("\naverage:%.2f\n", max.average);printf("\ntotal:%.2f\n", max.total);
}int main() {Student student[N];Student* p = student;input(p);Student s = max(p);printf("the max average student's info:\n");printf("id:%d\n", s.id);printf("name:%s\n", s.name);printf("score: ");for (int i = 0; i < 3; ++i) {printf("%.2f", s.score[i]);if (i < 2) printf(" "); // 添加空格分隔成绩}printf("\naverage:%.2f\n", s.average);printf("\ntotal:%.2f\n", s.total);print(p);return 0;
}

5、创建动态单链表存储N个学生的成绩

#include <cstdio>
#include <cstdlib>
#define N 3// 定义学生结构体
typedef struct Student {int num;                // 学号float score;            // 分数struct Student* next;   // 指向下一个节点的指针(自引用指针)
} Student;/** 初始化带头结点的单链表* 参数:head - 二级指针,用于修改主函数中的头指针* 功能:创建头结点,并使头指针指向该头结点*/
void init(Student** head) {*head = (Student*)malloc(sizeof(Student)); // 为头结点分配内存if (*head == NULL) {                       // 内存分配失败处理printf("内存分配失败");exit(1);                               // 终止程序}(**head).next = NULL;                      // 头结点的next初始化为NULL
}/** 向链表中插入数据(尾插法)* 参数:head - 二级指针,用于获取头结点位置* 功能:创建N个新节点,并将它们依次链接到链表尾部*/
void insert(Student** head) {int n = 0;int num = 0;float score = 0;Student* tail = *head; // tail指针初始指向头结点(此时链表为空)while (n != N) {// 创建新节点并初始化数据Student* newNode = (Student*)malloc(sizeof(Student));if (newNode == NULL) {printf("内存分配失败");exit(1);}printf("input the %d student info:\n", n + 1);printf("num is:\n");scanf("%d", &num);printf("score is:\n");scanf("%f", &score);(*newNode).num = num;(*newNode).score = score;(*newNode).next = NULL;  // 新节点next初始化为NULL// 将新节点链接到链表尾部(*tail).next = newNode;  // 当前尾节点的next指向新节点tail = newNode;          // tail指针移动到新节点(更新尾指针位置)n++;}
}/** 打印链表数据* 参数:head - 链表头指针* 功能:遍历链表并打印每个节点的数据*/
void printList(Student* head) {Student* p = (*head).next; // 跳过头结点,从第一个数据节点开始遍历while (p != NULL) {printf("Num: %d, Score: %.2f\n", (*p).num, (*p).score);p = (*p).next;         // 指针移动到下一个节点}
}int main() {// 初始化单链表Student* head;           // 头指针声明init(&head);             // 传递头指针的地址以初始化链表// 插入数据(N个学生信息)insert(&head);           // 传递头指针的地址以访问头结点// 打印链表printList(head);return 0;
}

1、初始化函数init

  • *head:解引用 head,得到的是主函数中 Student* head 这个指针的值,也就是头结点的地址。
  • **head:再次解引用 *head,得到的是头结点本身(即 Student 结构体)

 6、若干个教师和学生,老师和学生的数据基本相同但是老师有个数据是职务,学生有个数据是班级。使用共同体类型输出教师和学生的信息。

#include <cstdio>
#define N 2struct Person{int num;char name[10];char gender;char job;union Category{int clazz;char position[10];}Category;
}Person[N];int main(){int i ;for (int j = 0; j < N; ++j) {printf("input the %d person's info:\n",j+1);scanf("%d %s %c %c",&Person[j].num,Person[j].name,&Person[j].gender,&Person[j].job);if (Person[j].job == 's'){scanf("%d",&Person[j].Category.clazz);}else if (Person[j].job == 't'){scanf("%s",Person[j].Category.position);} else{puts("error!!!");}}printf("\n");for (int j = 0; j < N; ++j) {if (Person[j].job == 's'){printf("student's info:\n");printf("num:%d name:%s gender:%c job:%c class:%d\n",Person[j].num,Person[j].name,Person[j].gender,Person[j].job,Person[j].Category.clazz);} else if (Person[j].job == 't'){printf("teacher's info:\n");printf("num:%d name:%s gender:%c job:%c prof:%s\n",Person[j].num,Person[j].name,Person[j].gender,Person[j].job,Person[j].Category.position);}}
}

 7、使用结构体计算该日是本年中的第几天

#include <cstdio>// 定义一个结构体 YMD,用于存储年、月、日
struct YMD {int year;  // 年份int month; // 月份int days;  // 日期
};// 用于计算从年初到指定日期的总天数
// 参数通过值传递,确保函数不会修改原始数据
int compute(YMD ymd) {int month = ymd.month - 1;  // 当前月份的前一个月(已完成的完整月份)bool flag = false;          // 用于标记是否为闰年int sum = 0;                // 用于累加总天数// 判断是否为闰年// 闰年的条件:能被4整除但不能被100整除,或者能被400整除if ((ymd.year % 4 == 0 && ymd.year % 100 != 0) || (ymd.year % 400 == 0)) {flag = true; // 如果是闰年,将其标记为 true}// 遍历从 1 月到目标月的前一个月,累加每个月的天数for (int i = 1; i <= month; ++i) {if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12) {// 1、3、5、7、8、10、12 月为大月,有 31 天sum += 31;} else if (i == 2) {// 2 月的天数根据是否为闰年而变化if (flag) {sum += 29; // 闰年时 2 月有 29 天} else {sum += 28; // 平年时 2 月有 28 天}} else {// 4、6、9、11 月为小月,有 30 天sum += 30;}}// 将输入的日期累加到总天数中sum += ymd.days;return sum; // 返回从年初到指定日期的总天数
}int main() {YMD ymd; // 定义一个 YMD 结构体变量// 提示用户输入年份、月份和日期printf("input the year, month, days:\n");// 读取用户输入的年份、月份和日期scanf("%d %d %d", &ymd.year, &ymd.month, &ymd.days);// 调用 compute 函数计算总天数int sum = compute(ymd);// 输出结果printf("%d", sum);return 0; // 程序结束
}

8、使用结构存储N个学生的信息并输出

#include <cstdio>#define N 3struct Student {int num;          // 学生学号char name[10];    // 学生姓名int score[N];     // 学生成绩数组
};void input(Student student[]) {for (int i = 0; i < N; ++i) {printf("input the %d's num, name, and %d scores: ", i + 1, N);scanf("%d %9s", &student[i].num, student[i].name); // 限制姓名长度为 9for (int j = 0; j < N; ++j) {scanf("%d", &student[i].score[j]);}}
}void output(Student student[]) {// 输出表头printf("%10s%10s", "Num", "Name");for (int j = 0; j < N; ++j) {printf("%10s%d", "Score", j + 1);}printf("\n");// 输出学生信息for (int i = 0; i < N; ++i) {printf("%10d%10s", student[i].num, student[i].name);for (int j = 0; j < N; ++j) {printf("%10d", student[i].score[j]);}printf("\n");}
}int main() {Student student[N]; // 局部数组input(student);output(student);// 输出所有学生的学号printf("\n-------\n");for (int i = 0; i < N; ++i) {printf("%d ", student[i].num);}printf("\n");return 0;
}

input 函数能够改变数组的值,是因为 C/C++ 中数组作为函数参数时,实际上传递的是数组的指针,而不是数组的副本。 

9、约瑟夫环问题,13个人数到三的淘汰问最后剩下的是谁,使用链表实现

#include <cstdio>
#include <cstdlib>
#define N 13  // 定义链表中节点的总数为 13struct LNode {int num;               // 节点的编号struct LNode* next;    // 指向下一个节点的指针
};// 单链表的初始化
void init(LNode** head) {*head = (LNode*)malloc(sizeof(LNode));  // 分配头节点的内存if (*head == NULL) {  // 检查内存分配是否成功perror("Failed to allocate memory for head");exit(EXIT_FAILURE);  // 分配失败时退出程序}(*head)->next = NULL;  // 初始化头节点的 next 指针为 NULL
}// 插入 13 个数据并形成循环链表
void input(LNode** head) {LNode* tail = *head;  // 用 tail 指针跟踪链表的尾部for (int j = 1; j <= N; ++j) {  // 循环插入 13 个节点LNode* newNode = (LNode*)malloc(sizeof(LNode));  // 分配新节点的内存if (newNode == NULL) {  // 检查内存分配是否成功perror("Failed to allocate memory for new node");exit(EXIT_FAILURE);  // 分配失败时退出程序}newNode->num = j;  // 设置新节点的编号为 jnewNode->next = NULL;  // 初始化新节点的 next 指针为 NULLtail->next = newNode;  // 将新节点连接到链表尾部tail = newNode;  // 更新 tail 指针到新节点}// 将最后一个节点的 next 指向头节点的下一个节点,形成循环链表tail->next = (*head)->next;
}// 模拟约瑟夫问题
void play(LNode** L) {LNode* p = *L;  // p 指针指向头节点LNode* q = p->next;  // q 指针指向第一个节点int count = 1;  // 报数计数器int leave = N;  // 剩余节点数printf("Deleting node:");  // 打印删除的节点编号while (leave > 1) {  // 当剩余节点数大于 1 时继续循环if (count == 3) {  // 当报数到 3 时LNode* temp = q;  // 保存要删除的节点printf("%d ", temp->num);  // 打印要删除的节点编号p->next = q->next;  // 跳过当前节点free(temp);  // 释放要删除的节点内存q = p->next;  // 更新 q 指针到下一个节点count = 1;  // 重置计数器leave--;  // 减少剩余节点数// 如果只剩一个节点,退出循环if (leave == 1) break;} else {p = p->next;  // p 指针移动到下一个节点q = q->next;  // q 指针移动到下一个节点count++;  // 计数器加 1}}// 最后只剩一个节点时,确保头节点的 next 指针指向该节点(*L)->next = q;
}// 输出最后剩下的人
void output(LNode** head) {LNode* p = (*head)->next;  // p 指针指向最后一个节点if (p != NULL) {  // 如果 p 不为空printf("\nThe last one is: %d\n", p->num);  // 打印最后一个节点的编号} else {printf("Error: No remaining nodes.\n");  // 如果无节点,输出错误信息}
}// 释放链表
void freeList(LNode** head) {if (*head == NULL) return;  // 如果头节点为空,直接返回// 断开头节点与数据节点的连接LNode* dataNode = (*head)->next;(*head)->next = NULL;// 释放循环链表中的所有数据节点while (dataNode) {  // 当还有数据节点时LNode* temp = dataNode;  // 保存当前节点dataNode = dataNode->next;  // 移动到下一个节点free(temp);  // 释放当前节点}// 释放头节点free(*head);*head = NULL;  // 将头指针置为空
}int main() {LNode* L;  // 定义链表头指针init(&L);  // 初始化链表input(&L);  // 插入节点并形成循环链表play(&L);  // 模拟约瑟夫问题output(&L);  // 输出最后剩下的人freeList(&L);  // 释放链表return 0;  // 程序结束
}

 10、AB两个链表每个结点存储的是学生的成绩要求两个链表合并并按照学号升序输出

#include <cstdio>
#include <cstdlib>struct Student {int num;       // 学号int score;     // 成绩struct Student* next;  // 指向下一个节点的指针
};// 初始化两个链表
void init(Student** stuA, Student** stuB) {*stuA = (Student*)malloc(sizeof(Student)); // 分配头节点的内存*stuB = (Student*)malloc(sizeof(Student)); // 分配头节点的内存if (*stuA == NULL || *stuB == NULL) {printf("初始化失败,内存分配错误。\n");exit(EXIT_FAILURE);}(*stuA)->next = NULL; // 初始化头节点的 next 指针为 NULL(*stuB)->next = NULL; // 初始化头节点的 next 指针为 NULL
}// 创建链表
int create(Student** stu) {Student* tail = *stu; // 尾指针,用于跟踪链表的尾部int num = 0, score = 0, n = 0; // 学号、成绩和计数器while (1) {Student* newNode = (Student*)malloc(sizeof(Student)); // 分配新节点的内存if (newNode == NULL) {printf("节点创建失败,内存分配错误。\n");exit(EXIT_FAILURE);}printf("请输入第%d个学生的学号和成绩(输入999结束):\n", n + 1);if (scanf("%d %d", &num, &score) != 2) {printf("输入错误,程序终止。\n");exit(EXIT_FAILURE);}if (num == 999) {free(newNode); // 如果用户输入 999,释放未使用的节点break;}newNode->num = num; // 设置新节点的学号newNode->score = score; // 设置新节点的成绩newNode->next = NULL; // 初始化新节点的 next 指针为 NULLtail->next = newNode; // 将新节点连接到链表尾部tail = newNode; // 更新尾指针到新节点n++; // 计数器加 1}return n; // 返回链表的长度
}// 打印链表
void print(Student** stu) {Student* p = (*stu)->next; // p 指针指向链表的第一个节点printf("链表内容:\n");while (p != NULL) { // 遍历链表printf("学号:%d,成绩:%d\n", p->num, p->score); // 打印当前节点的数据p = p->next; // 移动到下一个节点}
}// 合并两个链表
void concat(Student** stuA, Student** stuB) {Student* pa = (*stuA)->next; // pa 指针指向链表 A 的第一个节点Student* pb = (*stuB)->next; // pb 指针指向链表 B 的第一个节点Student* concatHead = NULL;  // 合并后链表的头指针Student** current = &concatHead;  // 当前插入位置的指针// 合并两个链表while (pa != NULL && pb != NULL) {if (pa->num < pb->num) { // 如果链表 A 的当前节点学号小于链表 B 的当前节点学号*current = pa; // 将链表 A 的当前节点连接到合并后的链表pa = pa->next; // 移动 pa 指针到链表 A 的下一个节点} else {*current = pb; // 将链表 B 的当前节点连接到合并后的链表pb = pb->next; // 移动 pb 指针到链表 B 的下一个节点}current = &((*current)->next); // 更新当前插入位置的指针}// 如果链表 A 或链表 B 中还有剩余节点,将剩余节点连接到合并后的链表*current = (pa != NULL) ? pa : pb;// 更新链表 A 的头指针,使其指向合并后的链表(*stuA)->next = concatHead;
}// 释放链表的内存
void freeList(Student** stu) {Student* p = (*stu)->next; // p 指针指向链表的第一个节点while (p != NULL) { // 遍历链表Student* temp = p; // 保存当前节点p = p->next; // 移动到下一个节点free(temp); // 释放当前节点的内存}free(*stu); // 释放头节点的内存
}int main() {Student* stuA, *stuB; // 定义两个链表的头指针init(&stuA, &stuB); // 初始化链表printf("创建链表 A:\n");int lenA = create(&stuA); // 创建链表 Aprintf("创建链表 B:\n");int lenB = create(&stuB); // 创建链表 Bprintf("合并前链表 A:\n");print(&stuA); // 打印链表 A 的内容printf("合并前链表 B:\n");print(&stuB); // 打印链表 B 的内容concat(&stuA, &stuB); // 合并链表 A 和 Bprintf("合并后链表 A:\n");print(&stuA); // 打印合并后的链表 A// 释放链表的内存freeList(&stuA);freeList(&stuB);return 0; // 程序结束
}
D:\C\code\test\fileA.exe
Creating list A:
Enter the ID and score for student 1 (enter 999 to exit):
1 45
Enter the ID and score for student 2 (enter 999 to exit):
3 45
Enter the ID and score for student 3 (enter 999 to exit):
5 33
Enter the ID and score for student 4 (enter 999 to exit):
7 90
Enter the ID and score for student 5 (enter 999 to exit):
999 999
Creating list B:
Enter the ID and score for student 1 (enter 999 to exit):
2 23
Enter the ID and score for student 2 (enter 999 to exit):
4 11
Enter the ID and score for student 3 (enter 999 to exit):
6 12
Enter the ID and score for student 4 (enter 999 to exit):
999 999
List A before concatenation:
List contents:
ID: 1, Score: 45
ID: 3, Score: 45
ID: 5, Score: 33
ID: 7, Score: 90
List B before concatenation:
List contents:
ID: 2, Score: 23
ID: 4, Score: 11
ID: 6, Score: 12
List A after concatenation:
List contents:
ID: 1, Score: 45
ID: 2, Score: 23
ID: 3, Score: 45
ID: 4, Score: 11
ID: 5, Score: 33
ID: 6, Score: 12
ID: 7, Score: 90

11、ab两个链表,节点中包含学号姓名,从a链表中删除与b链表中相同学号的节点

#include <cstdio>
#include <cstdlib>struct Student {int num;       // 学号int score;     // 成绩struct Student* next;  // 指向下一个节点的指针
};// 初始化两个链表
void init(Student** stuA, Student** stuB) {*stuA = (struct Student*)malloc(sizeof(Student)); // 分配头节点的内存*stuB = (struct Student*)malloc(sizeof(Student)); // 分配头节点的内存if (*stuA == NULL || *stuB == NULL) {printf("初始化失败,内存分配错误。\n");exit(EXIT_FAILURE);}(*stuA)->next = NULL; // 初始化头节点的 next 指针为 NULL(*stuB)->next = NULL; // 初始化头节点的 next 指针为 NULL
}// 创建链表
void create(Student** stu) {Student* tail = *stu; // 尾指针,用于跟踪链表的尾部int num = 0, score = 0, n = 0; // 学号、成绩和计数器while (true) {Student* newNode = (struct Student*)malloc(sizeof(Student)); // 分配新节点的内存if (newNode == NULL) {printf("error。\n");exit(EXIT_FAILURE);}printf("Please enter the student ID and score for the %dth student (Enter 999 to finish):\n", n + 1);if (scanf("%d %d", &num, &score) != 2) {printf("输入错误,程序终止。\n");exit(EXIT_FAILURE);}if (num == 999) {free(newNode); // 如果用户输入 999,释放未使用的节点break;}newNode->num = num; // 设置新节点的学号newNode->score = score; // 设置新节点的成绩newNode->next = NULL; // 初始化新节点的 next 指针为 NULLtail->next = newNode; // 将新节点连接到链表尾部tail = newNode; // 更新尾指针到新节点n++;}
}// 打印链表
void print(Student** stu) {Student* p = (*stu)->next; // p 指针指向链表的第一个节点printf("contents\n");while (p != NULL) { // 遍历链表printf("num:%d,score:%d\n", p->num, p->score); // 打印当前节点的数据p = p->next; // 移动到下一个节点}
}// 删除相同的节点
void del(Student** stuA, Student** stuB) {Student* pa = *stuA;Student* temp;Student* pb = *stuB;while (pb) {pa = *stuA; // 重置pa到链表A的头节点while (pa->next) {if (pa->next->num == pb->num) {temp = pa->next;pa->next = temp->next;free(temp);} else {pa = pa->next;}}pb = pb->next;}
}// 释放链表的内存
void freeList(Student** stu) {Student* p = (*stu)->next; // p 指针指向链表的第一个节点while (p != NULL) { // 遍历链表Student* temp = p; // 保存当前节点p = p->next; // 移动到下一个节点free(temp); // 释放当前节点的内存}free(*stu); // 释放头节点的内存
}int main() {Student* stuA, *stuB; // 定义两个链表的头指针init(&stuA, &stuB); // 初始化链表printf("create A\n");create(&stuA); // 创建链表 Aprintf("create B\n");create(&stuB); // 创建链表 Bdel(&stuA, &stuB); // 在a中删除和b表相同的节点print(&stuA); // 打印合并后的链表 A// 释放链表的内存freeList(&stuA);freeList(&stuB);return 0; // 程序结束
}

相关文章:

谭浩强C语言程序设计(5) 9章

1、统计三个候选人的票数 #include <cstdio> // 引入标准输入输出库 #include <cstring> // 引入字符串处理库&#xff0c;用于 strcmp 函数 #define N 10 // 定义一个宏常量 N&#xff0c;表示数组的最大长度// 定义一个结构体 Person&#xff0c;用于存储…...

Large Language Model Distilling Medication Recommendation Model

摘要&#xff1a;药物推荐是智能医疗系统的一个重要方面&#xff0c;因为它涉及根据患者的特定健康需求开具最合适的药物。不幸的是&#xff0c;目前使用的许多复杂模型往往忽视医疗数据的细微语义&#xff0c;而仅仅严重依赖于标识信息。此外&#xff0c;这些模型在处理首次就…...

STM32F407通过FSMC扩展外部SRAM和NAND FLASH

1 扩展外部SRAM 1.1 地址情况 FSMC控制器的存储区分为4个区(Bank)&#xff0c;每个区256MB。其中&#xff0c;Bank1可以用于连接SRAM、NOR FLASH、PSRAM&#xff0c;还可以连接TFT LCD。Bank1的地址范围是0x60000000&#xff5e;0x6FFFFFFF。Bank1又分为4个子区&#xff0c;每…...

ArcGIS注册开发账号及API KEY

注册与激活 Sign up | ArcGIS Location Platform 填写信息&#xff0c;然后邮箱收到激活邮件&#xff0c;激活&#xff0c;再补充信息。 参考 Tutorial: Create an API key | Documentation | Esri Developer 产生API KEY Tutorial: Create an API key | Documentation |…...

C++-----------酒店客房管理系统

酒店客房管理系统 要求&#xff1a; 1.客房信息管理:包括客房的编号、类型、价格、状态等信息的录入和修改; 2.顾客信息管理:包括顾客的基本信息、预订信息等的管理; 3.客房预订:客户可以根据需要进行客房的预订&#xff0c;系统会自动判断客房的可用情况; 4.入住管理:客户入住…...

AI 编程私有化部署,在使用 cline 时,可能无法避免私隐的泄漏问题

摘录&#xff1a;Cline Privacy Policy https://github.com/cline/cline/blob/main/docs/PRIVACY.md Key Points Cline operates entirely client-side as a VS Code extensionNo code or data is collected, stored, or transmitted to Clines servers 问题是&#xff1a…...

DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解

DeepSeek R1本地部署 DeepSeek Api接口调用 DeepSeek RAG知识库工作流详解全集&#xff1a; 第一部分&#xff1a;Windows本地部署DeepSeek R1 第二部分&#xff1a;Macos本地部署DeepSeek R1 第三部分&#xff1a;Linux本地部署DeepSeek R1 第四部分&#xff1a;DeepSeek …...

2.14学习总结

#include <stdio.h> #include <stdlib.h> #include <math.h>#define MAX_N 32767// 二分查找最接近目标值的元素 int binarySearch(int* arr, int left, int right, int target) {while (left < right) {int mid left (right - left) / 2;if (arr[mid] …...

基于单片机的并联均流电源设计(论文+源码)

2.1 系统的功能及方案设计 两个电源&#xff0c;实现电流均衡效果。 在对系统进行功能设计过程中&#xff0c;主要框图如图2.1所示&#xff0c;系统的控制核心主要是由AT89S52单片机来进行控制&#xff0c;主要的核心控制模块由AT89S52单片机,两路由LM22673构成的DC/DC降压电路…...

Flask使用JWT认证

理解 JWT 认证&#x1f92b; 嘿&#xff0c;朋友们&#xff01;今天我们来聊一些在开发世界中非常酷的事情&#xff0c;那就是 Json Web Token&#xff0c;简称 JWT。这种小巧的规范使得在组织之间传递信息变得如此简单&#xff0c;就像把你的秘密记在一张纸上然后递给朋友一样…...

Reinforcement Learning Heats Up 强化学习持续升温

Reinforcement Learning Heats Up 强化学习持续升温 核心观点&#xff1a;强化学习正成为构建具有高级推理能力大语言模型&#xff08;LLMs&#xff09;的重要途径。 最新进展 模型示例&#xff1a;近期出现了如DeepSeek - R1及其变体&#xff08;DeepSeek - R1 - Zero&#xf…...

一维差分算法篇:高效处理区间加减

那么在正式介绍我们的一维差分的原理前&#xff0c;我们先来看一下一维差分所应用的一个场景&#xff0c;那么假设我们现在有一个区间为[L,R]的一个数组&#xff0c;那么我要在这个数组中的某个子区间比如[i,m] (L<i<m<R)进行一个加k值或者减去k值的一个操作&#xff…...

解决 paddle ocr 遇到 CXXABI_1.3.13 not found 的问题

ImportError: /lib/x86_64-linux-gnu/libstdc.so.6: version CXXABI_1.3.13 not found (required by /home/hum/anaconda3/envs/ipc/lib/python3.11/site-packages/paddle/base/libpaddle.so) 通过命令检查 strings /lib/x86_64-linux-gnu/libstdc.so.6|grep CXXABI 而实际上我…...

DeepSeek助力:打造属于你的GPTs智能AI助手

文章目录 一、环境准备1.安装必要的工具和库2. 选择合适的开发语言 二、核心技术选型1. 选择适合的AI框架 三、功能实现1. 文本生成与对话交互2. 代码生成与自动补全3. 数据分析与报告生成 四、案例实战1. 搭建一个简单的聊天机器人2. 创建一个代码生成器 五、总结与展望1. 当前…...

用pytorch实现一个简单的图片预测类别

前言&#xff1a; 在阅读本文之前&#xff0c;你需要了解Python&#xff0c;Pytorch&#xff0c;神经网络的一些基础知识&#xff0c;比如什么是数据集&#xff0c;什么是张量&#xff0c;什么是神经网络&#xff0c;如何简单使用tensorboard,DataLoader。 本次模型训练使用的是…...

jemalloc 5.3.0的base模块的源码及调用链使用场景的详细分析

一、背景 这篇博客&#xff0c;我们继续之前的 由jemalloc 5.3.0初始化时的内存分配的分析引入jemalloc的三个关键概念及可借鉴的高性能编码技巧-CSDN博客 博客里对初始化分配逻辑进行分析&#xff0c;已经涉及到了jemalloc 5.3.0里的非常重要的base模块的一部分逻辑&#xff…...

Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案

本文是对 Redis 知识的补充&#xff0c;在了解了如何搭建多种类型的 Redis 集群&#xff0c;并清楚了 Redis 集群搭建的过程的原理和注意事项之后&#xff0c;就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。 引言&#xff1a;虽然 Redis 是单线程的&#xf…...

DevOps工具链概述

1. DevOps工具链概述 1.1 DevOps工具链的定义 DevOps工具链是支持DevOps实践的一系列工具的集合&#xff0c;这些工具覆盖了软件开发的整个生命周期&#xff0c;包括需求管理、开发、测试、部署和运维等各个环节。它旨在通过工具的集成和自动化&#xff0c;打破开发与运维之间…...

开启AI绘画的魔法大门!探索Stable Diffusion的无限魅力~

Stable diffusion介绍&#xff1a; “StableDiffusion是一款创新的AI工具&#xff0c;将原始文本转化为精美图像。用户可调整图像的细节、风格、明暗等参数&#xff0c;创建个性化的高质量图像。这款高效的绘图工具便利了建筑、设计和插画等行业的专业人士&#xff0c;满足了他…...

LVS 负载均衡集群(DR 模式)

一、LVS-DR 模式核心原理 1.1. DR 模式工作原理 LVS-DR&#xff08;Direct Routing&#xff09;模式通过 数据链路层&#xff08;MAC 层&#xff09; 实现负载均衡&#xff0c;其核心特点是 请求流量经过 Director&#xff0c;响应流量由 Real Server 直接返回客户端&#xf…...

pnpm的使用

pnpm的使用 1.安装和使用2.统一包管理工具下载依赖 1.安装和使用 pnpm:performant npm &#xff0c;意味“高性能的npm”。 pnpm由npm/yarn衍生而来,解决了npm/yarn内部潜在的bug,极大的优化了性能,扩展了使用场景。被誉为“最先进的包管理工具”。 pnpm安装指令: npm i -g p…...

网页五子棋——通用模块

目录 项目创建 通用功能模块 错误码 自定义异常类 CommonResult jackson 加密工具 项目创建 使用 idea 创建 SpringBoot 项目&#xff0c;并引入相关依赖&#xff1a; 配置 MyBatis&#xff1a; 编辑 application.yml&#xff1a; spring:datasource: # 数据库连接配…...

FastAPI 高并发与性能优化

FastAPI 高并发与性能优化 目录 &#x1f680; 高并发应用设计原则&#x1f9d1;‍&#x1f4bb; 异步 I/O 优化 Web 服务响应速度⏳ 在 FastAPI 中优化异步任务执行顺序&#x1f512; 高并发中的共享资源与线程安全问题 1. &#x1f680; 高并发应用设计原则 在构建高并发应…...

阿里云IOT消息处理

文章主要讲述了阿里云IOT平台如何处理设备上报的消息、如何将消息路由到不同的处理逻辑、如何进行消息转发与转换等操作。 一、接收IOT消息 1.创建订阅 2.案列代码 官网案例代码&#xff1a;如何将AMQP JMS客户端接入物联网平台接收消息_物联网平台(IoT)-阿里云帮助中心 代码…...

缓存三大问题及其解决方案

缓存三大问题及其解决方案 1. 前言 ​ 在现代系统架构中&#xff0c;缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致&#xff0c;通常会给缓存数据设置一个过期时间。当系统接收到用户请求时&#xff0c;首先会访问缓存。如果缓…...

如何在VSCode中免费使用DeepSeek R1:本地大模型编程助手全攻略

目录 一、DeepSeek R1为何值得开发者关注? 1.1 开源的推理王者 1.2 性能实测对比 二、三步搭建本地AI编程环境 2.1 硬件准备指南 2.2 三大部署方案详解 方案一:LM Studio(新手友好) 方案二:Ollama(Docker玩家首选) 方案三:Jan(跨平台利器) 2.3 常见报错解决…...

ECCV2022 | LGV | LGV:利用大几何邻域提升对抗样本的可迁移性

LGV: Boosting Adversarial Example Transferability from Large Geometric Vicinity 摘要-Abstract引言-Introduction实验设置-Experimental SettingsLGV: 源于大几何邻域的迁移性-LGV: Transferability from Large Geometric Vicinity研究LGV特性&#xff1a;损失几何的重要性…...

Git 查看修改记录 二

Git 查看修改记录 二 续接 Git 查看一个文件的修改记录 一 一、修改 A.txt 修改 A.txt number6执行命令 git add . git commit -a -m "修改 number6" # git commit -a -m "修改 number6" 执行 输出如下 # $ git commit -a -m "修改 number6"…...

麒麟操作系统-rabbitmq二进制安装

1、通过官网下载https://www.rabbitmq.com/ 官网网址&#xff1a;https://www.rabbitmq.com 首先下载erlang-23.3.4.11-1.el7.x86_64.rpm&#xff0c;其次下载rabbitmq-server-3.10.0-1.el7.noarch.rpm 2、安装erlang yum install -y erlang-23.3.4.11-1.el7.x86_64.rpm 3、…...

说说平衡树的基本实现,与红黑树的区别是什么

说说平衡树的基本实现&#xff0c;与红黑树的区别是什么 平衡树是一种能够在插入、删除和查找操作中保持平衡的二叉搜索树。其目的是确保树的高度在一定范围内&#xff0c;防止出现极端情况&#xff08;如链表化&#xff09;&#xff0c;以便提高操作效率。常见的平衡树有 AVL …...

uniapp实现首行首列冻结效果

uniapp首行首列冻结 <template><view class"height800 flex-column absolute bgc-withe"><!-- 第一行 --><view class"flex diy-header"><view class"box">时间</view><scroll-view id"1" ena…...

MySQL单表存多大的数据量比较合适

前言 经常使用MySQL数据库的小伙伴都知道&#xff0c;当单表数据量达到一定的规模以后&#xff0c;查询性能就会显著降低。因此&#xff0c;当单表数据量过大时&#xff0c;我们往往要考虑进行分库分表。那么如何计算单表存储多大的数据量合适&#xff1f;当单表数据达到多大的…...

uniapp 使用 鸿蒙开源字体

uniapp vue3 使用 鸿蒙开源字体 我的需求是全局使用鸿蒙字体。 所以&#xff1a; 0. 首先下载鸿蒙字体&#xff1a; 鸿蒙资源 下载后解压&#xff0c;发现里面有几个文件夹&#xff1a; 字体名称说明Sans默认的鸿蒙字体&#xff0c;支持基本的多语言字符&#xff08;包括字…...

SiliconCloud 支持deepseek,送2000w token

SiliconCloud SiliconCloud 邀请奖励持续进行&#xff0c;2000 万 Tokens 送不停&#xff01; 邀请好友赚 2000 万 Tokens&#xff1a;每成功邀请一位新用户通过手机号码注册&#xff0c;您将获得 2000 万 Tokens&#xff1b;注册即送 2000 万 Tokens&#xff1a;受邀好友作为…...

从零开始设计一个完整的网站:HTML、CSS、PHP、MySQL 和 JavaScript 实战教程

前言 本文将从实战角度出发&#xff0c;带你一步步设计一个完整的网站。我们将从 静态网页 开始&#xff0c;然后加入 动态功能&#xff08;使用 PHP&#xff09;&#xff0c;连接 数据库&#xff0c;最后加入 JavaScript 实现交互功能。通过这个教程&#xff0c;你将掌握一个…...

【Python深入浅出㊸】解锁Python3中的TensorFlow:开启深度学习之旅

目录 一、TensorFlow 简介1.1 定义与背景1.2 特点 二、Python 3 与 TensorFlow 的关系2.1 版本对应2.2 为何选择 Python 3 三、安装 TensorFlow3.1 安装步骤3.2 验证安装 四、TensorFlow 基本概念与使用方法4.1 计算图&#xff08;Graph&#xff09;4.2 会话&#xff08;Sessio…...

CMakeLists使用

1.预定义宏 宏 功能 PROJECT_SOURCE_DIR 使用cmake命令后紧跟的目录&#xff0c;一般是工程的根目录 PROJECT_BINARY_DIR 执行cmake命令的目录 CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径…...

P7201 [COCI 2019/2020 #1] Džumbus

题目背景 Marin 是一个心地善良的人,因此他将为他的 N 个朋友组织 Q 次宴会。宴会上唯一的饮料被称为 džumbus。 每位朋友对这种饮料的需求量是已知的。在这些朋友中,有 M 组朋友。每一组中的两位在同时满足他们各自的需求量后,将开始互相核对自己对往届 COCI 题目的答案…...

网络性能测试工具ipref

文章目录 一、ipref的介绍二、iperf安装配置三、iperf使用四、iperf常见故障处理 一、ipref的介绍 ipref是一种常用的网络性能测试工具&#xff0c;用于评估网络带宽、延迟和吞吐量等性能指标。它通过在客户端和服务器之间发送数据流来测量网络的性能&#xff0c;可以帮助管理…...

C# Dictionary的实现原理

在 C# 中&#xff0c;Dictionary<TKey, TValue> 是一个基于哈希表&#xff08;Hash Table&#xff09;实现的键值对集合。它提供了高效的插入、删除和查找操作&#xff0c;平均时间复杂度接近 O(1)。下面是 Dictionary 的核心实现原理&#xff1a; 1. Dictionary 的核心数…...

在项目中操作 MySQL

在现代Web开发中&#xff0c;Node.js因其非阻塞I/O模型和高效的性能成为了构建后端服务的热门选择之一。与此同时&#xff0c;MySQL作为最流行的关系型数据库管理系统之一&#xff0c;凭借其稳定性、可靠性和易用性&#xff0c;在数据存储方面扮演着重要角色。本文将详细介绍如…...

第6章 6.4 ASP.NET Core Web API各种技术及选择

6.4.1 控制器父类用哪个 6.2小节和6.3小节所演示的ASP.NET Core Web API 的控制器类都继承自ControllerBase&#xff0c;而6.1中MVC的控制器继承自Controller&#xff0c;Controller又继承自ControllerBase。 所以&#xff0c;一般情况下&#xff0c;编写的WebAPI控制器类继承…...

DeepSeek本地化部署【window下安装】【linux下安装】

一、window 本地安装指导 1.1、下载window安装包 https://ollama.com/download/OllamaSetup.exe 1.2、点击下载好的安装包进行安装 检测安装是否成功&#xff1a; C:\Users\admin>ollama -v ollama version is 0.5.7有上面的输出&#xff0c;则证明已经安装成功。 配置…...

字玩FontPlayer开发笔记14 Vue3实现多边形工具

目录 字玩FontPlayer开发笔记14 Vue3实现多边形工具笔记整体流程临时变量多边形组件数据结构初始化多边形工具mousedown事件mousemove事件监听mouseup事件渲染控件将多边形转换为平滑的钢笔路径 字玩FontPlayer开发笔记14 Vue3实现多边形工具 字玩FontPlayer是笔者开源的一款字…...

kkFileView二开之pdf转图片接口

kkFileView二开之Pdf转图片接口 1 kkFileView源码下载及编译2 Pdf转图片接口2.1 背景2.2 分析2.2 接口开发2.2.1 编写Pdf转图片方法2.2.2 编写转换接口 2.3 接口测试2.3.1 Pdf文件准备2.3.2 pdf2Image 3 部署 1 kkFileView源码下载及编译 前文 【kkFileView二开之源码编译及部…...

达梦tpcc压测

造数 在这个日志输出中&#xff0c;主要执行了一系列数据库操作&#xff0c;涵盖了数据库信息检查、表的创建与数据加载、索引的添加、数据验证等步骤。具体分析如下&#xff1a; 数据库信息检查&#xff1a; 查询了数据库的版本、实例名称、日志文件大小、字符集等信息。 删…...

计算机毕业设计PySpark+hive招聘推荐系统 职位用户画像推荐系统 招聘数据分析 招聘爬虫 数据仓库 Django Vue.js Hadoop

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

DeepSeek正重构人形机器人和具身大模型赛道!

中国人工智能公司DeepSeek&#xff08;深度求索&#xff09;以“低成本、高效率、强开放”的研发范式横空出世&#xff0c;火遍并震撼全球科技圈&#xff1b;DeepSeek展现出来的核心竞争力&#xff0c;除了低成本及推理能力&#xff0c;更重要的是开源模型能力追赶上了最新的闭…...

第1章 信息化发展(一)

1.1信息与信息化 1.1.1信息基础 1.信息的定义 信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。它以物质介质为载体&#xff0c;传递和反映世界各种事物存在方式、运动状态等的表征。信息不是物质也不是能量&#xff0c;它以一种普遍形式&#xff0c;表达…...

面试经典150题——字典树

文章目录 1、实现 Trie (前缀树)1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、添加与搜索单词 - 数据结构设计2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词搜索 II3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 对于字典树而言&#xff0c;之前做过…...