大连专业模板网站制作,广告品牌设计机构网站织梦模板,做木材加工的企业网站首页,wordpress添加跳转页面C语言-数据结构与算法
C语言基础
因为之前写算法都是用C#xff0c;也有了些C基础#xff0c;变量常量数据类型就跳过去吧。
首先是环境#xff0c;学C时候用Clion#xff0c;C语言也用它写吧~
新建项目#xff0c;选C执行文件#xff0c;语言标准。。。就先默认C99吧…C语言-数据结构与算法
C语言基础
因为之前写算法都是用C也有了些C基础变量常量数据类型就跳过去吧。
首先是环境学C时候用ClionC语言也用它写吧~
新建项目选C执行文件语言标准。。。就先默认C99吧反正是测试环境应该问题不大 直接运行一手 嗯。。JB家的新UI。。真是。。。。。。。一言难尽
指针
好像最开始学C开始就一直没玩明白指针毕竟一用数组链表就直接上STL库也不太用得到指针
新的学习阶段从指针开始 #include stdio.hint 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;
}如果你的Clion输出乱码按照以下顺序配置即可解决
文件——设置——编辑器——文件编码都改成UTF-8 然后点击确定回到代码页面点击最下方UTF-8选择GBK 再点击转换重新运行即可解决 结构体
使用typedef可以给结构体指定别名
#include stdio.h
#include string.h
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};链表 链表结构体定义
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 *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 stdio.h
#include stdlib.htypedef 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;
}