IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 某小卡拉米第一次尝试:C语言链表 -> 正文阅读

[数据结构与算法]某小卡拉米第一次尝试:C语言链表

第一次写博客哎

感觉非常的激动

然后

就没有然后了

哎,貌似解决了链表基础的操作

终究

又要踏上数据结构的征程了~

过来人给我端几碗上等的鸡汤给我灌灌吧

心累

#include<stdio.h>
#include<stdlib.h>

typedef struct Note {
?? ?int number;
?? ?struct Note* next;
}note;

void scanfList(note** head) {//二级指针接受表头的地址
?? ?int value;
?? ?do {
?? ??? ?scanf("%d", &value);
?? ??? ?if (value) {
?? ??? ??? ?note* p = (note*)malloc(sizeof(note));//为新节点创建空间
?? ??? ??? ?p->number = value;//向新节点的空间赋值
?? ??? ??? ?p->next = NULL;//尾指针置空
?? ??? ??? ?note* last = *head;//创建一个新的指针的指向表头
?? ??? ??? ?if (last) {//如果表头不是空的时候执行下面都的操作
?? ??? ??? ??? ?while (last->next) {//下一个节点直到遇到尾指针
?? ??? ??? ??? ??? ?last = last->next;
?? ??? ??? ??? ?}last->next = p;//把创建的新的节点的指针置空变为尾指针
?? ??? ??? ?}
?? ??? ??? ?else?
?? ??? ??? ??? ?*head = p;//如果表头为空的话将地址赋值给头指针以此给表头分配空间
?? ??? ?}
?? ?} while (value);

}


void Delete(note** head, int notedate) {
?? ?note* p = *head, * pr = *head;
?? ?if (head) {//如果表头不为空

?? ??? ?while (p->number != notedate && p->next) {//未找到目标节点的值事且目标节点不是尾节点
?? ??? ??? ?pr = p;//保留当前节点的地址
?? ??? ??? ?p = p->next;//指向下个节点
?? ??? ?}
?? ??? ?if (notedate == p->number) {//找到目标节点
?? ??? ??? ?if (p == *head) //如果目标节点是头节点的话就直接将头节点指向下一个节点
?? ??? ??? ??? ?*head = p->next;
?? ??? ??? ?else //如果不是头节点则将奇拿一个节点的地址指向当前节点的下一个节点即下一个节点
?? ??? ??? ??? ?pr->next = p->next;//如果是尾节点的话就将上一个节点的next 指向NULL成为尾节点
?? ??? ??? ?free(p);//如论怎样都要释放目标节点的空间
?? ??? ?}
?? ??? ?else?
?? ??? ??? ?printf("未找到目标结点!\n");
?? ?}
?? ?else
?? ?{
?? ??? ?printf("链表为空,退出程序!\n");
?? ??? ?exit(0);
?? ?}
}

?? ?void insert(note **head, int notedate) {
?? ??? ?note* p = *head, * tmp = NULL;
?? ??? ?note* pr = (note*)malloc(sizeof(note));
?? ??? ?if (pr == NULL) {?
?? ??? ??? ?printf("你的内存不足!\n");
?? ??? ??? ?exit(0);
?? ??? ?}

?? ??? ?pr->number = notedate;
?? ??? ?pr->next = NULL;
?? ??? ?if (*head == NULL) //如果链表为空链表就开辟将此节点设置为表头
?? ??? ??? ?*head = pr;
?? ??? ?else {
?? ??? ??? ?while (p->number < notedate && p->next) {
?? ??? ??? ??? ?tmp = p;
?? ??? ??? ??? ?p = p->next;
?? ??? ??? ?}
?? ??? ??? ?if (p->number > notedate) {
?? ??? ??? ??? ?if (p == *head) {
?? ??? ??? ??? ??? ?pr->next = *head;
?? ??? ??? ??? ??? ?*head = pr;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else{
?? ??? ??? ??? ??? ?pr->next = p;//将新分配节点的地址尾指针next指向目标位置的下一个节点
?? ? ? ??? ??? ??? ?tmp->next = pr;//将目标位置的前一个节点的尾指针指向新节点?? ??? ?
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?else?
?? ??? ??? ??? ?p->next = pr;//如果没有找到目标位置的节点就在链尾添加新节点?? ?
?? ??? ?}
?? ?}

?? ?int main(void) {

?? ??? ?note* head = NULL;//创建一个结构体的指针作为链表头指针
?? ??? ?printf("请顺序输入的链表的每个节点对应的值以0结束:\n");
?? ??? ?scanfList(&head);//传要建立的链表的地址即表头的地址
?? ??? ?
?? ??? ?//note *p定义新指针指向表头
?? ??? ?int count = 0;//统计节点的数量
?? ??? ?for (note *p=head; p; p = p->next) {//常规的遍历链表的循环方式
?? ??? ??? ?count++;
?? ??? ??? ?printf("第%d个节点的值是: %d\n ", count, p->number);
?? ??? ?}

?? ??? ?//删除节点
?? ??? ?printf("请输入需要删除的节点对应的值:\n");
?? ??? ?int notedate, count1 = 0;
?? ??? ?scanf("%d", &notedate);
?? ??? ?Delete(&head, notedate);//直接修改链表节点的值就传表头的地址
?? ??? ?for (note* p = head; p; p = p->next) {
?? ??? ??? ?count1++;
?? ??? ??? ?printf("第%d个节点的值是: %d\n", count1, p->number);
?? ??? ?}

?? ??? ?//新节点的插入
?? ??? ?printf("请输入你想插入节点数值的大小关系:\n");
?? ??? ?int notedate1,count2=0;
?? ??? ?scanf("%d", &notedate1);
?? ??? ?insert(&head, notedate1);
?? ??? ?for (note* p = head; p; p = p->next) {
?? ??? ??? ?count2++;
?? ??? ??? ?printf("第%d个节点的值是: %d\n", count2, p->number);
?? ??? ?}

?? ??? ?//链表的释放
?? ??? ?for (; head; head = head->next)
?? ??? ??? ?free(head);

?? ??? ?return 0;
?? ?}

代码写的非常的弱鸡难看,如有错误和不足的地方,请指出喔~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:09:33  更:2021-11-27 10:11:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 19:32:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码