吉首大学--23级题目讲解

news/2024/9/22 2:23:01/

7-1 单链表基本操作

在 C/C++ 中,.(点)和 ->(箭头)运算符用于访问结构体或类的成员,但它们的使用场景不同。

1. . 运算符

  • . 运算符用于访问结构体或类的成员,通过对象或结构体变量直接访问。

2. -> 运算符

  • -> 运算符用于访问指向结构体或类的指针的成员。它简化了通过指针访问成员的过程。
示例:
struct Point {int x,y;
};Point p;         // 创建结构体变量 p
p.x = 10;       // 使用 . 访问成员 x
p.y = 20;       // 使用 . 访问成员 y
cout << "Point: (" << p.x << ", " << p.y << ")" << endl;  // 输出: Point: (10, 20)Point* p1 = (Point*)malloc(sizeof(Point)); // 创建一个指向 Point 的指针
//Point* pPtr = new Point;  C++可以这么写
p1->x = 10;             // 使用 -> 访问成员 x
p1->y = 20;             // 使用 -> 访问成员 y
cout << "Point: (" << p1->x << ", " << p1->y << ")" << endl;  // 输出: Point: (10, 20)
free(p1);				// 释放内存
//delete p1;            C++可以这么写

3. 区分 &*

  • & 运算符

    • 主要用于获取变量的地址(取地址运算符)。
    • 例如:int* p = &a; 表示将变量 a 的地址赋给指针 p
  • * 运算符

    • 主要用于指针的声明和解引用(取值运算符)。
    • 在声明中,int* p 表示 p 是一个指向 int 类型的指针。
    • 在解引用时,*p 表示访问指针 p 所指向的内存地址中的值。
示例:
int a = 10;
int* p = &a;  // & 用于获取 a 的地址
cout << *p;   // * 用于解引用,输出 10
#include<bits/stdc++.h>
using namespace std;// 定义节点结构体,包含一个整数和一个指向下一个节点的指针
struct node {int w;                 // 节点中存储的整数值struct node *next;     // 指向下一个节点的指针
};typedef struct node Node;  // 为结构体 node 定义别名 NodeNode* head;               // 链表的头节点指针
Node* back;               // 链表的尾节点指针,用于快速在链表尾部插入
int len = 0;              // 链表的长度,动态记录节点数量// 初始化链表,创建一个空的头节点
void ini() {head = (Node* )malloc(sizeof(Node));  // 分配内存给头节点back = head;                          // 初始化 back 指向头节点head->next = NULL;                    // 头节点的 next 设为 NULL,表明链表为空
}// 根据位置 k 查找第 k 个节点
Node* find(int k) {Node* temp = head;                    // 从头节点开始遍历for (int i = 1; i <= k; i++) {        // 移动到第 k 个节点temp = temp->next;}return temp;                          // 返回第 k 个节点的指针
}// 在节点 k 之后插入一个新节点,节点值为 x
void insert(Node* k, int x) {Node* temp = (Node* )malloc(sizeof(Node));  // 分配新节点的内存temp->w = x;                                // 将值 x 存入新节点temp->next = k->next;                       // 新节点的 next 指向 k 的下一个节点k->next = temp;                             // 将 k 的 next 指向新节点if (k == back) back = temp;                 // 如果插入的是最后一个节点,更新 back
}// 删除节点 k 的下一个节点
void deleteNode(Node* k) {Node* temp = k->next;                // 暂存要删除的节点k->next = k->next->next;             // 跳过被删除的节点,直接链接到下一个节点free(temp);                          // 释放被删除节点的内存
}int main() {int n;cin >> n;                            // 读取初始链表长度 nini();                               // 初始化链表for (int i = 1; i <= n; i++) {int x;cin >> x;                        // 读取每个节点的值insert(back, x);                 // 在链表尾部插入节点len++;                           // 更新链表长度}int m;cin >> m;                            // 读取操作次数 mwhile (m--) {int op;cin >> op;                       // 读取操作类型if (op == 0) {                   // 插入操作int k, d;cin >> k >> d;               // 读取插入位置 k 和插入的值 dif (k <= 0 || k > len) continue;  // 边界条件检查,跳过非法位置insert(find(k), d);          // 在第 k 个节点之后插入值为 d 的新节点len++;                       // 更新链表长度} else {                         // 删除操作int k;cin >> k;                    // 读取删除位置 kif (k <= 0 || k > len) continue;  // 边界条件检查,跳过非法位置deleteNode(find(k - 1));     // 删除第 k 个节点len--;                       // 更新链表长度}}// 打印并释放链表中所有节点的内存while (head->next != NULL) {cout << head->next->w << " ";    // 打印当前节点的值Node* temp = head->next;         // 暂存当前节点的指针head->next = head->next->next;   // 跳过当前节点,指向下一个节点free(temp);                      // 释放当前节点的内存}return 0;
}

单链表——单链表的定义及基本操作(初始化、头插法尾插法建表、查找、插入、删除、判空等)_带头结点的单链表的元素的创建、查找、插入、删除等基本操作-CSDN博客

7-2矩阵运算

#include<bits/stdc++.h>
using namespace std;
bool check(int i,int j,int n){if(i+j==n+1) return 0;//副对角线if(j==n||i==n) return 0;//最后一列 最后一行return 1;
}
int main(){int n,ans=0;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int x;cin>>x;if(check(i,j,n)){ans+=x;}}}cout<<ans<<endl;return 0;
}

7-3 删除重复字符

注意!输入空格!!!

#include<bits/stdc++.h>
using namespace std;
int main(){vector<char> v;set<char> s;char c;while((c=getchar())!='\n'){if(!s.count(c)){//查看原集合中是否存在,即之前是否出现过s.insert(c);v.push_back(c);}}sort(v.begin(),v.end());//排序for(char i:v){cout<<i;}cout<<endl;return 0;
}

字符不会超过128(ASCII码),开桶

#include<bits/stdc++.h>
using namespace std;
int tong[200];
int main(){char c;memset(tong,0,sizeof(tong));while((c=getchar())!='\n'){tong[(int)c]++;}for(int i=0;i<128;i++){if(tong[i]){cout<<(char)(i);}}return 0;
}

C++常用STL

  1. vector 动态数组
  2. stack
  3. queue 队列
  4. deque 双端队列
  5. priority_queue 优先队列
  6. map 映射(键值对)
  7. set 集合

C++ STL详解超全总结(快速入门STL)-CSDN博客

7-4 统计字符出现次数

ASCII(American Standard Code for Information Interchange)码表是用于表示文本字符的标准编码系统。它为每个字符分配了一个唯一的整数值,以便计算机能够在不同设备之间交换文本数据。ASCII码表最初设计用于表示英文字符,但后来扩展了其他符号。

ASCII码表

一共有128个字符,开桶即可。

#include<bits/stdc++.h>
using namespace std;
int cnt[200];
int main(){char c;while((c=getchar())!='\n'){cnt[(int)c]++;}c=getchar();//小心空格,再次提醒cout<<cnt[(int)c]<<endl;return 0;
}

补录

    //getchar() 返回的是读取的字符的 ASCII 值while((c=getchar())!='\n'){cnt[(int)c]++;}//这样写是可以的while(scanf("%c", &c) && c != '\n') {cnt[(int)c]++;}//scanf("%c", &c) 返回的是读取成功的项数,而不是读取的字符值,因此直接将它与 '\n' 进行比较是错误的//故这样写是错误的ERROR//scanf和printf本身也是一个函数,可以自己去了解while(scanf("%c", &c) != '\n') {}
}

http://www.ppmy.cn/news/1528654.html

相关文章

嵌入式Linux学习笔记(6)-线程处理、线程同步、线程池(c语言实现)

一、概述 线程是一种轻量级的并发执行的机制。线程是进程中的一个实体&#xff0c;它执行在同一进程的上下文中&#xff0c;共享同一内存空间&#xff0c;但拥有独立的栈空间。 C语言的线程使用pthread库实现&#xff0c;通过包含头文件 pthread.h 来使用相关的函数和数据类型 …

Bugku---密码学---乐谱密码

题目出处&#xff1a;首页 - Bugku CTF ✨打开后发现是一张乐符图 ✨一般我们所熟悉的「Do Re Mi Fa Sol La Si」&#xff0c;若写成音名&#xff0c;即是「C D E F G A B」。不过德国人习惯使用的音名则是「C D E F G A H」&#xff0c;「B」代表 音名B♭ 。 C也就是后面的4&…

❤Node09-用户信息token认证

❤Node09-用户信息token认证​ 1、安装​ jsonwebtoken 比较官方的称呼为JSON Web Token&#xff08;JWT&#xff09;,一种开放标准&#xff08;RFC 7519&#xff09;,就类似砸门认知的w3c&#xff0c;主要就是更安全地传输信息。利用数字签名验证数据的完整性和身份。 所以J…

windows安装docker、elasticsearch、kibana、cerebro、logstash

文章目录 1. 安装docker1.1. 两大要点1.1.1. 安装启用hyper-v电脑不存在hyper-v的情况 1.1.2. 下载安装docker 2. 在docker里面安装elasticSearch&#xff0c;kibana&#xff0c;cerebro3. 安装logstash-将数据导入到elasticSearch3.1 安装logstash3.1.1 注意事项3.1.1.1. 等了…

基于Prometheus和Grafana的现代服务器监控体系构建

引言 随着云计算、微服务架构和容器化技术的普及&#xff0c;服务器的监控需求变得越来越复杂。现代企业不仅需要监控传统的物理服务器和虚拟机&#xff0c;还需要实时监控动态环境中的容器、微服务和分布式系统。针对这种复杂的IT环境&#xff0c;传统的监控工具往往不再适用&…

掌握 JavaScript 中的函数表达式

函数表达式是 javascript 中定义函数的一种方式。与函数声明不同&#xff0c;函数表达式可以是匿名的&#xff0c;并且通常用于将函数视为值的情况。在本文中&#xff0c;我们将探讨函数表达式、如何将函数视为值、回调函数以及函数表达式和函数声明之间的差异。 函数表达式 …

STS相关的英文缩写

3DES Triple DES (see also DES); Data Encryption Standard applied 3 times 应用3次数据加密 标准AES Advanced Encryption Standard 高级机密标准AMR Automatic Meter Reading 自动抄表APDU Application Protocol Data Unit 应用协议数据单元ASN Abstract Syntax Notation 抽…

JVM 调优篇7 调优案例4- 线程溢出

一 线程溢出 1.1 报错信息 每个 Java 线程都需要占用一定的内存空间&#xff0c;当 JVM 向底层操作系统请求创建一个新的 native 线程时&#xff0c;如果没有足够的资源分配就会报此类错误。报错信息&#xff1a;java.lang.outofmemoryError:unable to create new Native Thr…