C语言 数据结构与算法 I

C语言-数据结构与算法

C语言基础

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

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

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

C语言 数据结构与算法 I_第1张图片

直接运行一手

C语言 数据结构与算法 I_第2张图片

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

指针

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

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

C语言 数据结构与算法 I_第3张图片

#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;
}

C语言 数据结构与算法 I_第4张图片

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

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

C语言 数据结构与算法 I_第5张图片

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

C语言 数据结构与算法 I_第6张图片

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

C语言 数据结构与算法 I_第7张图片

结构体

使用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;
}

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

struct Book {
    char isbn[50];
    char name[20];
    int price;
} stu;

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

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

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

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

链表

image-20230906083438591

链表结构体定义

typedef struct node {
    int data;
    struct node *next;
} node;

C语言 数据结构与算法 I_第8张图片

创建单链表

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

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

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

插入新结点

C语言 数据结构与算法 I_第9张图片

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

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

删除指定位置结点

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");
}

测试链表相关方法

#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;
}

C语言 数据结构与算法 I_第10张图片

你可能感兴趣的:(C语言数据结构与算法,考研,c语言,开发语言,数据结构)