可能是顺序表研究的细致了一点,单链表操作一下子就实现了。这里先实现带头结点的单链表操作。

大概有以下知识点.

1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址的部分称为指针域。

2;结点示意图:

3;头指针:头指针始终指向链表第一个元素,当有头结点时头结点就是链表第一个元素。头指针具有标识左右,故头指针命名为链表的名字,这里为linklist。头指针是一定存在的。

4;头结点:引入头结点的目的是,将链表首元结点的插入和删除操作与其他结点的插入和删除操作统一起来。(即头指针地址不在发生变化)

5;单链表结点结构体表示:

1 structLNode2 {3 int data; //姑且认为其数据为整型

4 struct LNode *next;5 };6

7 typedef struct LNode * linklist

6;单链表的操作集合,头文件 defs.h

1 #ifndef _DEFS_H_2 #define _DEFS_H_

3

4 #include

5 #include

6 #include

7

8 struct LNode //单链表结点的定义

9 {10 intdata;11 struct LNode *next;12 }13 typedef struct LNode *linklist14

15 //操作集合

16 void InitList(linklist *L); //申请头结点,头指针地址改变

17 void DestroyList(linklist *L); //须释放头结点,头指针地址改变

18 void ClearList(linklist L); //保留头结点,头指针地址不变

19 voidListEmpty(linklist L);20 intListLength(linklist L);21 int GetElem(linklist L, int i, int *e);22 int LocateElem(linklist L, inte);23 int PriorElem(linklist L, int cur_e, int *pri_e);24 int NextElem(linklist L, int cur_e, int *nex_e);25 int ListInsert(linklist L, int i, int e); //插入不改变头指针的值

26 int ListDelete(linklist L, int i, int *e); //删除操作也不改变头指针的值

27 voidTravelList(linklist L);28 #endif

7;InitList操作实现

1 #include"defs.h"

2

3 void InitList(linklist *L) //接受头指针的地址值

4 {5 *L = (linklist)malloc(sizeof(struct LNode)); //*L表示头指针

6

7 if (*L ==NULL)8 {9 printf("分配结点失败。\n");10 exit(-1);11 }12 (*L)->next = NULL; //置头结点的next域为空

13 }

InitList.c

8;DestroyList操作的实现

1 #include"defs.h"

2

3 void DestroyList(linklist *L) //接受的参数为头指针的地址值

4 {5 linklist p ;6 while (*L)7 {8 p = (*L)->next; //释放结点之前先保存结点的下一个地址,防止线索被断

9 free(*L);10 *L = p; //将下一个结点,作为释放结点

11 }12 }

DestroyList.c

9;ClearList操作的实现

1 #include"defs.h"

2

3 void ClearList(linklist L) //保留头结点

4 {5 linklist p = L->next; //p将头指针的next值保存起来,p指向首元结点

6 L->next =NULL;7

8 DestroyList(&p); //调用撤销函数,释放后面的结点

9

10 }

ClearList.c

10;ListEmpty操作的实现

1 #include"defs.h"

2

3 voidListEmpty(linklist L)4 {5 if (L->next == NULL) //判断头结点指针域是否为空

6 printf("链表为空.\n");7 else

8 printf("链表不为空.\n");9 }

ListEmpty.c

11;ListLength操作实现

1 #include"defs.h"

2

3 intListLength(linklist L)4 {5 int j=0; //作为计数器

6 linklist p = L->next; //p指向首元结点,作为移动指针

7

8 while (p) //从首元结点开始

9 {10 ++j;11 p = p->next;12 }13 returnj;14 }

ListLength.c

12;GetElem操作实现

1 #include"defs.h"

2

3 int GetElem(linklist L, int i, int *e) //1<= i <=ListLength(L)

4 {5 int j = 0; //j作为计数器

6 linklist p =L;7

8 while (p && j

9 {10 ++j;11 p = p->next;12 }13 if (!p || i<1) //取值位置不合理

14 exit(0);15

16 *e = p->data;17 return 0;18 }

GetElem.c

13;LocateElem操作实现

1 #include"defs.h"

2

3 int LocateElem(linklist L, inte)4 {5 linklist p = L->next; //p作为移动指针,p指向第一个元素

6 int j = 0; //j作为计数器

7

8 while(p)9 {10 ++j;11 if (p->data ==e)12 returnj;13 p = p->next;14 }15 return 0;16 }

LocateElem.c

14;PriorElem操作实现

1 #include"defs.h"

2

3 int PriorElem(linklist L, int cur_e, int *pri_e) //第一个元素无前驱

4 {5 linklist p = L->next; //p指向首元结点

6 linklist q;7

8 while(p)9 {10 q = p->next; //q为p的后继

11

12 if (q && q->data == cur_e) //则p就是q的前驱

13 *pri_e = p->data;14 p = q; //循环

15 }16 return 0;17 }

PriorElem.c

15;NextElem操作的实现

1 #include"defs.h"

2

3 int NextElem(linklist L, int cur_e, int *nex_e) //最后一个元素无后继

4 {5 linklist p = L->next; //p指向首元结点

6 linklist q;7

8 while(p)9 {10 q = p->next; //q为p的后继

11

12 if (q && p->data == cur_e) //p有后继,且p的数据域与当前值相等

13 *nex_e = q->data;14 p = q; //更新p

15 }16 return 0;17 }

NextElem.c

16;ListInsert操作的实现

1 #include"defs.h"

2

3 int ListInsert(linklist L, int i, int e) //1<= i <= ListLength(L)

4 {5 int j=0; //j为基数器

6 linklist p = L; //p为移动指针,p指向头结点

7 linklist q, s;8

9 while (p && j

10 {11 ++j;12 p = p->next;13 }14

15 if (!p || i<1) //插入位置不合理

16 return 0;17

18 q = p->next; //q指向第i个结点

19

20 s = (linklist)malloc(sizeof(structLNode));21 if (!s) //分配失败

22 exit(-1);23

24 s->data = e; //置s的数据域为e

25 s->next = q; //插入操作,是指针连起来

26 p->next =s;27 return 0;28 }

ListInsert.c

17;ListDelete操作的实现

1 #include"defs.h"

2

3 int ListDelete(linklist L, int i, int *e) //1<= i <=ListLength(L)

4 {5 int j = 0; //j为计数器

6 linklist p =L;7 linklist q;8

9 while (p && j

10 {11 ++j;12 p = p->next;13 }14

15 if (!p || i<1) //删除位置不合理

16 exit(0);17 q = p->next; //q指向第i个结点

18

19 *e = q->data; //先将第i个结点的数据域带出

20 p->next = q->next; //连起指针

21 free(q); //释放第i个结点

22

23 return 0;24 }

ListDelete.c

18;TravelList操作实现

1 #include"defs.h"

2

3 voidTravelList(linklist L)4 {5 linklist p = L->next; //p指向首元结点

6 int j = 0; //j为计数器

7

8 while(p)9 {10 ++j;11 printf("第%d个结点的数据域的值为:%d\n", j, p->data);12 p = p->next; //更新p

13 }14 }

TravelList.c

19;makefile的实现,其代码与顺序表的一样,这里换成另一种写法

1 object =main.o InitList.o DestroyList.o ClearList.o ListEmpty.o \2 ListLength.o GetElem.o LocateElem.o PriorElem.o NextElem.o \3 ListInsert.o ListDelete.o TravelList.o4

5 test : $(object)6 gcc -g -Wall -o test $(object)7

8 $(object) : defs.h9

10 .PHONY : clean11 clean :12 rm -f *.o

20;顺序表与单链表的比较

顺序表是用一段地址连续的存储单元来存放数据元素,适合查找,不适合频繁插入和删除(没一次操作都是O(n));

单链表是用不连续的存储单元,其数据元素之间是用指针来连接,每一次的查找都必须通过头指针来遍历,因此其不适合频繁的查找。但是对于插入和删除操作,它不需要移动其它元素,算法时间复杂度为O(1),因此特别适合频繁的插入和删除操作。

单链表操作实现getelem_c语言实现--带头结点单链表操作相关推荐

  1. 算法与数据结构之带头结点和不带头结点单链表存在的问题

    带头结点和不带头结点单链表注意的小细节 在写不带头结点的单链表中发现了一个问题,这个问题在带头结点的单链表中也存在,那就是值传递的问题. 首先来看一下 #include<stdio.h> ...

  2. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)

    文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...

  3. C语言不带头结点的单链表

    C语言不带头结点的单链表 #include <stdio.h> #include <stdlib.h> #include <stdbool.h>typedef st ...

  4. 带头结点单链表 和 不带头结点单链表的区别

    文章目录 不带头结点的操作 代码① 代码② 代码③ 代码④ 带头结点的操作 代码⑤ 下面的代码中,传递链表时,传的是头指针.如果是带头结点的链表,传递链表时,可以传头结点,具体可以看看 C语言实现-线 ...

  5. #数据结构:编写不带头结点单链表的建立、插入和删除算法

    编写不带头结点单链表的建立.插入和删除操作算法. 一.问题描述 编写一个不带头节点的单链表 二.基本要求 1) 建立 2) 插入 3) 删除 三.算法思想 选用不带头结点的单链表,在第一个元素节点前插 ...

  6. 带头结点单链表递增有序

    怎么说呢,思路很简单很简单,先把头结点拆出来,后边的结点继续遍历,向头结点中插入,只不过插入的时候有了一点条件而已(需要有序),但是!!感觉一点也不简单呢,指针一直变,还是有点混乱的. 慢慢熟悉一下加 ...

  7. 小白算法积累——单链表13#带头结点单链表+就地归并+改序

    题目:假设有两个按元素值递增次序排列的线性表,均以单链表的形式存储.请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表. 关键字:带头结点 ...

  8. java带头结点的单链表_自己实现集合框架 (五): 带头结点单链表的实现

    这是系列文章,每篇文章末尾均附有源代码地址.目的是通过模拟集合框架的简单实现,从而对常用的数据结构和java集合有个大概的了解.当然实现没有java集合的实现那么复杂,功能也没有那么强大,但是可以通过 ...

  9. 带头结点单链表就地逆置算法

    1.带头结点单链表就地逆置算法 部分函数调用参考如下:https://blog.csdn.net/qq_50504109/article/details/120288749 /*** 单向链表的逆置, ...

最新文章

  1. python 学习笔记 12 -- 写一个脚本获取城市天气信息
  2. 获得WebApi用Post方法获得新增数据的信息
  3. bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】
  4. 10分钟搭建商品结算平台!商品、车辆识别一网打尽
  5. Math类的三个方法比较: floor() ceil() round()
  6. SVN错误:Attempted to lock an already-locked dir及不能提交.so文件
  7. java ide 的优劣_Java程序员的困惑 Java IDE到底怎么选
  8. sudoku me_Java Sudoku解算器程序
  9. 系统学习深度学习(三十九)--基于模型的强化学习与Dyna算法框架
  10. python电话通知_教你如何用Python向手机发送通知
  11. 人脸识别门禁系统java实现_java实现人脸识别源码【含测试效果图】——前台显示层(index.jsp)...
  12. 太极发送卡片软件_QQxml卡片消息发送-防撤回等等安卓QQ插件Notified-支持太极框架 -发送QQ卡片消息...
  13. cocos2d-x 源码分析 总目录
  14. MKVToolNix Mac下载
  15. 使用binlog备份恢复myqsl数据
  16. 图像的模式(RGB和CMYK)、通道(8位、16位、32位)分别有什么作用
  17. 红酒的色香味怎么产生的
  18. RAM内存 ROM存储
  19. 实物1操作:stc8a单片机和普通51/52单片机的异同以及下载步骤(点亮一盏LED为例)
  20. 医学统计学题库带答案

热门文章

  1. Android平台各类恶意软件及病毒概览
  2. sybase自增与插入
  3. 数据仓如何支撑应用?
  4. Hive的数据模型-外部表
  5. servlet3.0异步处理
  6. [转载] java虚拟机 jvm 出入java栈 栈空间内存分配
  7. [转载] python中for语句用法_详解Python中for循环的使用_python
  8. 存储器间接寻址方式_8086中的数据存储器寻址模式
  9. vue 修改div宽度_Vue 组件通信方式及其应用场景总结(1.5W字)
  10. Linux的简介与虚拟机的管理