• C语言 数据结构与算法 I


    C语言-数据结构与算法

    C语言基础

    因为之前写算法都是用C++,也有了些C++基础,变量常量数据类型就跳过去吧。

    首先是环境,学C++时候用Clion,C语言也用它写吧~

    新建项目,选C执行文件,语言标准。。。就先默认C99吧,反正是测试环境,应该问题不大

    image-202308231731119510

    直接运行一手

    image-202308213173157961

    嗯。。JB家的新UI。。真是。。。。。。。一言难尽

    指针

    好像最开始学C++开始,就一直没玩明白指针,毕竟一用数组链表就直接上STL库,也不太用得到指针

    新的学习阶段,从指针开始!

    1

    #include 
    
    int main() {
        int a = 123;
        int * p = &a;
        printf("a:%d\n", a);
        printf("*p:%d\n", *p);
        printf("a的地址:%p\n", &a);
        printf("指针p指向的地址:%p\n", p);
        printf("指针p自身的地址:%p\n", &p);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    image-202308215144721227

    如果你的Clion输出乱码,按照以下顺序配置即可解决:

    文件——设置——编辑器——文件编码,都改成UTF-8

    image-202310825145205006

    然后点击确定,回到代码页面,点击最下方UTF-8,选择GBK

    1

    再点击转换,重新运行即可解决

    image-202302825145348845

    结构体

    使用typedef可以给结构体指定别名

    #include 
    #include 
    typedef struct Book {
        char isbn[50];
        char name[20];
        int price;
    }B;
    
    int main() {
        // 声明
        struct Book b;
        // 初始化
        b.price = 20;
        strcpy(b.name, "笑场");
        // 声明同时初始化
        struct Book a = {"122333123", "冷玚", 45};
        B c = {"122334233123", "乡土中国", 65};
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    属性声明的同时进行变量声明

    struct Book {
        char isbn[50];
        char name[20];
        int price;
    } stu;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    属性声明的同时进行变量声明及初始化

    struct Book {
        char isbn[50];
        char name[20];
        int price;
    } stu = {"1531", "宇宙超度指南", 46};
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果只需要声明一次,可以省略结构体标记

    struct {
        char isbn[50];
        char name[20];
        int price;
    } stu = {"1531", "宇宙超度指南", 46};
    
    • 1
    • 2
    • 3
    • 4
    • 5

    链表

    image-20230906083438591

    链表结构体定义

    typedef struct node {
        int data;
        struct node *next;
    } node;
    
    • 1
    • 2
    • 3
    • 4

    image-20230906090559534

    创建单链表

    node *createList() {
        node *head = (node *) malloc(sizeof(node));
        if (head == NULL) return NULL; // 若内存申请失败,指针会为空(一般情况下不会申请失败)
        head->data = 0;
        head->next = NULL;
        return head;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    头结点:头指针指向的结点

    首元结点:头结点后面的第一个结点

    插入新结点

    image-20230906093917082

    插入新结点的时候要注意,一定先抓住后边的那个结点,再修改前边的那个结点的指针指向。

    (必须时刻有指针指向后边结点的位置,不能让后边的结点丢了😉)

    删除指定位置结点

    node *deleteNode(node *head, int pos) {
        node *currentNode = head;
        // 如果插入位置比链表长,为非法操作。(头结点data存储链表长度)
        if (pos > currentNode->data) return NULL;
        for (int i = 0; i < pos; ++i) {
            currentNode = currentNode->next;
        }
        node *temp = currentNode->next;
        currentNode->next = currentNode->next->next;
        // 释放内存
        free(temp);
        // 链表长度减一
        head->data--;
        return head;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    输出链表

    void printList(node *head) {
        // 跳过头结点数据
        node *currentNode = head->next;
        while (currentNode != NULL) {
            if (currentNode->next == NULL) {
                // 是最后一个结点的话不输出箭头
                printf("%d", currentNode->data);
            } else {
                printf("%d->", currentNode->data);
            }
            currentNode = currentNode->next;
        }
        printf("\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    测试链表相关方法

    #include 
    #include 
    
    typedef struct node {
        int data;
        struct node *next;
    } node;
    
    // 创建单链表
    node *createList() {
        node *head = (node *) malloc(sizeof(node));
        if (head == NULL) return NULL;
        head->data = 0;
        head->next = NULL;
        return head;
    }
    
    // 插入新结点
    node *insertNode(node *head, int data, int pos) {
        node *currentNode = head;
        // 如果插入位置比链表长,为非法操作。(头结点data存储链表长度)
        if (pos > currentNode->data) return NULL;
        for (int i = 0; i < pos; ++i) {
            currentNode = currentNode->next;
        }
        // 新建结点
        node *newNode = (node *) malloc(sizeof(node));
        newNode->data = data;
        // 牵住当前位置下一个结点
        newNode->next = currentNode->next;
        // 牵住当前位置上一个结点
        currentNode->next = newNode;
        // 链表长度加一
        head->data++;
        return head;
    }
    
    // 删除结点
    node *deleteNode(node *head, int pos) {
        node *currentNode = head;
        // 如果插入位置比链表长,为非法操作。(头结点data存储链表长度)
        if (pos > currentNode->data) return NULL;
        for (int i = 0; i < pos; ++i) {
            currentNode = currentNode->next;
        }
        node *temp = currentNode->next;
        currentNode->next = currentNode->next->next;
        // 释放内存
        free(temp);
        // 链表长度减一
        head->data--;
        return head;
    }
    
    // 遍历列表
    void printList(node *head) {
        // 跳过头结点数据
        node *currentNode = head->next;
        while (currentNode != NULL) {
            if (currentNode->next == NULL) {
                // 是最后一个结点的话不输出箭头
                printf("%d", currentNode->data);
            } else {
                printf("%d->", currentNode->data);
            }
            currentNode = currentNode->next;
        }
        printf("\n");
    }
    
    int main() {
        node *l = createList();
        insertNode(l, 1, 0);
        insertNode(l, 2, 1);
        insertNode(l, 3, 0);
        printList(l);
        deleteNode(l, 1);
        printList(l);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80

    image-20230906110134438

  • 相关阅读:
    快手视频批量下载.py(10月可以用)
    实现JavaScript对象迭代(iterator)功能
    Gradle中的DSL,Groovy & Kotlin 引用arr库新写法
    【STM32】【HAL库】【实用制作】数控收音机(软件设计)
    vue指令(代码部分二)
    vue3中组件没有被调用,没进去也没报错
    微信小程序,下载流文件并打开预览
    【MySQL】MySQL操作库
    命令行 PDF 转换器:::fCoder 2PDF
    KY12 玛雅人的密码
  • 原文地址:https://blog.csdn.net/qq_46039856/article/details/132718334