动态链表

  • 1.动态链表概念
  • 2.动态链表操作接口
    • 2.0数据结构定义
    • 2.1添加节点
    • 2.2显示节点数据
    • 2.3逆转节点
    • 2.4查找节点
    • 2.5查找并修改节点数据
    • 2.6获取节点个数
    • 2.7删除所有节点
    • 2.7删除指定节点
    • 2.8根据节点,头部插入
    • 2.8根据节点,尾部插入
    • 2.9节点排序
    • 2.10主程序

1.动态链表概念

动态链表就是由malloc分配内存

2.动态链表操作接口

2.0数据结构定义

struct Student {int num;//编号float score;//成绩struct Student* next;//存储下一个节点的地址
};
typedef struct Student ST;

2.1添加节点

void add(ST** phead, int inum, float iscore)//传入头节点的地址,插入数据
{if (*phead == NULL)//判断链表是否为空{ST* newnode = malloc(sizeof(ST));//c99可以不强转malloc返回值if (newnode == NULL){printf("内存分配失败");return;}newnode->num = inum; //节点初始化newnode->score = iscore;newnode->next = NULL;*phead = newnode;//让头指针指向这个节点}else{ST* p = *phead;while (p->next != NULL)//遍历到最后1个节点,尾部插入{p = p->next;}ST* newnode = malloc(sizeof(ST));if (newnode == NULL){printf("内存分配失败");return;}newnode->num = inum; //节点初始化newnode->score = iscore;newnode->next = NULL;p->next = newnode;//让头指针指向这个节点}
}

2.2显示节点数据

void showall(ST* phead)//传入头节点,显示所有数据
{ST* head = phead;while (head != NULL){printf("num=%d,score=%f", head->num, head->score);//访问数据printf("%p,%p\n", head, head->next);//打印两个节点的地址head = head->next;}
}

2.3逆转节点

ST* rev(ST* head)//逆转
{ST* p1, * p2, * p3;p1 = p2 = p3 = NULL;if (head == NULL || head->next == NULL)//为空链表或者只有1个元素{return head;//返回头节点}p1 = head;p2 = head->next;while (p2!=NULL){p3 = p2->next;//布局三个节点p2->next = p1;//指向前一个节点p1 = p2;//指针向前移动,从第二个到最后一个节点p2 = p3;}head->next = NULL;head = p1;return head;
}

2.4查找节点

ST* search(ST* head, int num)//根据编号查找节点
{while (head != NULL){if (num == head->num){return head;//返回当前节点的指针地址}head = head->next;}return NULL;
}

2.5查找并修改节点数据

void change(ST* head, int oldnum, int newnum)//查找oldnum修改为newnum
{ST* psearch = search(head, oldnum);if (psearch == NULL){printf("没找到");}else{psearch->num = newnum;printf("修改成功");}
}

2.6获取节点个数

int getnum(ST* head)//获取节点个数
{int i = 0;while (head != NULL){i++;head = head->next;}return i;
}

2.7删除所有节点

void *freeall(ST* head)//删除所有节点.每次删除第一个节点后面的一个节点,最后删除头节点
{ST* p1, * p2;p1 = p2 = NULL;p1 = head;//头节点while (p1->next!=NULL)//遍历所有节点{p2 = p1->next;//p2为p1下个节点p1->next = p2->next;//p1存储了p2下一个节点的地址//p1->next = p2->next;//p1存储了p2下一个节点的地址//p2 = p1->next;//p2为p1下个节点free(p2);printf("\n\n\n");//访问数据,观测删除过程showall(head);}free(head);return NULL;
}

2.7删除指定节点

ST* delete(ST *head ,int num)//返回头节点,传入头节点,要删除节点的编号
{ST* p1, * p2;p1 = p2 = NULL;p1 = head;//头节点while (p1 != NULL){if (p1->num == num){break;}else{p2 = p1;//记录当前节点p1 = p1->next;}}if (p1 == head){head = p1->next;free(p1);}else {p2->next = p1->next;free(p1);}return head;
}

2.8根据节点,头部插入

ST* HeadInsert(ST* head, int num, int inum, float iscore)//根据节点,头部插入
{ST* p1, * p2;p1 = p2 = NULL;//定义两空节点p1 = head;while (p1 != NULL){if (p1->num == num){break;}else{p2 = p1;//记录当前节点p1 = p1->next;//循环到下一个节点}}if (head == p1)//头节点{ST* newnode = (ST *)malloc(sizeof(ST));newnode->num = inum;newnode->score = iscore;newnode->next = head;//指向第一个节点head = newnode;//newnode成为第一个节点}else{ST* newnode = (ST*)malloc(sizeof(ST));newnode->num = inum;newnode->score = iscore;newnode->next = p1;//新节点指向p1p2->next = newnode;//指向新节点}return head;
}

2.8根据节点,尾部插入

ST* BackInsert(ST* head, int num, int inum, float iscore)//根据节点,尾部插入
{ST* p1, * p2;p1 = p2 = NULL;//定义两空节点p1 = head;while (p1 != NULL){if (p1->num == num){break;}else{//p2 = p1;//记录当前节点p1 = p1->next;//循环到下一个节点}}if (p1->next == NULL)//最后一个节点{ST* newnode = (ST*)malloc(sizeof(ST));newnode->num = inum;newnode->score = iscore;newnode->next = NULL;p1->next = newnode;}else{p2 = p1->next;//记录下一个节点的位置ST* newnode = (ST*)malloc(sizeof(ST));newnode->num = inum;newnode->score = iscore;newnode->next = p2;//链接下一个节点p1->next = newnode;//p1指向新节点}return head;//无意义
}

2.9节点排序

void sort(ST* head,char ch)//当ch为大于号则从大到小排序,冒泡排序
{if (ch == '>'){for (ST* p1 = head; p1 != NULL; p1 = p1->next){for (ST* p2 = head; p2 != NULL; p2 = p2->next){if (p1->num < p2->num){ST temp;temp.num = p1->num;p1->num = p2->num;p2->num = temp.num;//再交换score}}}}else if (ch == '<'){}}

2.10主程序

int main()
{struct Student* head = NULL;//头指针,指向节点,从而访问节点add(&head, 1, 70);add(&head, 2, 80);add(&head, 3, 90);add(&head, 4, 91);add(&head, 5, 92);//printf("%d,%f\n", head->num, head->score);//访问数据//printf("%d,%f\n", head->next->num, head->next->score);//printf("%d,%f\n", head->next->next->num, head->next->next->score);head = rev(head);showall(head);//head= freeall(head);//head = NULL;//删除头节点务必让他为空showall(head);system("pause");return 0;
}

(二)链表学习之模块化处理相关推荐

  1. 20145240《信息安全系统设计基础》第十二周学习总结

    20145240<信息安全系统设计基础>第十二周学习总结 前三周博客链接 第九周学习总结 第十周学习总结 第十一周学习总结 视频学习内容总结 指针数组与数组指针 数组指针(也称行指针) 定 ...

  2. 20145206 《信息安全系统设计基础》第十二周学习总结

    20145206 <信息安全系统设计基础>第十二周学习总结 本周学习目标 1.第九周代码检查 2.第十周代码检查 3.第十一周代码检查 博客链接 20145206 <信息安全系统设计 ...

  3. linux词语大全,简单词语大全二字学习软件-简单词语大全四字下载v1.5.3-Linux公社...

    简单词语大全二字学习软件是一款可以让用户快速背单词的软件,这款软件为用户提供了英语内容搭配影音的例句,让用户可以轻松学习英语.其中,用户可以在简单词语大全二字学习软件上对多人进行挑战,看自己的英语水平 ...

  4. GoLang之map底层系列二(浅显学习)

    文章目录 GoLang之map底层系列二(浅显学习) 1.map++ 2.map引用传递 3.map不是并发安全 4.map的value为空接口 5.map的value为切片 6.value,ok=m ...

  5. [软考]系统架构设计师 备考经验分享(二) - 知识点学习+综合知识篇

    2021.12.20 更新下成绩 49,53,55 原文: 本篇对应备考计划中的1.2阶段: 相关分享: 备考计划篇:[软考]系统架构设计师 备考经验分享(一) - 备考计划篇 知识点学习+综合知识篇 ...

  6. 计算机系大二学期计划范文,大二学期学习计划范文

    大二学期学习计划范文 大学二年级是大学生在适应大学生活后,正式进入大学自主学习.生活阶段的初始期.下面是小编整理的大二学期学习计划范文,希望能够为大家提供帮助! 大二学期学习计划范文一 过去的一学期, ...

  7. 计算机系大二学期计划范文,大二学期学习计划范文6篇

    大学二年级是大学生在适应大学生活后,正式进入大学自主学习.生活阶段的初始期.本文是大二学期的学习计划范文,仅供参考. 大二学期学习计划范文一 过去的一学期,是辛苦的但又是充满意义的.不知不觉,已经加入 ...

  8. 深度强化学习笔记(二)——Q-learning学习与二维寻路demo实现

    深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 文章目录 深度强化学习笔记(二)--Q-learning学习与二维寻路demo实现 前言 理论 什么是Q-Learning 算 ...

  9. 工程伦理第十二章学习笔记2020最新

    工程伦理第十二章学习笔记2020最新 继续更新

最新文章

  1. python3网络编程中semaphore用法_python3 进程信号量semaphore
  2. 业余实现一个统计A股数据工具
  3. linux6安装图形化界面,centos 6.8 图形界面安装
  4. Anaconda创建跟别人环境配置一样的虚拟环境(coda env creat -f environment.yml)
  5. SQL约束脚本的用法
  6. 华为数据之道_DT|华为数据之道,怕你学不会,这次干脆出了本书
  7. 篮球计时计分器c语言程序,篮球赛计时计分器程序源代码.doc
  8. feignclient time out
  9. android手机截图功能,安卓手机怎么截屏?三星/华为/小米等手机截图方法
  10. C 语言实现简易区块链
  11. 毕得医药递交科创板注册:年营收6亿 拟募资4.34亿
  12. spring获取Bean报错
  13. ZZULIOJ:1134: 字符串转换
  14. qlikview连接数据库
  15. 虚拟现实和增强现实技术_增强现实和虚拟现实在NBA中的作用
  16. 2018年1月9日的工作总结
  17. com.android.gms是什么,com.google.android.gms.cast的用途是什么?
  18. 基于STM32F1-C8T6无人机(二)——舵机/电调/空心杯电机/飞控/机架/subs接收机/充电器和电池(给出链接和思考)
  19. 蔡徐坤游戏HTML,JS制作蔡徐坤打篮球小游戏(鸡你太美?)
  20. 关于AttributeError: module ‘tensorflow‘ has no attribute ‘io‘解决方案

热门文章

  1. 陆金所机房一键切换平台建设
  2. 毕业设计 单片机智能手环计步器 - 嵌入式 物联网 stm32
  3. htmlspecialchars详解
  4. Unity 相机围绕着目标点旋转、缩放
  5. xls导入mysql heidisql_HeidiSQL 导入Excel数据
  6. 最全的Apache Doris教程(收藏版)共9万+字【第一篇】由于是typora编写,有部分图片在本地,识别不出来,请细聊我
  7. 【内网学习笔记】20、Hashcat 的使用
  8. 项目整合管理——项目管理信息系统(新年快乐)
  9. 东南大学计算机2020初试成绩公布,东南大学2020初试考研录取分数线名单
  10. ROS(四)参数服务器C++实现