小蚂蚁学习数据结构(4)——线性结构——线性表的链式表示和实现(下)
2019独角兽企业重金招聘Python工程师标准>>>
用代码实现对链表的操作。
/*创建一个链表,实现对链表的创建,插入/追加,删除等操作
*/
# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>//创建一个结构体
typedef struct Node
{int data;struct Node * pNext;
}NODE,*PNODE;//函数前置声明
PNODE create_list(void); //创建一个链表
void traverse_list(PNODE); //遍历整个链表
bool is_empty(PNODE); //判断列表是否为空
int length_list(PNODE); //返回链表的长度
bool insert_list(PNODE, int , int); //在链表中插入元素
bool delete_list(PNODE, int, int *);//删除链表中的某个元素,并且返回被删除的元素的值。
void sort_list(PNODE); //对链表进行排序int main(void)
{//初始化头指针变量PNODE pHead = NULL;int val;//创建一个链表,将头结点的指针返回,保存到头指针变量中pHead = create_list();//判断这个链表是否为空/* if( is_empty(pHead) ){printf("这个链表为空\n");}else{printf("链表不为空\n");}*///查看元素的个数printf("该链表元素的个数为:%d\n",length_list(pHead));//遍历整个链表printf("遍历整个链表:");traverse_list(pHead);//插入元素printf("在第3个元素前插入一个99的值:");insert_list(pHead, 3, 99);traverse_list(pHead);//对链表进行排序printf("对链表进行升序排序:");sort_list(pHead);traverse_list(pHead);//删除链表中的元素printf("删除第三个位置的值: ");delete_list(pHead, 3, &val);//遍历这个链表traverse_list(pHead);return 0;
}/*常见一个链表@param void@return pHead 头指针
*/
PNODE create_list(void)
{int val; //用于保存用户输入的值int i; //for循环自增变量int data;//创建头结点PNODE pHead = (PNODE)malloc(sizeof(NODE));if(NULL == pHead){printf("动态内存创建失败\n");exit(-1);}PNODE pTail = pHead;pTail -> pNext = NULL;printf("需要创建元素的个数len=");scanf("%d",&val);for(i = 0; i < val; ++i){printf("请输入第%d个元素:", i + 1);scanf("%d",&data);//创建这个节点PNODE pNew = (PNODE)malloc(sizeof(NODE));if(NULL == pNew){printf("动态内存创建失败\n");exit(-1);}pNew -> data = data;pNew -> pNext = NULL;pTail -> pNext = pNew;pTail = pNew;}return pHead;}/*遍历一个链表@param PNODE 头指针@return void
*/
void traverse_list(PNODE pHead)
{PNODE p;p = pHead;if( is_empty(pHead) ){printf("这个链表为空\n");return;}while(NULL != p->pNext){p = p->pNext;printf("%d ",p->data);}printf("\n");
}/*判断链表是否为空@param PNODE pHead 头指针@return bool
*/
bool is_empty(PNODE pHead)
{if( NULL == pHead -> pNext){return true;} else{return false;}
}/*返回链表的长度@param PNODE pHead 头指针@return int i 指针的长度
*/
int length_list(PNODE pHead)
{PNODE p;int i = 0;if( is_empty(pHead) ){printf("链表为空。\n");}p = pHead->pNext;while( NULL != p){++i;p = p->pNext;}return i;
}/*对链表进行排序@param PNODE pHead 头指针@return void思路:昨天对数组的排序方法,同样适用于链表,需要对for循环稍微改造一下。
*/
void sort_list(PNODE pHead)
{int i, j, len, t;PNODE p, q;len = length_list(pHead);for(i = 0,p = pHead->pNext; i < len-1; ++i,p=p->pNext){for(j = i+1, q = p->pNext; j < len; ++j,q = q ->pNext){if(p->data > q->data){t = p->data;p->data = q->data;q->data = t;}}}}/*插入一个元素@param PNODE pHead 头指针@param int pos 插入元素的位置@param int val 要插入元素的值@return bool
*/
bool insert_list(PNODE pHead, int pos, int val)
{PNODE p = pHead;int i = 0;/*目的:判断用户输入信息是否合法思路:假如有5个元素,在第3个元素前插入第一次:i = 0 指针不为空,i 变为1,p指针指向第1个元素第二次:i = 1 指针不为空,i 变为2,p指针指向第2个元素 假如有5个元素,在第4个元素前插入第一次:i = 0 指针不为空,i 变为1,p指针指向第1个元素第二次:i = 1 指针不为空,i 变为2,p指针指向第2个元素第三次;i = 2 指针不为空,i 变为3,p指针指向第3个元素 假如有5个元素,在第5个元素前插入第一次:i = 0 指针不为空,i 变为1,p指针指向第1个元素第二次:i = 1 指针不为空,i 变为2,p指针指向第2个元素第三次;i = 2 指针不为空,i 变为3,p指针指向第3个元素第四次;i = 3 指针不为空,i 变为4,p指针指向第4个元素假如有5个元素,在第6个元素前插入第一次:i = 0 指针不为空,i 变为1,p指针指向第1个元素第二次:i = 1 指针不为空,i 变为2,p指针指向第2个元素第三次;i = 2 指针不为空,i 变为3,p指针指向第3个元素第四次;i = 3 指针不为空,i 变为4,p指针指向第4个元素第五次;i = 4 指针不为空,i 变为5,p指针指向第5个元素*/while(NULL != p && i < pos-1){++i;p = p -> pNext;}/*2016年1月2日10:26:24 修改昨天的时候,这里犯了一个错误,写的是if(i > pos-1 || NULL == p->pNext)这样写的结果就是,不能在最后一个元素之后插入,也就是5个有效元素,不能再第6个元素前插入,因为NULL == p->pNext会判断上一个元素的指针域是否为空,最后一个元素的指针域肯定是空了,所以就显示了一个输入值非法。这样做显然是不恰当的,应该可以再最后也可以插入一个值,就类似于追加的效果。所以,为了验证用户输入的值的合法性,只需要判断前一个元素是否为空即可,而不是判断前一个元素的指针域是否为空,所以应该改成这样子:if(i > pos-1 || NULL == p)这样就可以实现追加的效果了*/if(i > pos-1 || NULL == p){printf("您输入的值非法\n");return false;}PNODE pNew=(PNODE)malloc(sizeof(NODE));if(NULL == pHead){printf("动态内存创建失败\n");exit(-1);}pNew -> data = val;pNew -> pNext = p -> pNext;p -> pNext = pNew;return true;
}/*删除一个元素@param PNODE pHead 头指针@param int pos 删除元素的位置@param PNODE val 返回删除元素的值@return bool
*/
bool delete_list(PNODE pHead, int pos, int * val)
{PNODE p = pHead;PNODE t;int i = 0;while(NULL != p->pNext && i < pos-1){++i;p = p -> pNext;}/*这里的判断就需要是NULL == p -> pNext,假如有5个元素,肯定不能删除第6个元素,因为第6个元素为空。只能删除第1个元素到第5个元素。*/if(i > pos-1 || NULL == p -> pNext){printf("您输入的值非法\n");exit(-1);}t = p -> pNext->pNext;*val = p->pNext->data;free(p->pNext);p->pNext = t;return true;
}
/*VC++6.0中的输出为:===========================================需要创建元素的个数len=5请输入第1个元素:1请输入第2个元素:2请输入第3个元素:3请输入第4个元素:4请输入第5个元素:5该链表元素的个数为:5遍历整个链表:1 2 3 4 5在第3个元素前插入一个99的值:1 2 99 3 4 5对链表进行升序排序:1 2 3 4 5 99删除第三个位置的值: 1 2 4 5 99===========================================总结:通过对比,可以很明显的体现出链表和数组操作的差异。体现了,数据的储存方式不同,对应的算法也不同。
*/
好累啊,刚刚写完,今天就到这吧,明天再把注释完善一下,整个程序感觉不难,就是在插入和删除函数需要判断位置是否合法那里,费了好长时间,还是有点难度的。
明天再总结吧,睡觉!
学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog
2016年1月2日11:07:18
今天添加了注释,对于第249行的算法,之前有些不足,无法对链表进行追加,改进之后实现了追加。
转载于:https://my.oschina.net/woshixiaomayi/blog/596054
小蚂蚁学习数据结构(4)——线性结构——线性表的链式表示和实现(下)相关推荐
- 串的块链存储c语言栈,小蚂蚁学习数据结构(18)——串的块链的代码实现
感觉上块链的代码实现比数组的代码实现要难一些,估计因为数组的实现书上有伪代码,而块链连伪代码都木有,不过归根到底还是水平不行--哭瞎--╥﹏╥... /* 数据结构C语言版 串的块链存储表示和实现 * ...
- 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表
文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...
- 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...
- 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)
线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...
- java建立线性表的链式结构,数据结构学习----线性表的链式表示(Java实现)
线性表接口LList: package com.clarck.datastructure.linked; /** * 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数据元素的数据类型 * ...
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- 数据结构与算法——线性结构——线性表及其表示
-"一,线性结构 1.顺序储存结构直接表示 多项式. 1).使用数组来表示多项式.(用数组下标来表示指数,值来表示系数) 可以表示成: 2).使用结构数组来表示.(把系数和指数看成一个二元组 ...
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- Python 数据结构 之 线性表 的链式存储结构
用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明: Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...
最新文章
- springboot 引入jdbc驱动_SpringBoot整合jdbc、durid、mybatis详解,数据库的连接就是这么简单...
- machine learning (5)---learning rate
- 开源跳板机(堡垒机)Jumpserver v2.0.0 部署篇
- 在知乎上泡了这么久,工作、工资、生活还是没有起色是什么原因?
- C++ 空指针和野指针
- SQL SERVER—修改时不允许保存修改
- 网络安全工程师面试分享
- 【仿写网站】用swiper实现故宫博物院首页轮播图
- 25篇最新CV领域综述性论文速递!涵盖15个方向:目标检测/图像处理/姿态估计/医学影像/人脸识别等方向...
- 2014腾讯校园招聘实习笔试题
- 机器学习研究项目--以机器视觉工程师的视角(MLP篇)
- Android手机一直连接USB进行自动化,一直充电,可能导致电池鼓包,如何定时禁止充电和开启充电?
- 麻省理工大学教授教你怎样做…
- 华为OD机试(含B卷)真题2023 精简版,50道100分题目。如果距离机考时间不多了,就看这个吧
- nginx服务器代理设置
- python生成春联图片,并包装为GUI工具
- 平台sdk和项目sdk的理解
- MT6129射频处理器,MT6129芯片原理资料介绍
- 基于希克斯需求价格弹性计算_#炳哥经济学临考密押DAY1#微观计算题考点大盘点(上)...
- 宝塔linux升级,宝塔linux面板去除后台强制更新
热门文章
- html 第三次作业
- 5G时代渐行渐近 移动承载网络面临新挑战
- Java 数据结构与算法系列之冒泡排序
- py编程技巧-1.5-如何快速找到多个字典的公共键(key)
- javaScript由哪些部分组成?
- C# try与finally(WinForm、Asp.Net)
- xp 5gt ***
- 罗念梓(帮别人名字作诗)
- mysql-4.0.20 use on scounix 5.0.7 error :dynamic linker:..:could not open libgthreads.so help!!!!
- 【Kettle学习笔记】从Hbase导入数据至Mysql