链表的基本操作(C语言)详解

#include <stdio.h>
#include <stdlib.h>typedef struct Link{int elem;struct Link *next;
}link;
link *initLink();
void display(link *p);//显示链表
//链表插入的函数,p是链表,elem是插入的结点的数据域,add是插入的位置
link *insertElem(link*p,int elem,int add);
//删除结点的函数,p代表操作链表,add代表删除节点的位置
link *delElem(link *p,int add);
//查找结点的函数,elem为目标结点的数据域的值
int selectElem(link * p, int elem);
//更新结点的函数,newElem为新的数据域的值
link* amendElem(link*p,int add,int newElem);int main()
{link *p = NULL;int address;//(1)初始化链表(1,2,3,4);printf("初始化链表为:\n");p = initLink();display(p);//(2) 插入:在第4的位置插入元素5printf("在第4的位置插入元素5:\n");p = insertElem(p,5,4);//哪个指针,什么元素、哪个位置display(p);//(3)删除元素3printf("删除元素3:\n");p = delElem(p,3);display(p);//(4)查找元素printf("查找元素2的位置为");address = selectElem(p,2);if(address == -1){printf("没有该元素");}else{printf("元素2的位置为:%d\n",address);}//(5)更改位置3的位置数据为7printf("更改第3的位置上的数据为7:\n");p = amendElem(p, 3, 7);//更改第3的位置上的数据为7display(p);return 0;
}
void display(link *p) //Link型的指针变量
{link* temp = p;//将temp指针指向头节点//只要temp指针指向的结点的next不是Null,就执行输出语句while(temp->next){//头指针并未使用,这里有一些问题temp=temp->next;printf("%d ",temp->elem);}printf("\n");}link *initLink(){link *p = (link*)malloc(sizeof(link));  //创建一个头节点,非首元节点link *temp = p;                          //声明一个指针指向头节点,用于遍历链表int i = 0;//生成链表for(i=1;i<5;i++){link *a = (link*)malloc(sizeof(link));//创建节点//创建节点这里不是很理解a->elem = i;a->next = NULL;temp->next = a;temp = temp->next;}return p;
}
//插入结点的链表,返回需要是link类型的数据
/*
只需做以下两步操作,即可将新元素插入到指定的位置:
1.将新结点的next指针指向插入位置后的结点
2.将位置前结点的next指针指向插入结点
理解还是不到位啊!
*/
//为什么这里要使用的是函数指针呢,返回类型,返回类型是什么呢,理解不上去啊?
link *insertElem(link*p,int elem,int add){link *temp = p;//创建临时结点link *c = NULL;int i= 0;//(1)使用临时temp结点找到要插入的位置,把坑占了for(i=1;i<add;i++){if(temp == NULL){printf("插入位置无效");return p;}temp = temp->next;}//(2)创建插入结点Cc = (link*)malloc(sizeof(link));//插入结点创立空间c->elem = elem;//赋值//(3)向链表中插入结点c->next = temp->next; //【核心步骤】将新结点的next指针指向插入位置后的结点temp->next = c;       //【核心步骤】将位置前结点的next指针指向插入结点return p;
}
//删除结点的函数
/*
链表删除元素
从链表中删除指定数据元素时,实则就是将存有该数据元素的节点从链表中摘除,
对不再利用的存储空间要及时释放。
因此,从链表中删除数据元素需要进行以下 2 步操作:
将结点从链表中摘下来;
手动释放掉结点,回收被结点占用的存储空间;
其中,从链表上摘除某节点的实现非常简单,只需找到该节点的直接前驱节点 temp,执行一行程序:
temp->next = temp->next->next;
*/
//p为原链表,add为要删除的值
link *delElem(link *p,int add){link*temp = p;link*del = NULL;int i = 0;//temp遍历到被删除结点上的一个结点for(i=1;i<add;i++){temp = temp->next;}del = temp->next;             //单独设置一个指针指向被删除的结点,以防丢失temp->next = temp->next->next;//删除某个结点的方法就是更改前一个结点的指针域free(del);                    //手动释放该结点,防止内存泄露return p;
}
/*
在链表中查找指定数据元素,最常用的方法是:从表头依次遍历表中节点,用被查找元素与各节点数据域中存储的数据元素进行比对,
直至比对成功或遍历至链表最末端的 NULL(比对失败的标志)。
*/
//p为原链表,elem表示被查找元素
int selectElem(link * p, int elem) {//新建一个指针t,初始化为头指针link*t = p;int i = 1;//由于头节点的存在,因此while中判断为t->nextwhile(t->next){t = t->next;if(t->elem == elem){return i;}i++;}//程序执行至此处,表示查找失败return -1;
}
//更新链表中的元素,只需通过遍历找到存储此元素的节点,对节点中的数据域做更改操作即可。
link* amendElem(link*p,int add,int newElem){int i = 0;link *temp = p;temp = temp->next; //temp指向首元结点//temp指向被替换的结点for(i=1;i<add;i++){temp = temp->next;}temp->elem = newElem;return p;
}

链表的基本操作(C语言)详解(摘取自C语言学习网2.5)相关推荐

  1. 深度优先搜索c语言详解,深度优先搜索 — C语言版

    思路:找一个入口结点,然后搜索该结点的第一个相邻结点,再搜索该相邻结点的第一个相邻结点,依次往下寻找 - - ,直到所有结点都被遍历到,算法结束,退出. #include #define MAX 10 ...

  2. 24c02读程序C语言详解,24C02读写C语言程序

    24C02读写操作程序.c >下面是本人编写的源程序,已经调试成功,下载就可以使用,程序编写的不是很规范 ,希望各位读者批评指正!!! >/************************ ...

  3. 顺序栈基本操作(入栈和出栈)C语言详解

    #include <stdio.h> #include <stdlib.h> /*顺序栈基本操作(入栈和出栈)C语言详解栈的具体实现(1)顺序栈(2)链栈栈的应用(1)回退 ( ...

  4. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...

  5. Drools 规则语言详解(上)

    http://www.blogjava.net/guangnian0412/archive/2006/06/09/51574.html http://www.blogjava.net/guangnia ...

  6. python创建双链表_Python双链表原理与实现方法详解

    本文实例讲述了Python双链表原理与实现方法.分享给大家供大家参考,具体如下: Python实现双链表 文章目录 Python实现双链表 单链表与双链表比较 双链表的实现 定义链表节点 初始化双链表 ...

  7. 克鲁斯卡尔算法c语言,Kruskal算法(一)之 C语言详解

    最小生成树 在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树. 例如,对于如上图G4所示的连通网可以有多棵权值总和 ...

  8. c++指针详解_c语言详解sizeof

    一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等. 它并不是函数. sizeof操作符以字节形式给出了其操作数的存储大小. 操作数可以是一个表达式或括在括 ...

  9. 排座系统c语言,2008noip排座位C语言详解.doc

    2008noip排座位C语言详解 2008noip排座位C语言详解 2.排座椅 (seat.pas/c/cpp)D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列 的同学的位置是 ...

最新文章

  1. 【leetcode】148. Sort List
  2. 异构数据库转换工具的结构说明
  3. cdev linux_Linux设备管理(二)_从cdev_add说起
  4. Shell(2)——shell里面的变量
  5. JUC锁-LockSupport(四)
  6. 如何快速弄懂一个新模型_如何评估创业项目是否靠谱?一个新的模型 | 创创锦囊...
  7. Gin实践 番外 Golang交叉编译
  8. 从小白到大数据技术专家的学习历程,你准备好了吗
  9. Facebook 又摊上事了,数亿用户被波及!
  10. 手把手教你为 中文PDF电子书自动批量添加书签/目录, 彻底告别手动添加书签的烦恼
  11. 《现代操作系统第四版》第一章课后答案
  12. mybatis java事务_Mybatis事务处理
  13. 系统加速批处理文件:清理无用共享、内存及系统垃圾
  14. 【转载】参数返回值及NRV优化
  15. CDPSE-数据隐私解决方案工程师
  16. PanDownload 3.5.1 卢本伟修改版
  17. 服务器端编程心得(二)—— Reactor模式
  18. SpringCloud(3)CloudAlibaba Nacos Sentinel Seata
  19. excel表格保护单元格教程加破解(忘记密码情况下破解)
  20. 位宽512bit显卡_显卡位宽是什么?详解显卡位宽基础知识科普!

热门文章

  1. 学生个人网页设计作品 HTML+CSS+JavaScript仿小米商城(8页) 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做
  2. 三层HashMap的嵌套
  3. vue项目的目录结构图及目录详解
  4. python数据库连接mysql_使用Python连接MySQL数据库
  5. (附源码)springboot自习室座位预约系统 毕业设计674156
  6. 赵神牛的游戏(过程分析与结果分析)
  7. 路径规划学习之地图生成(一)
  8. 解决 Error: spawn xdg-open ENOENT
  9. 服务器装win7无限重启吗,win7系统重装系统后无限重启电脑的解决方法
  10. Activity毛玻璃背景效果