1. C语言基础入门
1.1 数据类型与变量
C语言中的数据类型包括整型、浮点型、字符型等。变量是存储数据的容器,通过声明变量来使用它们。
#include <stdio.h>
int main() {
int a = 10;
float b = 3.14;
char c = 'A';
printf("整型变量a的值是:%d\n", a);
printf("浮点型变量b的值是:%f\n", b);
printf("字符型变量c的值是:%c\n", c);
return 0;
}
1.2 运算符与表达式
C语言中的运算符包括算术运算符、关系运算符、逻辑运算符等。表达式是由运算符和操作数组成的式子。
#include <stdio.h>
int main() {
int a = 5, b = 3;
printf("a + b = %d\n", a + b);
printf("a - b = %d\n", a - b);
printf("a * b = %d\n", a * b);
printf("a / b = %d\n", a / b);
printf("a % b = %d\n", a % b);
return 0;
}
2. 控制结构
2.1 顺序结构
顺序结构是按照程序语句的先后顺序执行。
#include <stdio.h>
int main() {
int a = 10;
printf("a的值是:%d\n", a);
a = a + 5;
printf("a的值变为:%d\n", a);
return 0;
}
2.2 选择结构
选择结构根据条件判断执行不同的语句。
#include <stdio.h>
int main() {
int a = 10;
if (a > 5) {
printf("a大于5\n");
} else {
printf("a不大于5\n");
}
return 0;
}
2.3 循环结构
循环结构用于重复执行一段代码。
#include <stdio.h>
int main() {
int i;
for (i = 1; i <= 5; i++) {
printf("i的值是:%d\n", i);
}
return 0;
}
3. 函数
3.1 函数定义与调用
函数是C语言中的基本模块,用于实现代码的复用。
#include <stdio.h>
void printMessage() {
printf("这是一个函数\n");
}
int main() {
printMessage();
return 0;
}
3.2 参数传递与返回值
函数可以通过参数传递数据,并返回计算结果。
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 4);
printf("结果是:%d\n", result);
return 0;
}
4. 数组
4.1 一维数组
一维数组用于存储一组具有相同数据类型的元素。
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("arr[%d]的值是:%d\n", i, arr[i]);
}
return 0;
}
4.2 二维数组
二维数组用于存储具有多行多列的元素。
#include <stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("arr[%d][%d]的值是:%d\n", i, j, arr[i][j]);
}
}
return 0;
}
5. 指针
5.1 指针定义与使用
指针是存储变量地址的变量,用于实现数据的间接访问。
#include <stdio.h>
int main() {
int a = 10;
int *ptr = &a;
printf("a的值是:%d\n", a);
printf("ptr指向的地址是:%p\n", (void *)ptr);
printf("ptr指向的值是:%d\n", *ptr);
return 0;
}
5.2 指针数组与函数指针
指针数组用于存储多个指针,函数指针用于指向函数。
#include <stdio.h>
void printMessage() {
printf("这是一个函数\n");
}
int main() {
void (*funcPtr)(void) = printMessage;
funcPtr();
return 0;
}
6. 结构体与联合体
6.1 结构体
结构体用于将不同数据类型的变量组合成一个整体。
#include <stdio.h>
struct Student {
char name[50];
int age;
float score;
};
int main() {
struct Student stu;
strcpy(stu.name, "张三");
stu.age = 20;
stu.score = 90.5;
printf("姓名:%s\n", stu.name);
printf("年龄:%d\n", stu.age);
printf("成绩:%f\n", stu.score);
return 0;
}
6.2 联合体
联合体用于存储多个数据类型,但同一时间只能存储其中一个数据类型。
#include <stdio.h>
union Data {
int i;
float f;
char c[4];
};
int main() {
union Data u;
u.i = 10;
printf("整型值:%d\n", u.i);
u.f = 3.14;
printf("浮点型值:%f\n", u.f);
printf("字符型值:%s\n", u.c);
return 0;
}
7. 文件操作
7.1 文件打开与关闭
文件操作包括文件的打开、读取、写入和关闭。
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "w");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
fprintf(fp, "这是一个示例文件\n");
fclose(fp);
return 0;
}
7.2 文件读取与写入
文件读取与写入可以使用fscanf、fprintf、fgets、fputs等函数实现。
#include <stdio.h>
int main() {
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("文件打开失败\n");
return 1;
}
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp)) {
printf("%s", buffer);
}
fclose(fp);
return 0;
}
8. 动态内存分配
8.1 动态内存分配与释放
动态内存分配可以使用malloc、calloc、realloc等函数实现。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr = (int *)malloc(5 * sizeof(int));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 5; i++) {
arr[i] = i + 1;
}
for (int i = 0; i < 5; i++) {
printf("arr[%d]的值是:%d\n", i, arr[i]);
}
free(arr);
return 0;
}
8.2 内存拷贝与释放
内存拷贝可以使用memcpy、memmove等函数实现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int *src = (int *)malloc(5 * sizeof(int));
int *dest = (int *)malloc(5 * sizeof(int));
if (src == NULL || dest == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 5; i++) {
src[i] = i + 1;
}
memcpy(dest, src, 5 * sizeof(int));
for (int i = 0; i < 5; i++) {
printf("dest[%d]的值是:%d\n", i, dest[i]);
}
free(src);
free(dest);
return 0;
}
9. 链表
9.1 单链表
单链表是一种常见的线性数据结构,由多个节点组成,每个节点包含数据和指向下一个节点的指针。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node *createList(int arr[], int size) {
Node *head = NULL, *tail = NULL;
for (int i = 0; i < size; i++) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
return head;
}
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
void freeList(Node *head) {
Node *current = head;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
Node *head = createList(arr, size);
printList(head);
freeList(head);
return 0;
}
9.2 双链表
双链表是单链表的扩展,每个节点包含数据和指向前后节点的指针。
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *prev;
struct Node *next;
} Node;
Node *createList(int arr[], int size) {
Node *head = NULL, *tail = NULL;
for (int i = 0; i < size; i++) {
Node *newNode = (Node *)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->prev = NULL;
newNode->next = NULL;
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
newNode->prev = tail;
tail = newNode;
}
}
return head;
}
void printList(Node *head) {
Node *current = head;
while (current != NULL) {
printf("%d ", current->data);
current = current->next;
}
printf("\n");
}
void freeList(Node *head) {
Node *current = head;
while (current != NULL) {
Node *temp = current;
current = current->next;
free(temp);
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
Node *head = createList(arr, size);
printList(head);
freeList(head);
return 0;
}
10. 栈与队列
10.1 栈
栈是一种后进先出(LIFO)的数据结构,可以使用数组或链表实现。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct Stack {
int data[MAX_SIZE];
int top;
} Stack;
void initStack(Stack *s) {
s->top = -1;
}
int isEmpty(Stack *s) {
return s->top == -1;
}
int isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
void push(Stack *s, int value) {
if (isFull(s)) {
printf("栈已满\n");
return;
}
s->data[++s->top] = value;
}
int pop(Stack *s) {
if (isEmpty(s)) {
printf("栈已空\n");
return -1;
}
return s->data[s->top--];
}
int main() {
Stack s;
initStack(&s);
push(&s, 1);
push(&s, 2);
push(&s, 3);
printf("栈顶元素:%d\n", pop(&s));
printf("栈顶元素:%d\n", pop(&s));
printf("栈顶元素:%d\n", pop(&s));
return 0;
}
10.2 队列
队列是一种先进先出(FIFO)的数据结构,可以使用数组或链表实现。
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct Queue {
int data[MAX_SIZE];
int front;
int rear;
} Queue;
void initQueue(Queue *q) {
q->front = q->rear = -1;
}
int isEmpty(Queue *q) {
return q->front == -1;
}
int isFull(Queue *q) {
return (q->rear + 1) % MAX_SIZE == q->front;
}
void enqueue(Queue *q, int value) {
if (isFull(q)) {
printf("队列已满\n");
return;
}
if (isEmpty(q)) {
q->front = q->rear = 0;
} else {
q->rear = (q->rear + 1) % MAX_SIZE;
}
q->data[q->rear] = value;
}
int dequeue(Queue *q) {
if (isEmpty(q)) {
printf("队列已空\n");
return -1;
}
int value = q->data[q->front];
if (q->front == q->rear) {
q->front = q->rear = -1;
} else {
q->front = (q->front + 1) % MAX_SIZE;
}
return value;
}
int main() {
Queue q;
initQueue(&q);
enqueue(&q, 1);
enqueue(&q, 2);
enqueue(&q, 3);
printf("队列头元素:%d\n", dequeue(&q));
printf("队列头元素:%d\n", dequeue(&q));
printf("队列头元素:%d\n", dequeue(&q));
return 0;
}
11. 树与图
11.1 树
树是一种非线性数据结构,由节点组成,每个节点包含数据和指向子节点的指针。
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode *createNode(int value) {
TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
node->data = value;
node->left = NULL;
node->right = NULL;
return node;
}
void insertNode(TreeNode *root, int value) {
if (root == NULL) {
root = createNode(value);
} else if (value < root->data) {
insertNode(root->left, value);
} else {
insertNode(root->right, value);
}
}
void inorderTraversal(TreeNode *root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
}
void freeTree(TreeNode *root) {
if (root != NULL) {
freeTree(root->left);
freeTree(root->right);
free(root);
}
}
int main() {
TreeNode *root = NULL;
insertNode(root, 5);
insertNode(root, 3);
insertNode(root, 7);
insertNode(root, 2);
insertNode(root, 4);
insertNode(root, 6);
insertNode(root, 8);
printf("中序遍历结果:");
inorderTraversal(root);
printf("\n");
freeTree(root);
return 0;
}
11.2 图
图是一种非线性数据结构,由节点和边组成,节点表示实体,边表示实体之间的关系。
”`c
#include
#define MAX_SIZE 100
typedef struct Graph {
int numVertices;
int **adjMatrix;
} Graph;
Graph *createGraph(int numVertices) {
Graph *graph = (Graph *)malloc(sizeof(Graph));
graph->numVertices = numVertices;
graph->adjMatrix = (int **)malloc(numVertices * sizeof(int *));
for (int i = 0; i < numVertices; i++) {
graph->adjMatrix[i] = (int *)malloc(numVertices * sizeof(int));
for (int j = 0; j < numVertices; j++) {
graph->adjMatrix[i][j] = 0;
}
}
return graph;
}
void addEdge(Graph *graph, int src, int dest) {
graph->adjMatrix[src][dest] = 1;
graph->adjMatrix[dest][src] = 1;
}
void freeGraph(Graph *graph) {
for (int i = 0; i < graph->numVertices; i++) {
free(graph->adjMatrix[i]);
}
free(graph->adjMatrix);
free(graph);
}
int main() {
int numVertices = 4;
Graph *graph = createGraph(numVertices);
addEdge(graph, 0, 1);
addEdge(graph, 0, 2);
addEdge(graph, 1, 2);
addEdge(graph, 2, 3);
printf("邻接矩阵:\n");
for (int i = 0; i < numVertices; i++) {
for
